在看对话框之前,还是觉得有必要先看一下子窗口控件,很多对话框的知识点都涉及到子窗口控件。
正好看到学长的一篇实现窗口透明化的文章,对它比较感兴趣,于是就想拿这个例子来练练手
首先先介绍下窗口透明化的实现:
首先是下面这个函数
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的地方将变为透明。
以上这些就是有关窗口透明度实现的方法了,好,现在我结合子窗口控件来具体实现它。代码如下:
#include <windows.h> #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) ; }
接下来的任务我打算在看完对话框之后再用对话框实现窗口透明的效果,增加滚动条的实现,鼠标的实现,更好地理解和学习对话框
我是一个新手,希望大家能帮我指出错误我好加以改正,谢谢~~