MFC图形函数学习12——位图操作函数

       位图即后缀为bmp的图形文件,MFC中有专门的函数处理这种格式的图形文件。这些函数只能处理作为MFC资源的bmp图,没有操作文件的功能,受限较多,一般常作为程序窗口界面图片、显示背景图片等用途。有关位图操作的步骤、相关函数等介绍如下。
一、将bmp文件导入VS成为MFC中的资源
       步骤:解决方案资源管理器->右键资源文件->添加->资源->Bitmap->导入。
       此时,bmp文件已经进入到MFC中成为MFC的资源;在资源视图中,点开Bitmap,可以看到“IDB_BITMAP1”,这就是导入位图的ID号,右键这个ID号可通过属性修改ID号。在后面的处理过程中,需要使用这个位图时,都要提供这个ID号。
二、位图操作函数
(一)创建与指定设备上下文兼容的内存设备上下文函数
       原型:virtual BOOL CreateCompatibleDC(CDC* pDC)
       参数:pDC是显示设备上下文的指针
       返回:创建成功返回非0数(真);否则返回0(假)
       说明:
       a.这个函数是CDC类的成员函数,使用这个函数时需要CDC类对象或指针调用。
       b.所谓设备上下文就是计算机的显示设备,具体到我们这里就是显示窗口。函数的参数即是当前显示窗口的指针,这里利用这个指针并调用CreateCompatibleDC函数的目的就是生成一个与当前显示窗口相兼容的CDC类对象(在内存中),然后在这个对象中处理bmp位图资源。由于彼此兼容,可以将处理好的兼容对象中的内容一次性传送到当前显示窗口中。
(二)载入位图函数
       原型:BOOL LoadBitmap(UNIT nIDResource);
       参数:nIDResource位图资源ID编号
       返回值:载入成功返回非0值,失败返回0
       说明:
       a.函数LoadBitmap属于CBitmap类的成员函数,使用这个函数需要CBitmap对象调用。
       b.参数就是前面介绍的导入到MFC中的bmp资源的ID。
       c.通过这个函数,位图资源从MFC系统资源被导入到我们的程序中,我们可以对其操作了。
(三)获取位图信息函数
       原型:int GetBitmap(BITMAP* pBitMap);
       参数:pBitMap是BITMAP结构体的指针
       返回值:获取信息成功返回非0数;失败返回0。
       说明:
       a.函数GetBitmap是CBitmap类的成员函数,使用时需要CBitmap类对象调用。
       b.实际上获取的信息就是调用它CBitmap对象的信息,包括位图的宽度、高度、颜色格式和位图的字节数据等信息。
       c.从步骤上说,CBitmap对象应先通过调用LoadBitmap函数载入位图。
(四)位块传送函数
       原型:BOOL BitBlt(int x,int y,int nWidth,int nHeight,CDC* pSrcDC,int xSrc,int ySrc,DWORD dwRop);
       参数:x,y,nWidth、nHeight目标矩形左上角坐标和源位图的宽高
                 pSrcDC是CDC对象的指针,指向被拷贝的位图
                 xSrc和ySrc是源位图的左上角
                 dwRop光栅操作码
       返回值:传送成功返回非0数;失败返回0。
       说明:
        a.函数BitBlt是CDC类的成员函数,使用时需要CDC类对象、指针调用。
        b.该函数的功能是将源位图中部分或全部区域按原区域大小复制到目标对象。
        c.当目标矩形指针指向当前窗口时,被拷贝的内容会显示到屏幕上。
        d.关于光栅操作码的取值有很多,如仅仅是把位图显示到窗口,取值为SRCCOPY。如需要对图像像素进行处理可以选用其它光栅操作码。
(五)拉伸位图函数
        原型:BOOL StretchBlt(int x,int y,int nWidth,int nHeight,CDC* pSrcDC,int xSrc,int ySrc,int nSrcWidth,int nSrcHeight,DWORD dwRop);
        参数:x,y,nWidth,nHeight目标矩形坐标及长宽
                  pSrcDC是CDC类对象指针,指向源位图
                  xSrc、ySrc,nSrcWidth、nSrcHeight源位图矩形坐标及长宽
                  dwRop 光栅操作码
       返回值:处理成功返回非0数,否则返回0。
       说明:
       a.函数StretchBlt是CDC类的成员函数,使用时需要CDC类指针调用。
       b.该函数的功能不仅仅是字面含义的拉伸,也可以压缩、变形等。
       c.当目标矩形指针指向当前窗口时,被拷贝的内容会显示到屏幕上。
       d.光栅操作码同上一个函数。
       e.当目标矩形长宽与源矩形长宽一致时,函数的功能与BitBlt相同。
       f.由于这个函数在处理过程中存在变形,会造成图像显示失真,为解决失真问题,可以在调用StretchBlt函数前,调用SetStretchBltMode函数设置一下拉伸模式,参数使用COLORONCOLOR或HALFTONE就不变形了。SetStretchBltMode函数是CDC类的成员函数,使用时需要CDC对象或指针调用。
       e.关于坐标系问题,建议使用设备坐标系;上面那个函数也同样。
