as3-AIR在win7下實現磨砂窗體


  很多學習AIR的同學都知道,這個幾乎是不可能的,因為AIR有限的能力,還不能達到那種效果。

  我曾今也單純地以為,只要通過AS3的模糊濾鏡,就能達到窗體磨砂的效果,答案是不行的,顯然沒那么簡單,否則為啥市面上那么多AIR怎么就沒有實現窗體磨砂的案例呢。如果單純地通過AS3的模糊濾鏡,可以實現舞台內部磨砂窗體,如果只是做子窗體效果,那也挺推薦用的。但現在要做的是頂級窗體的磨砂效果。

  我曾今用C++成功實現過windows7下的磨砂,那是系統的窗體,通過createWindow()創建出來的,然后調用了微軟在Vista版本以上系統才有的DWM庫,該庫可以讓開發者輕松實現磨砂窗體,這里也不再贅述,詳情請看牛人的文章http://blog.csdn.net/ntwilford/article/details/5656633

  其實實現窗體磨砂並不難,難的是如何把這個技術用在AIR上面,其實這個也不怎么難,最難的是如何把AIR窗體的HWND句柄傳給DLL,下面聽我一步步道來。

  先說如何把這個技術用在AIR上面,答案就是ANE,ANE是ADOBE為AIR開發的一個本地代碼擴展功能,可以使用的語言有C/C++或者JAVA,如果是做windows應用開發的,那建議用C/C++(還有MAC OS 開發objective-c),如果做android應用開發的,那就用JAVA。本文用的C++,開發環境是VS2012(其實VS版本沒啥關系,因為就使用VC庫而已),系統是windows7旗艦版。這里需要注意的是,磨砂窗體需要Vista及以上的系統內核才支持的,否則會提示缺少DLL,就算有了DLL,也會出不來效果。還有就是需要主題開啟Aero效果,這是廢話?有些開發者為了使系統達到一定的開發效率,就把Aero關掉了,現在開啟吧。本人的是台式機,Aero效果無壓力。

  廢話不多說了,看代碼:

 1 package
 2 {
 3     import flash.display.NativeWindow;
 4     import flash.external.ExtensionContext;
 5     /**
 6      * 
 7      * @author RockyF
 8      * 磨砂窗體類,首先必須通過bindWindow來綁定一個窗體(為了提高效率,采用了先綁定的方案)
 9      */    
10     public class BlurWindow
11     {
12         private var context:ExtensionContext;
13         public function BlurWindow()
14         {
15             context = ExtensionContext.createExtensionContext("BlurWindow","");
16         }
17         
18         /**
19          * 綁定窗體句柄,以提高效率
20          * @param window 要應用磨砂窗體的NativeWindow對象
21          * @return 
22          * 
23          */        
24         public function bindWindow(window:NativeWindow):Boolean{
25             var titleOld:String = window.title;
26             
27             var titleNew:String = "";
28             
29             var chars:String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
30             for(var i:int = 0; i < 20; i++){
31                 titleNew += chars.charAt(int(Math.random() * 26));
32             }
33             window.title = titleNew;
34             
35             var result:Boolean = Boolean(context.call("bindWindow", titleNew));
36             
37             window.title = titleOld;
38                 
39             return result;
40         }
41         
42         /**
43          * 你無需傳入窗體的句柄,只需要提供要應用磨砂窗體的NativeWindow對象
44          * 
45          * @param padding    該磨砂窗體的內邊距,這個參數在設置窗體陰影的時候很重要
46          * @param radius        磨砂窗體的圓角半徑
47          * @return 返回結果該系統是否支持磨砂窗體
48          * 
49          */        
50         public function apply(padding:int, radius:int):void{
51             context.call("apply", padding, padding, padding, padding, radius, radius)
52         }
53         
54         /**
55          * 你無需傳入窗體的句柄,只需要提供要應用磨砂窗體的NativeWindow對象
56          * 
57          * @param padding    該磨砂窗體的內邊距,這個參數在設置窗體陰影的時候很重要
58          * @param radius        磨砂窗體的圓角半徑
59          * @return 返回結果該系統是否支持磨砂窗體
60          * 
61          */        
62         public function applyAdvance(paddingLeft:int, paddingTop:int, paddingRight:int, paddingBottom:int, radiusX:int, radiusY:int):void{
63             context.call("apply", paddingLeft, paddingTop, paddingRight, paddingBottom, radiusX, radiusY);
64         }
65         /**
66          * 判斷該系統是否支持磨砂窗體
67          * @return 返回結果該系統是否支持磨砂窗體
68          * 
69          */        
70         public function isSupported():Boolean{
71             var ispt:Boolean = Boolean(context.call("isSupported"));
72             return ispt;
73         }
74     }
75 }

 

  該類提供了四個方法和一個構造方法,構造方法是要的,通過構造方法創建一個上下文環境context, 以后對DLL的調用都會通過這個context(具體了解ANE,可以查看ADOBE官方文檔,這里不再贅述了)。

  在new了這個類之后,需要綁定一個AIR窗體,為啥要綁定?我也是通過很多地試驗得出的結論,每次都要獲取AIR窗體的句柄,何不就獲取一次,然后保留在DLL中呢,這樣的話,每次apply一次窗體,都不會做同樣的事了。

  看到這里,有人就要問了,這么多廢話,那個AIR窗體的句柄到底怎么傳遞給DLL啊?

  記得我在論壇回復道:拐幾個彎就行了。我猜那位兄弟是理解了我的話,然后,他就動用了WIN 32 api大軍,從進程到模塊,都用了遍,最后還是得不到句柄。

  現在就公布答案:WIN 32 API那么多,何愁得不到一個窗體的句柄。其實,在BlurWindow這個類中,就可以看到如何傳遞句柄了,我就是用了窗體的title屬性,很容易聯想到吧,在c++端就是接收了這個title,然后通過FindWindow()來獲得句柄的。然而,又有人要問,那如果有同名的窗體,那怎么辦?看代碼中,我拐了一個彎:我先把原窗體的title存下來,然后用一個隨機的20個字母的字符串來覆蓋掉,可想而知,隨機的20個字母組成的字符串,要碰到相同的title,那幾率是多少,很小很小,所以我忽略不計了。如果你要還是擔心會重名,那建議你用MD5好了。

  好了,關鍵的技術點我已經放出來,有意向的同學就可以開始動手了。

  要是懶得動啊,那下載源碼好了。源碼中的效果圖:

  

  轉載請注明:http://www.cnblogs.com/rockyf/archive/2013/03/11/AIR_Win7_BlurWindow.html

  源碼下載:

    BlurWindow.zip flash pro版

    BlurWindow.zip flash builder版

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM