Windows介面程式設計第二篇半透明窗體
調節窗體透明度可以先使用SetWindowLong為窗體加上WS_EX_LAYERED屬性,再使用來SetLayeredWindowAttributes指定窗體的透明度。這樣就可以在程式執行時動態的調節窗體的透明度了。
下面先介紹下SetWindowLong和SetLayeredWindowAttributes函式。
SetWindowLong可以用來設定視窗的一些屬性,其函式原型如下:
LONG
HWNDhWnd,
int nIndex,
LONGdwNewLong
);
第一個引數表示視窗控制代碼。
第二個引數代表要設定的哪一種值,如GWL_STYLE表示將設定視窗的風格,這個引數還可以取GWL_EXSTYLE,GWL_WNDPROC,DWL_DLGPROC,GWL_HINSTANCE,GWL_USERDATA等等。
第三個引數表示要設定的值。
比如要設定對話方塊也能夠可調節視窗大小,可以用:
// 設定對話方塊大小可調節
SetWindowLong(hDlg,
GWL_STYLE,
GetWindowLong(hDlg,
GWL_STYLE
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來響應訊息。
[cpp] view plaincopyprint?- // 可變透明度窗體 先加上WS_EX_LAYERED屬性再SetLayeredWindowAttributes設定透明度
- //By MoreWindows-(http://blog.csdn.net/MoreWindows)
- #include <windows.h>
- #include <commctrl.h>
- #include "resource.h"
- constchar 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)
- {
- constint INIT_TRANSPARENT = 200; //窗體初始透明度
- staticHBRUSH 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;
- }
// 可變透明度窗體 先加上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介面程式設計 第四篇異形窗體 高富帥版》