windowsSDK利用子窗口控件设置窗口透明
在看对话框之前,还是觉得有必要先看一下子窗口控件,很多对话框的知识点都涉及到子窗口控件。
正好看到学长的一篇实现窗口透明化的文章,对它比较感兴趣,于是就想拿这个例子来练练手
首先先介绍下窗口透明化的实现:
首先是下面这个函数
LONG SetWindowLong(HWND hWnd,int nlndex,LONG dwNewLong);
SetWindowLong该函数改变指定窗口的属性.函数也将指定的一个32位值设置在窗口的额外存储空间的指定偏移位置。
SetWindowLong(hwnd,GWL_EXSTYLE,WS_EX_LAYERED);
上面这条代码扩展了一种窗口风格,其中GWL_EXSTYLE设定一个新的扩展风格。
接下来我们就可以使用下面这个函数来实现窗口的透明化:
BOOL SetLayeredWindowAttributes(
HWND hwnd, // handle to the layered window 透明窗体的句柄
COLORREF crKey, // specifies the color key 颜色值
BYTE bAlpha, // value for the blend function 透明度,取值范围是[0,255]
DWORD dwFlags // action 透明方式,可以取两个值:
);
当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效;
当取值为LWA_COLORKEY时,bAlpha参数有效,而窗体中的所有颜色为crKey的地方将变为透明。
其中dwFlags有LWA_ALPHA(值为2)和LWA_COLORKEY(值为1)两种设置,如果LWA_ALPHA被设置的话,通过bAlpha参数指定窗体的透明度;如果LWA_COLORKEY标志被设置的话,则指定关键色为crKey,该颜色所覆盖的区域将从窗体去除,去除后的区域将不再进行点击检测,其他颜色则正常显示。如果阿尔法混合值设置为0,其窗口区域同样不进行点击检测。
以上这些就是有关窗口透明度实现的方法了,好,现在我结合子窗口控件来具体实现它。代码如下:
#define ID_EDIT 1 //定义编辑框ID
#define ID_BUTTON 2 //定义确定按钮ID
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT (“HelloWin”) ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT (“This program requires Windows NT!”),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szAppName,
TEXT (“The Hello Program”),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL) ;
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HWND hwndEdit ;
static HWND hwndButton ;
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
TCHAR str[20];
int i;
switch (message)
{
case WM_CREATE:
//产生子窗口控件:编辑框
hwndEdit = CreateWindow (TEXT (“edit”), NULL,
WS_CHILD | WS_VISIBLE |
WS_BORDER | ES_LEFT |
ES_AUTOHSCROLL | ES_AUTOVSCROLL,
0, 0, 0, 0, hwnd, (HMENU) ID_EDIT,
((LPCREATESTRUCT) lParam) -> hInstance, NULL) ;
//产生子窗口控件:按钮
hwndButton = CreateWindow(TEXT(“button”),
TEXT(“确定”),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
100,50,
50,20,
hwnd,(HMENU) ID_BUTTON,
((LPCREATESTRUCT) lParam) -> hInstance, NULL);
//增加窗口样式
SetWindowLong(hwnd,GWL_EXSTYLE,WS_EX_LAYERED);
//设置窗口透明度
SetLayeredWindowAttributes(hwnd, RGB(255,255,255), 255, LWA_ALPHA);
return 0 ;
case WM_SETFOCUS :
SetFocus (hwndEdit) ; //设置输入焦点
return 0 ;
case WM_SIZE : //创建文本框窗口大小
MoveWindow (hwndEdit, 0, 0, LOWORD (lParam)/4, HIWORD (lParam)/16, TRUE) ;
return 0 ;
case WM_COMMAND :
switch (LOWORD (wParam))
case ID_BUTTON: //将从编辑框获得的数值应用到窗口透明度里面去
{
GetDlgItemText(hwnd, ID_EDIT, str, sizeof(str)/sizeof(TCHAR));
i = _wtoi(str);
SetLayeredWindowAttributes(hwnd, RGB(255,255,255), i, LWA_ALPHA);
}
return 0;
return 0;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
在编辑框里输入0-255的任意数字,点击确定,窗口就能实现透明化的设置了。
接下来的任务我打算在看完对话框之后再用对话框实现窗口透明的效果,增加滚动条的实现,鼠标的实现,更好地理解和学习对话框
我是一个新手,希望大家能帮我指出错误我好加以改正,谢谢~~