三、MFC中关于位图的操作函数,既复杂功能又弱,使用起来效果不是太好,关于图像处理,有一个共享类CImage,它可以在C++、MFC中调用,笔者曾写过一篇短文《CImage成员函数Load、Create、Draw、Save使用方法简介》介绍了它的主要函数以及在C++中的使用,在笔者“C++/MFC/easyX相关知识”专栏中可以看到,这个类功能强大,使用简单。方便时将对这个类更多的函数以及在MFC中的使用做进一步的介绍。
四、上面几个函数的使用方法的举例程序
       题目:将一张荷花图片显示到窗口上,然后画一个红色边框填充为透明的椭圆,将图片中的荷花圈起来。步骤如下:
(一) 先按照本文开头讲的步骤,将bmp图形文件导入到MFC中,ID号使用缺省ID:IDB_BITMAP1。
(二)其它代码及注释如下:(运行时将代码考入OnDraw函数中)

//一、获得窗口数据
	CRect rect;
	GetClientRect(rect);
       //使用设备坐标系,这里获取窗口数据是为了后边显示图片使用
//二、载入一幅荷花图片并显示在窗口
	CDC myDC; //声明CDC对象
	myDC.CreateCompatibleDC(pDC); //初始化myDC是指与pDC兼容
	CBitmap myBitmap;//声明位图类对象
	myBitmap.LoadBitmapW(IDB_BITMAP1);//将MFC位图资源载入位图对象
	CBitmap* oldBitmap = myDC.SelectObject(&myBitmap); //将位图对象选入兼容CDC类对象
	BITMAP info; //声明位图结构体对象
	myBitmap.GetBitmap(&info);//获取位图长宽等信息
	pDC->SetStretchBltMode(COLORONCOLOR);//设置拉伸位图模式
	pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &myDC, 0, 0, info.bmWidth,info.bmHeight,SRCCOPY);
	  //使用拉伸位图函数将位图(来自于MFC资源)传送到屏幕上的窗口中
	pDC->SelectObject(oldBitmap);//恢复CDC中的缺省位图
	myBitmap.DeleteObject();//清空bitmap对象
	myDC.DeleteDC();//清空memDC
//三、画一个边框红色、填充为透明的圆
	CPen redPen(PS_SOLID,3,0x0000ff);//声明红色画笔
	CPen* oldPen=pDC->SelectObject(&redPen); //将画笔选入CDC
	CBrush* oldBrush =(CBrush*)pDC->SelectStockObject(NULL_BRUSH);//选入透明库画刷
	pDC->Ellipse(300, 100, 900, 500);//画椭圆
	pDC->SelectObject(oldPen);//恢复缺省画笔
	pDC->SelectObject(oldBrush);//恢复缺省画刷

运行结果截图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/924259.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

钟睒睒的“傲慢与偏见”

文章内容根据网络内容整理形成 最近,钟睒睒关于绿瓶水不适合长期饮用的言论,在网上引起了一番新的热议,让刚平静不久的包装饮用水竞争,再次掀起一阵波澜,同时,其对于企业家直播带货的等系列看法&#xff0c…

比亚迪降价令背后的反思,创新还是压榨?

科技新知 原创作者丨依蔓 编辑丨蕨影 比亚迪要求供应商明年起降价10%? 近日,网传一封有关比亚迪乘用车要求供应商降价的邮件,署名为比亚迪集团执行副总裁、乘用车首席运营官何志奇。 邮件称,2025年市场竞争将更加激烈&#xff0…

自媒体图文视频自动生成软件|03| 页面和结构介绍

代码获取方式在文本末尾🔚 *代码获取方式在文本末尾🔚 *代码获取方式在文本末尾🔚 *代码获取方式在文本末尾🔚 视频图片生成器 一个基于 Python 和 Web 的工具,用于生成带有文字和语音的视频以及图片。支持多种尺寸、…

(11)(2.2) BLHeli32 and BLHeli_S ESCs(二)

文章目录 前言 1 传递支持 前言 BLHeli 固件和配置应用程序的开发是为了允许配置 ESC 并提供额外功能。带有此固件的 ESC 允许配置定时、电机方向、LED、电机驱动频率等。在尝试使用 BLHeli 之前,请按照 DShot 设置说明进行操作(DShot setup instructions)。 1 传…

逻辑处理器核心指纹修改

navigator.hardwareConcurrency的属性,可以用来获取CPU的逻辑处理器核心数。 1、navigator.hardwareConcurrency接口定义: third_party\blink\renderer\core\frame\navigator_concurrent_hardware.idl // https://html.spec.whatwg.org/C/#navigator.hardwarecon…

Linux下的火墙管理及优化

从功能角度来讲 防火墙是位于内部网和外部网之间的屏障,它按照系统管理员预先定义好的规则来控制数据包的进 从功能实现角度来讲 火墙是系统内核上的一个模块netfilter(数据包过滤机制) 通过netfiler来管理kernel space中的策略 netfilter简介 Netfilter是Lin…

