WM_CTLCOLORDLG消息

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

 为什么???


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值