成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C#實現窗體顯示背景知識

開發 后端
這里介紹C#實現窗體顯示背景知識,通知窗口就是將一般的窗體附加上一層皮膚,這里所謂的皮膚就是一張位圖圖片,該位圖圖片通過窗體的OnPaintbackground事件被繪制到窗體表面。

C#實現窗體顯示是比較常見的東東,這里就主要介紹一下C#實現窗體顯示背景知識,對常用QQ、MSN等聊天的人們給點提示。

想必大部分網友都使用過QQ、MSN等聊天程序,它們的界面都相當華麗,尤其是當網友上線以及消息提示時會有一個浮動的窗體從屏幕的右下方緩慢升起,既美觀又人性化,作為程序員在享受的同時我們也不禁要問:這到底是怎么實現的呢?本文就利用C#實現窗體顯示。
簡介

QQ和MSN的任務欄通知窗口很人性化,它可以在不丟失主窗體焦點的前提下顯示一個具備皮膚Skin的通知窗體,當它顯示一段時間后會自動消失,所以用戶根本不用干預它。這樣的通知窗體和一般的具備標題欄、系統圖標和按鈕的窗體沒有太大的區別,窗體表面其實就是畫上去的一張位圖而已,而窗體的浮動則會復雜一點,我們會用到.Net框架的雙重緩沖區繪圖技術(參見作者編譯文章"Windows 窗體的.Net框架繪圖技術")來保證移 動窗體時所顯示的內容平滑且不閃爍,以及使用P/Invoke平臺調用進行對Win32API函數的調用來完成不獲得焦點的窗體顯示和非標題欄窗體拖動。

C#實現窗體顯示背景知識

通知窗口就是將一般的窗體附加上一層皮膚,這里所謂的皮膚就是一張位圖圖片,該位圖圖片通過窗體的OnPaintbackground事件被繪制到窗體表面,在附加位圖之前需要調整窗體的可視屬性,由于繪制操作是針對于窗體客戶區域的,所謂客戶區域就是指窗體標題欄下方以及窗體邊框以內的所有區域,所以需要將窗體的邊框和外觀屬性 FormBorderStyle調整為:None,這樣所繪制的圖像就會填充整個窗體。

首先,我們會用到Region對象,Region對象可以精確的描繪出任意形狀的輪廓范圍,通過一個位圖圖像創建Region對象后再將其傳遞給窗體的Region屬性就可以使窗體按照 Region所定義的輪廓顯示出來。作為皮膚使用的位圖文件可以通過任何圖像編輯軟件諸如:Photeshop來創建和編輯,只是注意一點,需要將圖片的背景色調成特定顏色以便程序繪制時將其清除,我們在這里使用的背景色為粉紅色。為了能夠讓Region對象按照圖像中感興趣的內容邊框來創建窗體,我們還需要使用GraphicsPath類將圖像輪廓按照一定路徑標注下來,稍后便按照該路徑創建Region對象。

然后通過窗體的繪圖事件將位圖的內容顯示在窗體表面,我們沒有直接使用OnPaintbackground事件而是重載了該方法,這樣做的好處就是一些低層的繪制操作還繼續交由.Net框架運行時來處理,我們只考慮實際需要的繪制操作即可。在OnPaintbackground方法中我們啟用了雙重緩沖區繪圖技術,所謂該技術就是指先在內存中的一塊畫布上把將要顯示的圖像顯示出來或進行處理,等到操作完成再將該畫布上所顯示的圖像放置到窗體表面,這樣的機制可以非常有效的降低閃爍的出現,使圖像顯示更加平滑。通知窗體從屏幕的右下方進行升起停留一段時間后再慢慢回落,這里需要用到返回屏幕區域的大小范圍的.Net框架方法 Screen.GetWorkingArea(WorkAreaRectangle),通過一定算法計算出通知窗體顯示前的初始位置。最后,我們將要顯示的文本按照一定格式和Rectangle對象所指定的區域范圍繪制到窗體表面。通知窗體的關閉操作是通過設定一個區域,當用戶用鼠標單擊時檢測單擊坐標是否在該區域內,若在區域內就可以執行隱藏通知窗體的代碼。

