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