大夢想家

          5年開發(fā)工程師,2年實(shí)施經(jīng)理,X年售前顧問,......
          數(shù)據(jù)加載中……
          在java程序中利用swt實(shí)現(xiàn)窗口始終最前以及透明窗口

          從win2000開始,windows提供了一個(gè)新的api SetLayeredWindowAttributes,可以輕松實(shí)現(xiàn)透明窗口,在網(wǎng)上有許多vb,vc,delphi的示例程序,下面我來介紹一下如何使用swt來實(shí)現(xiàn)這一效果:

          BOOL SetLayeredWindowAttributes(
          HWND hwnd, // handle to the layered window
          COLORREF crKey, // specifies the color key
          BYTE bAlpha, // value for the blend function
          DWORD dwFlags // action
          );

          Windows NT/2000/XP: Included in Windows 2000 and later.
          Windows 95/98/Me: Unsupported.
          Header: Declared in Winuser.h; include Windows.h.
          Library: Use User32.lib.

          一些常量:
          WS_EX_LAYERED = 0x80000;
          LWA_ALPHA = 0x2;
          LWA_COLORKEY=0x1
          其中dwFlags有LWA_ALPHA和LWA_COLORKEY
          LWA_ALPHA被設(shè)置的話,通過bAlpha決定透明度.
          LWA_COLORKEY被設(shè)置的話,則指定被透明掉的顏色為crKey,其他顏色則正常顯示.
          注:要使使窗體擁有透明效果,首先要有WS_EX_LAYERED擴(kuò)展屬性(舊sdk也沒有的).
          上面是該函數(shù)的資料,下面是一段代碼示例:

          代碼

          1. display = new Display();  
          2. shell = new Shell(display , SWT.NULL);  
          3. shell.setMaximized(false);  
          4. shell.setBackground(display.getSystemColor(SWT.COLOR_BLACK));  
          5. shell.setText("Example");  
          6. shell.setBounds(0 , 700 , 1024 , 68);  
          7. //始終最前
          8. OS.SetWindowPos(shell.handle , OS.HWND_TOPMOST, 0 , 700 , 1024 , 68 , SWT.NULL);  
          9. //透明窗體
          10. OS.SetWindowLong(shell.handle , OS.GWL_EXSTYLE , OS.GetWindowLong(shell.handle , OS.GWL_EXSTYLE)^0x80000);  
          11. TCHAR lpLibFileName = new TCHAR (0, "User32.dll", true);   
          12. int hInst = OS.LoadLibrary(lpLibFileName);   
          13. if(hInst != 0) {   
          14.     String name = "SetLayeredWindowAttributes\0";   
          15. byte [] lpProcName = new byte [name.length ()];  
          16. for (int i=0; i<lpProcName.length; i++) {  
          17.         lpProcName [i] = (byte) name.charAt (i);  
          18.     }  
          19. int fun = OS.GetProcAddress(hInst , lpProcName);  
          20. if (fun != 0) {  
          21.         OS.CallWindowProc(fun , shell.handle , 0,50,1);  
          22.     }  
          23.     OS.FreeLibrary(hInst);  
          24. }  

          里面用到的幾個(gè)類都在org.eclipse.swt.internal.win32下,相信大家看到上面的代碼就都清楚該如何做了,我也就不多羅嗦了.



          客戶虐我千百遍,我待客戶如初戀!

          posted on 2007-12-25 14:32 阿南 閱讀(753) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 萝北县| 大方县| 清河县| 六枝特区| 独山县| 朝阳市| 呼伦贝尔市| 吉安市| 建平县| 荥经县| 宿迁市| 蓬莱市| 迭部县| 衢州市| 万安县| 巴彦淖尔市| 横峰县| 丰顺县| 新化县| 琼海市| 柞水县| 城口县| 长沙县| 永安市| 乐亭县| 永德县| 夏津县| 霍林郭勒市| 白朗县| 桑植县| 丽水市| 罗甸县| 乳山市| 德化县| 凤翔县| 江都市| 汨罗市| 屯留县| 井冈山市| 浦县| 本溪|