Windows介面編程第二篇 半透明表單

來源:互聯網
上載者:User

Windows介面編程第二篇半透明表單

    上一篇《Windows介面編程第一篇 位元影像背景與位元影像畫刷》介紹了通過WM_CTLCOLORDLG訊息來來設定對話方塊的背景以及位元影像畫刷的使用。本篇將介紹動態調節表單透明度的方法。

    調節表單透明度可以先使用SetWindowLong為表單加上WS_EX_LAYERED屬性,再使用來SetLayeredWindowAttributes指定表單的透明度。這樣就可以在程式運行時動態調節表單的透明度了。

    下面先介紹下SetWindowLong和SetLayeredWindowAttributes函數。

SetWindowLong可以用來設定視窗的一些屬性,其函數原型如下:

LONGSetWindowLong(

    HWNDhWnd,

    int nIndex,

    LONGdwNewLong

);

第一個參數表示視窗控制代碼。

第二個參數代表要設定的哪一種值,如GWL_STYLE表示將設定視窗的風格,這個參數還可以取GWL_EXSTYLE,GWL_WNDPROC,DWL_DLGPROC,GWL_HINSTANCE,GWL_USERDATA等等。

第三個參數表示要設定的值。

比如要設定對話方塊也能夠可調節視窗大小,可以用:

 // 設定對話方塊大小可調節

SetWindowLong(hDlg, GWL_STYLE, GetWindowLong(hDlg, GWL_STYLE) | WS_SIZEBOX);

 

SetLayeredWindowAttributes在MSDN上解釋如下:

The SetLayeredWindowAttributes function sets the opacity and transparency color key of a layered window.

其函數原型為:

BOOLSetLayeredWindowAttributes(

    HWNDhwnd,

    COLORREFcrKey,

    BYTEbAlpha,

    DWORDdwFlags

);

第一個參數表示視窗控制代碼。

第二個參數表示透明色。

第三個參數表示透明度。

第四個參數表示函數將完成什麼樣的功能,設定成LWA_COLORKEY表示為視窗指定了透明色,設定成LWA_ALPHA表示將調整視窗的透明度,可以同時設定這兩種功能。

 

程式碼還將用到Slider控制項,這種控制項可以有如下操作:

1.通過SendMessage + TBM_SETRANGE來設定滑塊變化的範圍。

2.通過SendMessage + TBM_SETPOS來設定滑塊當前位置。

3.通過SendMessage + TBM_GETPOS來獲得滑塊當前位置。

4.當滑塊位置發生變化時,在其父視窗中通過WM_HSCROLL或WM_VSCROLL來響應訊息。

 

下面給出完整的原始碼(:http://download.csdn.net/download/morewindows/4947386)

// 可變透明度表單 先加上WS_EX_LAYERED屬性再SetLayeredWindowAttributes設定透明度//By MoreWindows-(http://blog.csdn.net/MoreWindows)#include <windows.h>#include <commctrl.h>#include "resource.h"const char szDlgTitle[] = "可變透明度表單 MoreWindows-(http://blog.csdn.net/MoreWindows)";// 對話方塊訊息處理函數BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR     lpCmdLine, int       nCmdShow){DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);return 0;}BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){const int INIT_TRANSPARENT = 200; //表單初始透明度static HBRUSH    s_hBitmapBrush; //位元影像畫刷switch (message){case WM_INITDIALOG:// 設定對話方塊標題SetWindowText(hDlg, szDlgTitle);// 載入背影圖片HBITMAP hBitmap;hBitmap = (HBITMAP)LoadImage(NULL, "005.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);if (hBitmap == NULL){MessageBox(hDlg, "LoadImage failed", "Error", MB_ICONERROR);exit(0);}// 建立位元影像畫刷s_hBitmapBrush = CreatePatternBrush(hBitmap);// 設定分層屬性SetWindowLong(hDlg, GWL_EXSTYLE, GetWindowLong(hDlg, GWL_EXSTYLE) | WS_EX_LAYERED);// 設定透明度 0 - completely transparent   255 - opaqueSetLayeredWindowAttributes(hDlg, 0, INIT_TRANSPARENT, LWA_ALPHA);// 設定滑動條變化範圍SendMessage(GetDlgItem(hDlg, IDC_SLIDER_TRANSPARENT), TBM_SETRANGE, (WPARAM)FALSE, MAKELONG(0, 255));// 設定滑塊初始位置SendMessage(GetDlgItem(hDlg, IDC_SLIDER_TRANSPARENT), TBM_SETPOS, (WPARAM)TRUE, INIT_TRANSPARENT);return 0;case WM_COMMAND:switch (LOWORD(wParam)){case IDCANCEL:DeleteObject(s_hBitmapBrush);EndDialog(hDlg, LOWORD(wParam));return TRUE;}break;case WM_HSCROLL: // slider control 滑塊位置有變化時的響應函數{// 擷取當前滑塊位置int nTransparent = SendMessage(GetDlgItem(hDlg, IDC_SLIDER_TRANSPARENT), TBM_GETPOS, 0, 0); // 設定新透明度SetLayeredWindowAttributes(hDlg, 0, nTransparent, LWA_ALPHA);}break;case WM_CTLCOLORDLG:  //對話方塊背影return (BOOL)s_hBitmapBrush;}return FALSE;}

運行結果如下:

 

在本篇文章中我們通過SetWindowLong為表單加上WS_EX_LAYERED屬性,再使用SetLayeredWindowAttributes完成表單的透明度調節。下面兩篇也將使用這兩個函數來完成另一個功能——異形視窗(異形表單)。異形視窗可以使得視窗更加美觀,它能靈活的變動視窗的形狀。歡迎繼續瀏覽《Windows介面編程 第三篇異形表單 普通版》和《Windows介面編程 第四篇異形表單 高富帥版》

 

 

本文配套程式為:hhttp://download.csdn.net/download/morewindows/4947386

轉載請標明出處,原文地址:http://blog.csdn.net/morewindows/article/details/8451632

歡迎關注微博:http://weibo.com/MoreWindows

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.