我們注意了,當QQ和MSN的通知窗口顯示時其主窗體的焦點沒有丟失,也就是說程序沒有將自身的焦點轉移到顯示的通知窗體上。經過測試,我們無論怎么樣調用.Net框架提供的窗體顯示例程譬如:Form.Show都無法保證主窗體的焦點不丟失,在VC環境下我們可以使用Win32API的ShowWindows函數來完成復雜的窗體顯示操作,但是.Net框架根本沒有提供類似的方法,那么我們能否通過.Net框架調用該API函數來顯示窗體呢?幸好.Net框架提供了P/Invoke平臺調用,利用平臺調用這種服務,托管代碼就可以調用在動態鏈接庫中實現的非托管函數,并可以封送其參數,我們可以輕松的顯示但不獲得焦點的窗體。程序中用到的Windows API以及常量的定義都保存在WinUser.h頭文件中,其對應的動態鏈接庫文件就是user32.dll,使用.Net框架提供的 DllImportAttribute類對導入的函數進行定義,然后就可以非常方便的在程序中調用該函數了。

由于我們將通知窗體的標題欄隱藏了,所以對窗體拖動操作還需要我們自己動手進行處理。本文介紹了如何更加高效的進行拖動窗體操作,有些網友在對于非標題欄拖動窗體編程時偏向組合使用鼠標事件來進行,這樣做的本質沒有任何不妥,但是頻繁的事件響應和處理反而使程序性能有所降低。我們將繼續使用 Win32API的底層處理方法來解決該問題,就是向窗體發送標題欄被單擊的消息,模擬實際的拖動操作。

我們會通過2個計時器來完成窗體的顯示、停留和隱藏,通過設置速度變量可以改變C#實現窗體顯示和隱藏的速度。

【編輯推薦】

  1. C#與VB7比較詳解
  2. C#連接Access淺析
  3. C#創建XML Web services學習經驗
  4. C# Windows應用程序概述
  5. C# SmartPhone程序學習筆記
責任編輯:佚名 來源: 賽迪網
相關推薦

2009-08-26 11:07:36

C#打印窗體

2009-09-01 18:06:06

c#保存窗體狀態

2009-09-07 03:44:50

C#窗體間傳值

2009-09-07 05:24:22

C#窗體繼承

2009-08-10 14:23:39

C# Setting

2009-08-20 10:10:55

C#透明窗體

2009-09-07 05:31:39

C#窗體關閉事件

2009-08-28 15:58:54

C#窗體里調用

2009-09-07 06:31:32

C#窗體移動

2009-09-07 04:19:56

C#窗體事件

2009-09-07 06:48:13

C#透明窗體

2009-08-13 10:42:31

C#窗體拖動事件

2009-09-07 06:07:46

C#窗體設計

2009-07-31 18:28:46

實現C#顯示圖像

2009-08-25 11:10:20

C#編程實現顯示XML

2009-09-07 04:56:52

C#模式窗體

2009-09-07 05:10:52

C#模式窗體

2009-09-08 15:12:07

C# ListBox

2009-09-03 09:44:02

DropDownLisC#遞歸

2009-11-10 15:07:11

VB.NET窗體
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美成人一区二区 | 99国产精品久久久 | 欧美激情一区二区三区 | 国产精品亚洲欧美日韩一区在线 | 欧美xxxx色视频在线观看免费 | 亚洲精品大全 | 国产黄色小视频在线观看 | 黄色片在线免费看 | caoporn国产精品免费公开 | 欧美精品国产一区二区 | 91高清在线| 中文字幕在线免费观看 | 色天天综合 | 国产91 在线播放 | 毛片在线免费播放 | 四虎影院欧美 | 9久9久9久女女女九九九一九 | www.一区二区 | 成人在线一区二区 | 欧美一区二区三 | 麻豆av网站 | 99国产精品久久久 | 久草综合在线视频 | 免费成人高清在线视频 | 人人做人人澡人人爽欧美 | 亚洲精品乱码久久久久久按摩观 | 中文字幕在线视频精品 | 成人欧美一区二区三区白人 | 午夜精品影院 | 91极品尤物在线播放国产 | 黄色在线观看 | 国产精品一区二区三区久久久 | 欧美福利专区 | 久草青青草 | 亚洲欧洲激情 | 欧美在线一区二区三区 | 男女午夜免费视频 | 亚洲成人精品在线 | 欧美区在线 | 成人午夜 | 一级特黄在线 |