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 int s_nHeight, s_nWidth;
static BITMAP s_bmp;
HDC hdc ;
RECT rc;
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
为什么???