忙和了很久,學到很多東西,2007過得還算充實,2008不知道是否可以逃過劫難,常常做惡夢,希望2008快快過去半年,哪時候是好是壞都有了結果。在2007年上半年,曾經看到過Yahoo的新版本Messager的界面,非常的個性化,這類異形窗口效果是傳統窗口所無法實現的。而異形窗口的實現一般有兩種方法:1、通過SetWindowRgn 2、UpdateLayeredWindow。第一種方法很通用,但是做出的效果不是非常絢麗,由于計算機表達Rgn的局限,做出的界面時常有毛刺而影響視覺效果。UpdateLayeredWindow只實用于32位帶alpha通道的圖片,由于Windows直接拿圖片與桌面進行疊加透明處理,所以窗口邊緣的毛刺一般可通過陰影消除掉。使用UpdateLayeredWindow后的窗口將不在響應WM_PAINT消息,這是一個非常棘手的問題,解決辦法是創建一個頂層窗口用來承載子界面,將Layered窗口置于其下并控制其位置。加之之前的界面庫,引入具有這樣特性的一類窗口也不是難事。
當然我的實現思想也是采取UpdateLayeredWindow:首先創建一個32位的和窗口大小一致的位圖,然后貼png圖片,繪制窗口界面元素,最后進行窗口層更新,這樣就有了無窗口的一套界面解決方案。但是有時候,由于各種原因是需要常規Window的,所以還得把常規的窗口界面納入進來。
有了思路就開始動手改造,下載其他的軟件研究,上網學習一些相關技術。用了兩天,基本移植進來,此次用了GDIPlus,也不管tmd跨不跨平臺了。界面描述:
下面是截圖:
至于所謂的磨砂效果,其實就是blur模糊。由于UpdateLayerWindow只允許你提供一個自己的位圖,之后會自動為你進行圖片合成,合成方法無法參與,故想實現blur恐怕要大廢一番力氣,很可能要拋棄這套流出而模擬出一套。下一步工作就是創建一個頂層窗口,跟隨這個漂亮的外殼移動了。之前的界面描述機制也自然可以進來了。