Win32API不规则窗口制作
一、前述
也許您在其他軟件中經常看到下面這樣的界面,除了感嘆視覺設計的絢麗外,也注意到了和其他軟件的不同,窗口不是正規的正方形。這就是傳說中的非規則窗體,也叫多邊形窗口、不規則窗體(=。=名字夠俗的)
?
最初找這方面的資料,學習制作一個類似程序,結果發現很多資料都是說的不是很明白,或者是UI控件之類的東東,有一些范例程序還都運行不起來,經過一番折騰,發現一個共同特點,大都是MFC,對MFC印象不是很好,”雖然 MFC 非常強大,但它也有很多缺點,比如它只是 Win32 API 外的一層薄薄的面板,并且對于很多程序員來說,它太過復雜,很難有效地使用。——MSDN”,另外編譯出來的東西太臃腫了,一個普通的程序就要1M,事實上,我們僅僅用到了不到200K的部分。
本文中將教會您如何使用Win32 API來創建一個不規則窗體結構,以及附加漂亮的皮膚效果。
二、實現方式
在本文中將以SetWindowRgn創建一個不規則的窗口。
關于SetWindowRgn,在很多教程中都有提到,但是有一個共同特點就是作者們喜歡使用一個矩形或者圓形來創造一個不規則的窗體,也許您讀完那些代碼,但是卻不能找到結果,難道每一個部分都要自己拼么?本文中通過顏色加上SetWindowRgn來解決您的問題,期望您讀完有所收獲,這正是我所希望的:)。
三、具體實施
1. 準備2張圖像
這兩張圖像分別為mask.bmp和shik.bmp,
mask.bmp :鏤空的蒙板文件,一般來講這個圖像是由2個顏色組成的,您需要指定一個顏色來判斷那些部分是需要去掉的,而另外一個則是保留的部分。
skin.bmp :皮膚文件,這個文件將會蓋住留下的區域讓這個窗體呈現需要的效果。
圖像格式您可以使用任何可以讀取的圖像格式,若您對這2張圖像的制作仍然存有疑問,您可以學習一下PhotoShop類似的軟件,或者咨詢一下視覺設計師。
?
2. 創建一個程序
?
為了方便學習起見,我們并不推薦您創建一個空工程從頭作起,直接創建一個win32項目的實例還是比較好的。
3. 添加需要的變量
?
關于命名的方式,這取決您的習慣,在這里沒有使用指針,清爽的編碼較容易學習,也許您可以更好的組織代碼,但這并不是本文所關心的事情:)
4. 讀取皮膚和蒙板
?
這部分的代碼添加位置在顯示窗口之前。
通過LoadImage加載bmp圖像,也許您有更好的讀取圖像的方法,但值得注意的是蒙板文件一定要使用沒有損傷的單色圖像格式,這對顏色判斷非常有用,例如bmp、gif等,在這里我們使用了的是一個bmp的圖片。
5. 最后的準備
?
寫上一些應用變量,在代碼我已經寫好了注釋。
6. 具體實現代碼片斷
?
實現方式為,判斷蒙板圖像的每一個點,如果這個點是需要鏤空的顏色,那么就將它創建成為一個RNG(多邊形),并且使用CombineRgn組合到整合的多邊形中,最后使用SetWindowRgn來設置整合多邊形為窗口區域。
在這里值得一提,這部分還可以優化,您知道,一般來講鏤空的都是一個區域而不是一個點,那么,我們或許可以做一點什么東西就可以讓程序少執行幾次CombineRgn^_^
7. show一下效果
?
這就是依據蒙板創建出來的特殊窗口,上圖的效果為用鼠標拖動時候的效果,您會發現:
?標題欄是存在的
?菜單欄也是存在的
?窗口的大小仍然存在問題
下一步來解決這個問題
8. 解決上面的問題
第一步,移動創建窗口代碼片斷到實際實現代碼的下面,讓我們先將鏤空區域設定好
?
第二步,修改CreateWindow特定參數,請閱讀注釋說明
?
?
第三步,將窗口的菜單參數設置為空,這樣就可以去掉了菜單欄
?
最終效果:
?
現在可以看到這個窗口已經變成了我們需要的樣子,下面就要為它畫上皮膚,值得注意的是,此時,您需要使用alt+F4來關閉窗口。
9. 為窗口畫上圖像
添加如下代碼到WM_PAINT消息處理中
?
繪制的代碼位置您可以自定,例如您自己的循環邏輯上,現在只是將圖片顯示到窗體的hdc上而已。
10. 運行一下效果看看
?
哈哈,我們得到了一個漂亮的圖像,簡直和真正的手機一樣懸浮在您的桌面上面,好了,從現在開始您可以套用上面的方法,為自己開發開發一個特別效果的界面。
11. 如何拖動
您或許已經發現了仍然存在的重大問題,就是這個窗口沒有標題欄,怎么才能拖動呢,總不能讓它永遠放在一個地方,那么我們下面就來解決這個問題。
解決的方法并不難,請在參照下面的代碼,添加WM_LBUTTONDOWN消息,并增加一行SendMessage函數。
?
作用為,當點擊鼠標左建時發送一個使Windows認為鼠標在窗口標題上WM_NCHITTEST消息給窗口,窗口處理WM_NCHITTEST來解決移動問題。
您可以在WM_LBUTTONDOWN作一些判斷,這樣,程序會依據您的設定才可以移動——例如指定一個被點擊區域才可以移動的if
12. 完成
好了,您可以運行一下程序,并且到處拖動一下,怎么樣?不錯吧,其實花里胡哨的軟件界面制作就是這么簡單。
?點擊下載例子文件
?
本文出自 “十五英寸的世界” 博客,請務必保留此出處http://nowpaper.blog.51cto.com/3893223/712620
轉載于:https://www.cnblogs.com/xieyuan/archive/2012/12/14/3787439.html
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的Win32API不规则窗口制作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【项目总结】达能益力--官网
- 下一篇: WinFormsChartSamples