chrome允许http网站打开摄像头和麦克风

第一步 chrome://flags/#unsafely-treat-insecure-origin-as-secure 第二步 填入网址,点击启用 第三步 重启 Chrome:设置完成后,点击页面底部的 “Relaunch” 按钮,重新启动 Chrome 浏览器,使更改生效。

【Vue】Ego商城项目跟做

技术栈 Vue全家桶:Vue VueRouter Vuex Axios ElementUI 依赖安装 网络请求:npm install --save axios --no-fund Element:vue add element 后端相关依赖:npm install --save express cors mysql --no-fund token:np…

ALSA(4) --- CPU DAI实践

CPU_DAI实践 物理拓扑图 上图可知,从dma过来数据,会保存在DAI的一个FIFO队列中,数据是并行过来的各个通道数据,经过shift移位寄存器,再经过P2S并行转串行,再经过DAVC音量控制输出到GPIO端口 音频数据接口…

【开篇】.NET开源 ORM 框架 SqlSugar 系列

01. 前言 ☘️ 1.1 什么是ORM? 对象-关系映射(Object-Relational Mapping,简称ORM),面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对…

EtherCAT Coe对象创建与通信

目录 前言使用SSC工具生成XML填充读写函数测试 前言 EtherCAT协议栈生成参考https://blog.csdn.net/qq_42039294/article/details/144061669 本文默认大家有EtherCAT基础的移植经验 使用SSC工具生成XML 首先确保COE是开启的 打开表格,编辑内容如下 更多的数据类…

Axure农业农村数据可视化大屏模板分享

在当今信息技术飞速发展的时代,数据可视化已成为各行各业提升管理效率、优化决策过程的重要手段。Axure作为一款强大的原型设计工具,凭借其高度的自定义能力和丰富的交互设计功能,在农业农村数据可视化领域展现出强大的潜力。本文将详细介绍A…

conda、pip同时安装包引起混乱问题剖析

一句话总结: 安装版本不一致时会有两个.dist-info文件夹(举例:scapy-2.6.1.dist-info和scapy-2.4.3.dist-info),conda list和pip list依靠这两个文件夹进行包的识别(疑似pip list识别老版本,co…

vue实现滚动条滑动到底部分页调取后端接口加载数据

一、案例效果 二、前提条件 接口返回数据 三、案例代码 子组件 const $emit defineEmits([cloneItem, updateList]);const props defineProps({rightList: {type: Array,},chartTableData: {type: Array as () > ChartListType[],},deleteChartInfo: {type: Object,}…

redis 底层数据结构

概述 Redis 6 和 Redis 7 之间对比&#xff1a; Redis6 和 Redis7 最大的区别就在于 Redis7 已经用 listpack 替代了 ziplist. 以下是基于 Redis 7基础分析。 RedisObject Redis是⼀个<k,v>型的数据库&#xff0c;其中key通常都是string类型的字符串对象&#xff0c;⽽…

arm rk3588 onnx转rknn

一、环境部署&#xff1a; https://github.com/airockchip/rknn_model_zoo/tree/main/examples/yolo11 从该网址下载yolo11的模型。支持80种类型检测 二、下载模型 进入examples/yolo11/model文件夹&#xff0c;执行 ./download_model.sh 如图&#xff1a; 三、模型转换…

Flutter 3.24.5安装配置——2024年11月26日

目录 1️⃣前置安装使用环境配置步骤安装Flutter SDK安装Android SDK修改文件默认安装位置&#xff08;.gradle, AVD&#xff09;开始项目 2️⃣执行结果&#x1fab2;Bug找不到**.jar文件 &#x1f517;参考链接 1️⃣前置安装 使用环境 Windows 11IDEA 2024.2.3Flutter 3.2…

Pytest-Bdd-Playwright 系列教程(13):钩子(hooks)

Pytest-Bdd-Playwright 系列教程&#xff08;13&#xff09;&#xff1a;钩子&#xff08;hooks&#xff09; 前言一、什么是钩子&#xff1f;二、Pytest-Bdd 提供的钩子一览三、钩子用法详解1. pytest_bdd_before_scenario2. pytest_bdd_after_scenario3. pytest_bdd_before_s…

23种设计模式-生成器(Builder)设计模式

文章目录 一.什么是生成器设计模式&#xff1f;二.生成器模式的特点三.生成器模式的结构四.生成器模式的优缺点五.生成器模式的 C 实现六.生成器模式的 Java 实现七.代码解析八. 总结 类图&#xff1a; 生成器设计模式类图 一.什么是生成器设计模式&#xff1f; 生成器模式&am…

HCIP——堆叠技术实验配置

目录 一、堆叠的理论知识 二、堆叠技术实验配置 三、总结 一、堆叠的理论知识 1.1堆叠概述&#xff1a; 是指将两台交换机通过堆叠线缆连接在一起&#xff0c;从逻辑上变成一台交换设备&#xff0c;作为一个整体参与数据的转发。 1.2堆叠的基本概念 堆叠系统中所有的单台…