如何以椭圆形显示位图
windows程序设计第14章的一个程序,下面是对该程序的分析:位图显示的话一般都是矩形,比如之前写的一篇关于显示位图的博文
显示位图
那么如果我们想椭圆显示呢?如图:
哦,可以这样,将选好的图片复制到画图程序中,用白色的画笔”擦除”椭圆外的部分,然后设置客户区颜色为白色,再在客户区显示位图,如果将客户区颜色改变呢?显然这样做是不行的,为此,有一种非常通用的技术来解决此类问题,该技术包括”位掩码”位图和一些光栅操作。
位掩码是一种单色位图,尺寸与要显示的位图尺寸相同,因为是单色,所以1是白色,0是黑色,那么如何做呢?慢慢一步步来
hInstance = ((LPCREATESTRUCT)lParam)->hInstance;//加载位图资源hBitmapImag = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1));//获取位图宽度,高度GetObject(hBitmapImag, sizeof(BITMAP), &bitmap);cxBitmap = bitmap.bmWidth;cyBitmap = bitmap.bmHeight;//选进内存DChdcMemImag = CreateCompatibleDC(NULL);SelectObject(hdcMemImag, hBitmapImag);//创建位掩码位图//因为是单色位图,所以1为白色,0为黑色hBitmapMask = CreateBitmap(cxBitmap, cyBitmap, 1, 1, NULL);hdcMemMask = CreateCompatibleDC(NULL);SelectObject(hdcMemMask, hBitmapMask);//这里是hdcMemMask中位掩码位图的整个矩形颜色为黑色SelectObject(hdcMemMask, GetStockObject(BLACK_BRUSH));Rectangle(hdcMemMask, 0, 0, cxBitmap, cyBitmap);//然后使得其椭圆区域为白色SelectObject(hdcMemMask, GetStockObject(WHITE_BRUSH));Ellipse(hdcMemMask, 0, 0, cxBitmap, cyBitmap);//将hdcMemImag中的位图与位掩码位图合并,源位图与目标位图像素进行光栅与运算 BitBlt(hdcMemImag, 0, 0, cxBitmap, cyBitmap,hdcMemMask, 0, 0, SRCAND);DeleteDC(hdcMemImag);DeleteDC(hdcMemMask);return 0;
现在来看一下经过WM_CREATE消息里处理后的位图怎么样
位掩码怎么样呢?
嗯,然后怎么做呢?
看一下这条语句:
BitBlt(hdc, x, y, cxBitmap, cyBitmap, hdcMemMask, 0, 0, 0x220326);
后面的ox220326是神马东西???查看msdn BitBlt的用法,一些基本常见的三元(源位图,画刷,目标位图 )光栅操作都用宏定义了,但还有很多没定义,
函数不懂,查madn……
然后msdn是这么解释的:
00220326 DSna Dest = (NOT Src) AND Dest
也就是说,目标位图像素值和源位图相应像素取反后的值再做与运算,
所以,现在客户区应该是这样
到了这里,是不是想到了,对,现在椭圆内饰黑色的,即像素值0,再调用一次BitBle就可以了,WM_CREATE里处理后的位图椭圆内像素值与0(客户区中椭圆)做或运算,结果是位图像素值,椭圆外的像素值(为0)与客户区相应区域做位运算,结果是客户区像素值,正好
所以,再调用一次:
BitBlt(hdc, x, y, cxBitmap, cyBitmap, hdcMemImag, 0, 0, SRCPAINT);
SRCPAINT:
Combines the colors of the source and destination rectangles
by using the Boolean OR operator.
再次看下结果,实现也不是那么难,对吧
如何以椭圆形显示位图相关推荐
- 用WindowedMode显示位图图象(转)
用WindowedMode显示位图图象(转)[@more@] 前面所所讲过的例子里,整个画面全部被 DirectX 独占,这种模式叫 "Full Screen Mode(全屏模式)" ...
- java显示位图_java – 大图标位图在通知中显示为白色方块?
我有这个问题,我从我在通知中使用的URL生成位图.然而,在我的手机上,Bitmap显示为一个小白色的方块.我看着它,发现很多帖子像这样说: Icon not displaying in notific ...
- MFC显示位图 from http://blog.csdn.net/liuzhuomju/article/details/7299458
这些例子都在vs2005测试通过 一.最简单的一种1.将图像文件以资源形式加入工程中,IDB_BITMAP1 2.用一个PICTURE控件,在其属性中,将其Type设置为Bitmap 3.将Pitur ...
- Android官方开发文档Training系列课程中文版:高效显示位图之位图缓存
原文地址:http://android.xsoftlab.net/training/displaying-bitmaps/cache-bitmap.html 往UI界面中加载单张图片的过程是很简单的, ...
- Android官方开发文档Training系列课程中文版:高效显示位图之在非UI线程中处理图片
原文地址:http://android.xsoftlab.net/training/displaying-bitmaps/process-bitmap.html 我们在上节课Load Large Bi ...
- Android官方开发文档Training系列课程中文版:高效显示位图之加载大位图
原文地址:http://android.xsoftlab.net/training/displaying-bitmaps/index.html 引言 学习如何使用一种常规的手段来处理及加载Bitmap ...
- 常用MFC控件基础使用(Edit Button Check Combo Tree 显示位图 控件大小自适应、线程、右键菜单、控件调整移动、MFC背景)
常用MFC控件基础使用 1.Edit Control 2.Button控件 3.Check控件 4.Combo Box 5.Tree 控件 5.快捷键设置 6 显示缓冲区位图 7 窗口自适应大小 8 ...
- VC++ 使用BitBlt函数显示位图
BitBlt 函数 该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境. 原型: BOOL BitBlt( HDC hdcDest, i ...
- Android官方开发文档Training系列课程中文版:高效显示位图之在UI中展示位图
原文地址:http://android.xsoftlab.net/training/displaying-bitmaps/display-bitmap.html 这节课会将前面的知识点整合到一起,展示 ...
- Android官方开发文档Training系列课程中文版:高效显示位图之管理位图内存
原文地址:http://developer.android.com/training/displaying-bitmaps/manage-memory.html 除了在上一节中描述的步骤之外,还有一些 ...
最新文章
- 百度地图经常崩溃的问题
- Python运算符与Pandas方法的映射关系
- tp5 控制器不存在_使用服务器管理器将域控制器降级
- 计算机换用户无法启动软件,Windows无法启动. 原因可能是最近更改了硬件或软件故障的处理方法...
- 爬虫+数据分析,制作一个世界疫情人数增长动态柱状竞赛图2
- php课程实验总结报告_PHP课程总结20161125
- android studio 如何导入工程文件,Android studio如何导入已有的eclipse工程
- Linux文件查询笔记
- idea 配置jdk版本_JDK 11 安装过程(同时已安装了JDK 8)以及Intellij IDEA 配置
- 【MyBatis框架】订单商品数据模型-分析思路
- python qt gui快速编程_《PYTHON QT GUI快速编程 PYQT编程指南》源码
- App Store最新审核指南(2015年3月更新版)
- UVALive 5135 Mining Your Own Business 双连通分量
- PHP算法 参数组合,多个分类不同组合列表
- java 浏览器 pdf_使用Java Servlet在浏览器中显示Pdf
- 安装系统或者进PE蓝屏 代码:IRQL NOT LESS OR EQUAL
- 跨境电商机遇爆发,时下应该怎么“玩”?
- 《C Primer Plus》第五章-运算符 表达式和语句(笔记、复习题、编程题,副作用和序列点,升降级)
- 云计算期末习题含答案
- iPad安卓协议是怎么实现功能的