大夢想家

          5年開發工程師,2年實施經理,X年售前顧問,......
          數據加載中……
          在java程序中利用swt實現窗口始終最前以及透明窗口

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

          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被設置的話,通過bAlpha決定透明度.
          LWA_COLORKEY被設置的話,則指定被透明掉的顏色為crKey,其他顏色則正常顯示.
          注:要使使窗體擁有透明效果,首先要有WS_EX_LAYERED擴展屬性(舊sdk也沒有的).
          上面是該函數的資料,下面是一段代碼示例:

          代碼

          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. }  

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



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

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


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


          網站導航:
           
          主站蜘蛛池模板: 都匀市| 华池县| 密云县| 安丘市| 昌江| 商南县| 土默特右旗| 台南市| 汶上县| 兰州市| 扶风县| 思茅市| 名山县| 紫云| 舟曲县| 吴桥县| 高阳县| 大宁县| 泽州县| 尚义县| 昌宁县| 上虞市| 慈溪市| 彰化市| 色达县| 石台县| 特克斯县| 两当县| 双辽市| 敦煌市| 郯城县| 山阳县| 吉林市| 理塘县| 新竹县| 香港 | 义马市| 台东市| 大余县| 兴义市| 布尔津县|