windows编程中的位图操作,界面中插入位图方法

news/2024/9/23 6:12:44/

在界面中插入位图,主要用到BitBlt这个函数

BOOL CDC::BitBlt(int x, int y, int width, int height, CDC *src, int src_x, int src_y, DWORD dwRop)

用法说明见官方说明

这里要注意的是,这个函数是把源图像从src这个设备上下文传递到目标设备上下文(这个函数调用对象),源和目标的宽和高都是width, height,也就是不进行缩放。并且源的左上角(其实不一定真的是左上角,与实际使用的坐标系有关,指的是坐标最小的xy值)。
dwRop是操作码,操作码可以将官方说明,这里使用SRCCOPY。

另外要注意的是,如果width, height超过了源的大小,那么使用源的大小,width, height设置成源的大小。另外x, y, width, height可以超过目标的大小,比如x, y可以是小于0的数,如果超过了目标大小,超出的部分直接丢弃不显示,在目标区域的图像不受影响。

界面插入位图方法,除了这个BitBllt函数,还有其他几个函数需要使用

创建源的设备上下文无关

BOOL CDC::CreateCompatibleDC(CDC* pDC);

创建的这个设备上下文无关用于保存源图像,也就是上面BitBlt中的src这个CDC对象

导入图片

BOOL CBitmap::LoadBitmap(LPCTSTR sourcename)
BOOL CBitmap::LoadBitmap(UINT sourceID)

有两个方法可以使用,直接使用图片的路径,另一个先把图像放到资源文件中,然后用资源的id来导入

获取图片信息

int CBitmap::GetBitmap(BITMAP* pBitMap)

返回:非0为成功,0为不成功

BITMAP是一个结构体

/* Bitmap Header Definition */
typedef struct tagBITMAP{LONG        bmType;LONG        bmWidth;LONG        bmHeight;LONG        bmWidthBytes;WORD        bmPlanes;WORD        bmBitsPixel;LPVOID      bmBits;} BITMAP

可以用这个函数获取图像的尺寸信息

有了以上这些函数,就可以在界面中插入位图了。下面是一个例子,直接在窗口客户区对象的OnDraw方法中调用

	CRect rect;GetClientRect(&rect);pDC->SetMapMode(MM_ANISOTROPIC);//显示缓冲区自定义坐标系pDC->SetWindowExt(rect.Width(),rect.Height());pDC->SetViewportExt(rect.Width(),-rect.Height());pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);CBrush greenBrush;greenBrush.CreateSolidBrush(RGB(0, 255, 0));CBrush *pOldBrush = pDC->SelectObject(&greenBrush);pDC->Rectangle(&rect);pDC->SelectObject(pOldBrush);CDC picDC;//声明一个图片缓冲区picDC.CreateCompatibleDC(pDC);//创建一个与显示缓冲区兼容的内存缓冲区CBitmap NewBitmap,*pOldBitmap;NewBitmap.LoadBitmap(IDB_TEACUP);//从资源中导入位图BITMAP bmp;//声明bmp结构体NewBitmap.GetBitmap(&bmp);//获取位图信息	pOldBitmap=picDC.SelectObject(&NewBitmap);//将位图选入内存DCpicDC.SetMapMode(MM_ANISOTROPIC);//内存DC自定义坐标系picDC.SetWindowExt(bmp.bmWidth,bmp.bmHeight);picDC.SetViewportExt(bmp.bmWidth,-bmp.bmHeight);picDC.SetViewportOrg(bmp.bmWidth/2,bmp.bmHeight/2);int nX=rect.left+(rect.Width()-bmp.bmWidth)/2;//计算位图居中显示时的左下角点坐标int nY=rect.top+(rect.Height()-bmp.bmHeight)/2;pDC->BitBlt(nX,nY,bmp.bmWidth,bmp.bmHeight,&picDC,-bmp.bmWidth/2,-bmp.bmHeight/2,SRCCOPY);//图片拷贝到显示缓冲区//pDC->BitBlt(nX,nY,rect.Width(), rect.Height(),&picDC,-bmp.bmWidth/2,-bmp.bmHeight/2,SRCCOPY);//图片拷贝到显示缓冲区picDC.SelectObject(pOldBitmap);//恢复原位图NewBitmap.DeleteObject();//删除新位图picDC.DeleteDC();//删除picDC

效果如图
在这里插入图片描述

其中有一些函数比如SelectObject,SetMapMde之类的,这些在Windows图像编程中比较基础,可以看我另一篇文章:使用Windows GDI进行绘图


http://www.ppmy.cn/news/1448076.html

相关文章

【类型商店】字符字符串(上)

啊,哈喽,小伙伴们大家好。我是#Y清墨,今天呐,我要介绍的是字符与字符串。 导语 在我之前发的[算法材料包]C数字拆分里有提及到.size()和length()和strlen(),想看更多内容请别划走! 一.论字符 (1&#xff…

Java面试题:解释堆和栈的OutOfMemoryError通常在什么情况下会发生

在Java中,OutOfMemoryError(OOM)是一个运行时错误,它表明Java虚拟机(JVM)在尝试分配内存时无法找到足够的空间。这个错误可能发生在堆内存或栈内存耗尽时。以下是一些常见的导致OutOfMemoryError的情况&…

第三章:信息系统基础知识之信息系统概述

信息系统概述 信息系统(Information System,IS)一般泛指收集、存储、处理和传播各种信息的具有完整功能的集合体。现代信息系统总是与计算机技术和互联网技术的应用联系在一起,主要是指以计算机为信息处理工具,以网络为信息传输手段的信息系统…

【FastGPT 】FastGPT 的知识库逻辑

这里写自定义目录标题 FastGPT 的知识库逻辑FastGPT 的知识库检索机制FastGPT 的知识库逻辑 FastGPT的知识库逻辑主要围绕“向量搜索 + 大模型 = 知识库问答”的公式展开。以下是关于FastGPT知识库逻辑的一些关键点: 基础概念: 向量:将人类的语言(文字、图片、视频等)转换…

el-date-picker 禁用时分秒选择(包括禁用下拉框展示)

2024.04.26今天我学习了对el-date-picker进行禁用时分秒, 在使用el-date-picker组件的时候,我们有可能遇到需要把时分秒的时间固定,然后并且不能让他修改: 1714120999296 比如右上角的这个时间,我们要给它固定是‘08:…

ASUS华硕ROG幻15笔记本GU502GU原装出厂Windows10系统工厂模式安装包下载,带MyASUS WinRE恢复重置功能

华硕ROG Zephyrus M15笔记本原厂Win10预装OEM系统,恢复开箱状态 适用型号:GU502GW,GU502GU,GU502GV 链接:https://pan.baidu.com/s/1lTK_CUFT9N3q0sXBS7ENPg?pwd8hm2 提取码:8hm2 华硕原装W10系统工厂…

「 网络安全常用术语解读 」软件物料清单SBOM详解

1. 概览 软件物料清单(Software Bill of Materials,SBOM)是软件成分信息的集合,SBOM文件中记录了软件产品或服务所使用组件、库、框架的清单,用于描述软件构建过程中使用的所有组件及其关系,以实现软件供应…

采用前后端分离Vue,Ant-Design技术开发的(手麻系统成品源码)适用于三甲医院

开发环境 技术架构:前后端分离 开发语言:C#.net6.0 开发工具:vs2022,vscode 前端框架:Vue,Ant-Design 后端框架:百小僧开源框架 数 据 库:sqlserver2019 系统特性 麻zui、护理、PACU等围术期业务全覆…