API编程:给对话框加上背景图案

 给对话框加上背景图案应该怎么做?Load一个BITMAP进来,WM_PAINT消息里面横向和竖向两个循环,BitBlt图案铺满整个对话框?其实有一个很简单的方法,初始化对话框的时候创建一个画刷:

HBITMAP bmp = LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_BITMAP));
static HBRUSH brush = CreatePatternBrush(hbm);
DeleteObject(bmp);//bmp已经没用了,释放

然后响应WM_CTLCOLORDLG消息:
case WM_CTLCOLORDLG:
   SetBkMode((HDC)wParam,TRANSPARENT);
   SetWindowLong(Wnd,DWL_MSGRESULT,(LONG)brush);
   return (LONG)brush;

一切OK,不过对话框上面的static控件的背景仍然是灰色的,因此还要响应WM_CTLCOLORSTATIC消息使其背景透明:
case WM_CTLCOLORSTATIC:
   static HBRUSH hbrushStatic = (HBRUSH)GetStockBrush(NULL_BRUSH);
   SetBkMode((HDC)wParam,TRANSPARENT);
   SetWindowLong(Wnd,DWL_MSGRESULT,(LONG)hbrushStatic);
   return (LONG)hbrushStatic;

这样就万事大吉了。

不过这个方法仅对模态对话框有效,对于非模态对话框就有点麻烦了,恩?好象一切正常,没什么麻烦嘛。你试试加个GroupBox上去,怎么样?在模态对话框表现是正常的,非模态对话框GroupBox区域却是白色的,没达到效果。这是因为系统对这两种对话框的处理是不同的。那该怎么办呢?GroupBox其实是按钮,处理WM_CTLCOLORBTN消息?很可惜,只有owner-drawn 的按钮这个消息才会有效,因此需要把GroupBox设置成自绘,然后自己画了。这就又麻烦了。不过有个变通的办法,就是创建两个非模态对话框,一个上面什么控件都不放,作为那个实际需要的对话框的父窗口,相同大小,画上背景作底,实际需要的对话框在资源编辑时需要设置其属性为透明(Extended styles->transparent打勾),上面的代码不变,然后就可以了。这是我能想到的最简便的方法了。如果有其他简单的办法,欢迎大家指正。

非模态的这个问题困扰我好久,倒不是怕麻烦写groupbox的自绘,而是奇怪为什么会这样,想看看还有什么招没有,终于试出了这个办法,写篇文字以作备忘。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值