Windows界面编程第一篇 位图背景与位图画刷
来源:互联网 发布:炉石传说大数据生存 编辑:程序博客网 时间:2024/05/07 02:29
Windows界面编程第一篇 位图背景与位图画刷
可以通过WM_CTLCOLORDLG消息来设置对话框的背景,MSDN上对这个消息的说明如下:
The WM_CTLCOLORDLG message is sent to a dialog box before the system draws the dialog box. By responding to this message, the dialog box can set its text and background colors using the specified display device context handle.
当窗口消息响应函数接收这个消息时,wParam表示对话框的设备上下方即HDC,lParam表示对话框的句柄。如果程序处理了这个消息,应返回一个画刷。系统将会用这个画刷来重绘对话框背景。
因此我们在这个WM_CTLCOLORDLG消息中得到对话框的大小,并通过StretchBlt函数将位图缩放后贴到对话框的HDC中就完成了对话框背景的设置,然后返回一个空画刷给系统,这样系统就不会将位图背景给覆盖了。
代码非常简单,要注意的是在使用StretchBlt函数缩放位图时,最好先使用
SetStretchBltMode函数来设置下位图内容伸展模式,这样可以避免缩放后位图失真严重。SetStretchBltMode函数原型如下:
int SetStretchBltMode(
HDChdc, // handle to DC
int iStretchMode // bitmap stretching mode
);
第一个参数就是设备上下方即HDC。
第二个参数有四种设置:
1. BLACKONWHITE or STRETCH_ANDSCANS
如果两个或多个像素得合并成一个像素,那么StretchBlt会对像素执行一个逻辑AND运算。这样的结果是只有全部的原始像素是白色时该像素才为白色,其实际意义是黑色像素控制了白色像素。这适用于白色背景中主要是黑色的单色点阵图。
2. WHITEONBLACK or STRETCH_ORSCANS
如果两个或多个像素得合并成一个像素,那么StretchBlt会对像素执行逻辑OR运算。这样的结果是只有全部的原始像素都是黑色时该像素才为黑色,也就是说由白色像素决定颜色。这适用于黑色背景中主要是白色的单色点阵图。
3. COLORONCOLOR or STRETCH_DELETESCANS
简单地消除图素行或列,而没有任何逻辑组合。这是通常是处理彩色点阵图的最佳方法。
4. HALFTONE or STRETCH_HALFTONE
根据组合起来的来源颜色来计算目的的平均颜色。
其它技术细节可以见代码中的注释,完整代码如下(也可以下载,下载地址为:http://download.csdn.net/download/morewindows/4947377):
运行结果如下:
在上面这种方法中,我们是在WM_CTLCOLORDLG中贴图来完成背景设置了,也可以创建一个位图画刷,然后在WM_CTLCOLORDLG消息中直接返回这个画刷,这样系统将完成贴图功能。
位图画刷的创建函数为CreatePatternBrush,其函数原型如下:
HBRUSHCreatePatternBrush(
HBITMAPhbmp // handle to bitmap
);
只要给这个函数传入位图句柄即可,完整代码如下(下载地址为:http://download.csdn.net/download/morewindows/4947377):
运行结果如下:
注意,这两做法在窗口大小超过位图大小时会表现不同,前一种做法会拉伸位图以适应窗口大小,后一种做法是直接平铺。详见下图:
本篇《Windows界面编程第一篇位图背景与位图画刷》主要介绍了通过WM_CTLCOLORDLG消息来设置对话框的背景,在Windows系统中还有类似于WM_CTLCOLORDLG消息的还有WM_CTLCOLORBTN,WM_CTLCOLOREDIT,WM_CTLCOLORLISTBOX,WM_CTLCOLORSCROLLBAR,WM_CTLCOLORSTATIC这五种来分别管理按钮,编辑框,列表框,滚动条,静态框。有兴趣的读者可以试验下。
下一篇将介绍调节窗体透明度的方法,欢迎继续浏览《Windows界面编程第二篇 半透明窗体》
当窗口的背景用彩色图片来装饰时,其它控件如果还是用灰色的背景会显的比较不谐调,《Windows界面编程第五篇 静态控件背景透明化》将介绍如何为静态框设置透明背景。
本文配套程序下载地址为:http://download.csdn.net/download/morewindows/4947377
转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/8451629
欢迎关注微博:http://weibo.com/MoreWindows
- Windows界面编程第一篇 位图背景与位图画刷
- Windows界面编程第一篇 位图背景与位图画刷
- Windows界面编程第一篇 位图背景与位图画刷
- Windows界面编程第一篇 位图背景与位图画刷
- Windows界面编程第一篇 位图背景与位图画刷
- Windows界面编程第一篇 位图背景与位图画刷
- Windows界面编程第一篇 位图背景与位图画刷
- 位图和位块传输(4)位图画刷与画画
- Windows界面编程第十一篇 位图显示特效 随机积木效果
- windows 编程第一篇
- 创建与设备无关的位图画刷
- 创建位图画刷(CreatePatternBrush)
- MFC 中的位图画刷
- CreatePatternBrush创建位图画刷
- Windows界面编程第十二篇 位图显示特效 飞入效果与伸展效果
- Windows界面编程第九篇 位图显示特效 交错效果
- Windows界面编程第十篇 位图显示特效 百叶窗效果
- Windows界面编程第十三篇 位图显示特效合集
- I/O输入、输出
- 剑指Offer [01] 二维数组中的查找
- Caused by: java.net.BindException: Cannot assign requested address: JVM_Bind问题
- 深入理解linux内核-ch01
- 运算符和进制转化
- Windows界面编程第一篇 位图背景与位图画刷
- 微信支付PHP SDK之微信公众号支付代码详解
- [WebGIS] ArcGIS api for Javascript3.21版本加载高德地图
- 博弈总结
- Unity入门操作_Application类与切换场景 _010
- java面试基础-Java中的反射机制
- 什么是时间复杂度
- GBDT原理
- 深入理解linux内核-ch02