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.
再次看下结果,实现也不是那么难,对吧

如何以椭圆形显示位图相关推荐

  1. 用WindowedMode显示位图图象(转)

    用WindowedMode显示位图图象(转)[@more@] 前面所所讲过的例子里,整个画面全部被 DirectX 独占,这种模式叫 "Full Screen Mode(全屏模式)" ...

  2. java显示位图_java – 大图标位图在通知中显示为白色方块?

    我有这个问题,我从我在通知中使用的URL生成位图.然而,在我的手机上,Bitmap显示为一个小白色的方块.我看着它,发现很多帖子像这样说: Icon not displaying in notific ...

  3. MFC显示位图 from http://blog.csdn.net/liuzhuomju/article/details/7299458

    这些例子都在vs2005测试通过 一.最简单的一种1.将图像文件以资源形式加入工程中,IDB_BITMAP1 2.用一个PICTURE控件,在其属性中,将其Type设置为Bitmap 3.将Pitur ...

  4. Android官方开发文档Training系列课程中文版:高效显示位图之位图缓存

    原文地址:http://android.xsoftlab.net/training/displaying-bitmaps/cache-bitmap.html 往UI界面中加载单张图片的过程是很简单的, ...

  5. Android官方开发文档Training系列课程中文版:高效显示位图之在非UI线程中处理图片

    原文地址:http://android.xsoftlab.net/training/displaying-bitmaps/process-bitmap.html 我们在上节课Load Large Bi ...

  6. Android官方开发文档Training系列课程中文版:高效显示位图之加载大位图

    原文地址:http://android.xsoftlab.net/training/displaying-bitmaps/index.html 引言 学习如何使用一种常规的手段来处理及加载Bitmap ...

  7. 常用MFC控件基础使用(Edit Button Check Combo Tree 显示位图 控件大小自适应、线程、右键菜单、控件调整移动、MFC背景)

    常用MFC控件基础使用 1.Edit Control 2.Button控件 3.Check控件 4.Combo Box 5.Tree 控件 5.快捷键设置 6 显示缓冲区位图 7 窗口自适应大小 8 ...

  8. VC++ 使用BitBlt函数显示位图

    BitBlt 函数 该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境. 原型:   BOOL BitBlt(     HDC  hdcDest,     i ...

  9. Android官方开发文档Training系列课程中文版:高效显示位图之在UI中展示位图

    原文地址:http://android.xsoftlab.net/training/displaying-bitmaps/display-bitmap.html 这节课会将前面的知识点整合到一起,展示 ...

  10. Android官方开发文档Training系列课程中文版:高效显示位图之管理位图内存

    原文地址:http://developer.android.com/training/displaying-bitmaps/manage-memory.html 除了在上一节中描述的步骤之外,还有一些 ...

最新文章

  1. 百度地图经常崩溃的问题
  2. Python运算符与Pandas方法的映射关系
  3. tp5 控制器不存在_使用服务器管理器将域控制器降级
  4. 计算机换用户无法启动软件,Windows无法启动. 原因可能是最近更改了硬件或软件故障的处理方法...
  5. 爬虫+数据分析,制作一个世界疫情人数增长动态柱状竞赛图2
  6. php课程实验总结报告_PHP课程总结20161125
  7. android studio 如何导入工程文件,Android studio如何导入已有的eclipse工程
  8. Linux文件查询笔记
  9. idea 配置jdk版本_JDK 11 安装过程(同时已安装了JDK 8)以及Intellij IDEA 配置
  10. 【MyBatis框架】订单商品数据模型-分析思路
  11. python qt gui快速编程_《PYTHON QT GUI快速编程 PYQT编程指南》源码
  12. App Store最新审核指南(2015年3月更新版)
  13. UVALive 5135 Mining Your Own Business 双连通分量
  14. PHP算法 参数组合,多个分类不同组合列表
  15. java 浏览器 pdf_使用Java Servlet在浏览器中显示Pdf
  16. 安装系统或者进PE蓝屏 代码:IRQL NOT LESS OR EQUAL
  17. 跨境电商机遇爆发,时下应该怎么“玩”?
  18. 《C Primer Plus》第五章-运算符 表达式和语句(笔记、复习题、编程题,副作用和序列点,升降级)
  19. 云计算期末习题含答案
  20. iPad安卓协议是怎么实现功能的

热门文章

  1. pe卸载linux系统软件,Windows和Linux双系统下完美卸载linux
  2. java jdk oracle官网历史版本下载链接
  3. 2021昆明icpc B 状压+期望dp,一点几何模拟
  4. missing separator 解决方法
  5. Blowfish简介
  6. c语言程序框图示范,C语言程序框图courseware.ppt
  7. 搜狗高级测试经理诸葛东明谈基于AI图像识别的输入法性能测试实践
  8. 火车票能不能选座_电话订火车票可以自己选座位吗
  9. 机器学习基础补习04---凸优化
  10. Vivado2018【编辑器设置黑色背景】