1. 程式人生 > >Windows介面程式設計第二篇半透明窗體

Windows介面程式設計第二篇半透明窗體

上一篇《Windows介面程式設計第一篇 點陣圖背景與點陣圖畫刷》介紹了通過WM_CTLCOLORDLG訊息來來設定對話方塊的背景以及點陣圖畫刷的使用。本篇將介紹動態調節窗體透明度的方法。

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

    下面先介紹下SetWindowLongSetLayeredWindowAttributes函式。

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

LONG

SetWindowLong(

    HWNDhWnd,

    int nIndex,

    LONGdwNewLong

);

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

第二個引數代表要設定的哪一種值,如GWL_STYLE表示將設定視窗的風格,這個引數還可以取GWL_EXSTYLEGWL_WNDPROCDWL_DLGPROCGWL_HINSTANCEGWL_USERDATA等等。

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

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

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

SetWindowLong(hDlg, GWL_STYLE, GetWindowLong(hDlg, GWL_STYLE

) | WS_SIZEBOX);

SetLayeredWindowAttributesMSDN上解釋如下:

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_HSCROLLWM_VSCROLL來響應訊息。

[cpp] view plaincopyprint?
  1. // 可變透明度窗體 先加上WS_EX_LAYERED屬性再SetLayeredWindowAttributes設定透明度
  2. //By MoreWindows-(http://blog.csdn.net/MoreWindows)
  3. #include <windows.h>
  4. #include <commctrl.h>
  5. #include "resource.h"
  6. constchar szDlgTitle[] = "可變透明度窗體 MoreWindows-(http://blog.csdn.net/MoreWindows)";  
  7. // 對話方塊訊息處理函式
  8. BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);  
  9. int APIENTRY WinMain(HINSTANCE hInstance,  
  10. HINSTANCE hPrevInstance,  
  11. LPSTR     lpCmdLine,  
  12. int       nCmdShow)  
  13. {  
  14.     DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);  
  15. return 0;  
  16. }  
  17. BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)  
  18. {  
  19. constint INIT_TRANSPARENT = 200; //窗體初始透明度
  20. staticHBRUSH    s_hBitmapBrush; //點陣圖畫刷
  21. switch (message)  
  22.     {  
  23. case WM_INITDIALOG:  
  24. // 設定對話方塊標題
  25.         SetWindowText(hDlg, szDlgTitle);  
  26. // 載入背影圖片
  27. HBITMAP hBitmap;  
  28.         hBitmap = (HBITMAP)LoadImage(NULL, "005.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);  
  29. if (hBitmap == NULL)  
  30.         {  
  31.             MessageBox(hDlg, "LoadImage failed""Error", MB_ICONERROR);  
  32.             exit(0);  
  33.         }         
  34. // 建立點陣圖畫刷
  35.         s_hBitmapBrush = CreatePatternBrush(hBitmap);  
  36. // 設定分層屬性
  37.         SetWindowLong(hDlg, GWL_EXSTYLE, GetWindowLong(hDlg, GWL_EXSTYLE) | WS_EX_LAYERED);  
  38. // 設定透明度 0 - completely transparent   255 - opaque
  39.         SetLayeredWindowAttributes(hDlg, 0, INIT_TRANSPARENT, LWA_ALPHA);  
  40. // 設定滑動條變化範圍
  41.         SendMessage(GetDlgItem(hDlg, IDC_SLIDER_TRANSPARENT), TBM_SETRANGE, (WPARAM)FALSE, MAKELONG(0, 255));  
  42. // 設定滑塊初始位置
  43.         SendMessage(GetDlgItem(hDlg, IDC_SLIDER_TRANSPARENT), TBM_SETPOS, (WPARAM)TRUE, INIT_TRANSPARENT);  
  44. return 0;  
  45. case WM_COMMAND:  
  46. switch (LOWORD(wParam))  
  47.         {  
  48. case IDCANCEL:  
  49.             DeleteObject(s_hBitmapBrush);  
  50.             EndDialog(hDlg, LOWORD(wParam));  
  51. return TRUE;  
  52.         }  
  53. break;  
  54. case WM_HSCROLL: // slider control 滑塊位置有變化時的響應函式
  55.         {  
  56. // 獲取當前滑塊位置
  57. int nTransparent = SendMessage(GetDlgItem(hDlg, IDC_SLIDER_TRANSPARENT), TBM_GETPOS, 0, 0);   
  58. // 設定新透明度
  59.             SetLayeredWindowAttributes(hDlg, 0, nTransparent, LWA_ALPHA);  
  60.         }  
  61. break;  
  62. case WM_CTLCOLORDLG:  //對話方塊背影
  63. return (BOOL)s_hBitmapBrush;  
  64.     }  
  65. return FALSE;  
  66. }  
// 可變透明度窗體 先加上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 - opaque
		SetLayeredWindowAttributes(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介面程式設計 第四篇異形窗體 高富帥版