WM_CTLCOLORDLG消息

来源:互联网 发布:php网页免费游戏源码 编辑:程序博客网 时间:2024/06/11 18:46

WM_CTLCOLORDLG  在系统重绘对话框之前产生该消息。如果未处理该消息,返回FALSE;否则返回一个刷子句柄。

wParam  对话框的HDC,该hdc只在无效区绘制。
lParam 对话框HWND。

看了这篇文章,有些疑惑   http://blog.csdn.net/morewindows/article/details/8451629


BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){const int INIT_TRANSPARENT = 200; //窗体初始透明度static HDC    s_hdcMem; static ints_nHeight, s_nWidth;static BITMAPs_bmp;HDC hdc ;RECTrc;switch (message){case WM_SIZE:InvalidateRect(hDlg, NULL, TRUE); ///////////////////TRUE 换成FALSE为什么不行?return 0;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);}GetObject(hBitmap, sizeof(BITMAP), &s_bmp);hdc = GetDC(hDlg);s_hdcMem = CreateCompatibleDC(hdc);SelectObject(s_hdcMem, hBitmap);ReleaseDC(hDlg,hdc);SetWindowLong(hDlg, GWL_EXSTYLE, GetWindowLong(hDlg, GWL_EXSTYLE) | WS_EX_LAYERED);SetWindowLong(hDlg, GWL_STYLE, GetWindowLong(hDlg, GWL_STYLE) | WS_SIZEBOX);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);case WM_COMMAND:switch (LOWORD(wParam)){case IDCANCEL:EndDialog(hDlg, LOWORD(wParam));return TRUE;}break;case WM_HSCROLL: {int nTransparent = SendMessage(GetDlgItem(hDlg, IDC_SLIDER_TRANSPARENT), TBM_GETPOS, 0, 0);SetLayeredWindowAttributes(hDlg, 0, nTransparent, LWA_ALPHA);}break;case WM_CTLCOLORDLG:GetClientRect(hDlg, &rc);hdc = (HDC)wParam;   // 只能在有效区绘制//hdc = GetDC(hDlg); // 可以整个客户区绘制StretchBlt( hdc , 0, 0, rc.right, rc.bottom,s_hdcMem, 0, 0, s_bmp.bmWidth, s_bmp.bmHeight, SRCCOPY); //ReleaseDC(hDlg, hdc);return (BOOL)(HBRUSH)GetStockObject(NULL_BRUSH);}return FALSE;}

只看这两个消息: WM_SIZE   WM_CTLCOLORDLG

对话框改变大小,必然有WM_SIZE消息,但是未必有WM_CTLCOLORDLG;

只有对话框变大时,才有WM_CTLCOLORDLG,变小时没有该消息是因为变小不需要重绘对话框客户区。


疑惑:WM_CTLCOLORDLG的wparam参数是不是 无效区的HDC?如果是,为什么用了InvalidateRect还是不能用此hdc绘制?


WM_SIZE消息中

 InvalidateRect(hDlg, NULL, TRUE): 改变对话框大小,收到 SIZE     PAINT     CTLCOLORDLG

 InvalidateRect(hDlg, NULL, FALSE): 改变对话框大小,收到 CTLCOLORDLG     SIZE     PAINT

 为什么???