VC++控制台应用程序下使用GDI在内存中画图

本文介绍了在VC++控制台应用程序中如何使用GDI在内存中画图,并展示了将内存中的HBITMAP转换并保存为BMP图片的方法。通过创建内存设备上下文,利用GDI函数进行绘图操作,最后将画图结果保存为图像文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

VC++控制台应用程序下使用GDI在内存中画图

1      背景

以前写MFC应用程序的时候,就接触到GDI了。只不过那个时候,Visual Studio已经帮你生成了MFC应用的基本框架,在Visual Studio生成的View文件里,存在一个方法::OnDraw(CDC* /*pDC*/),Visual Studio会添加注释“// TODO: 在此处为本机数据添加绘制代码”,即是说,请在此处调用CDC进行绘制操作。CDC的创建和初始化MFC都帮你完成了,你只需要添加一些个性化代码即可,当然,这对于一个MFC应用来说,当然够了,但是如果你想写一个不使用MFC的应用,我该怎么获得CDC呢?

很多时候,我们并不需要将绘制的图像显示在窗口,只需要将图像绘制在内存中,然后将内存中的图像保存成图片文件。说到内存绘制,也许有人会说,我直接创建一块内存像素数据,然后计算每个图形的像素结构,填充内存像素数据不就可以了么,没有必要使用GDI呀,对于大部分几何图像来说,这么做完全没问题,但是如果你想绘制字符的时候,这么做就很困难了,因为你很难去计算一个字符的像素结构,所以当你需要绘制字符的时候,你还是得使用GDI。

接下来,我将介绍:(1)如何在控制台应用程序下使用GDI在内存中画图;(2)将内存中的图像存储为图片。

2      使用GDI在内存中画图

GDI是Windows API,因此只要是Win32程序(包括Win32应用程序和Win32控制台程序),都可以使用GDI。为了简单起见,如果你想运行本文介绍的代码,新建一个空的Win32控制台程序即可。我觉得在代码中加注释比在这描述更加明了,那么让我们看看代码吧:

#include <
内存画板,在内存中创建一个画板画图。 2.0到2.5版本: ◆内存画板增加了画板添加路径,路径或区域转换为剪裁区,剪裁区的基本操作,结合剪裁区的应用可以画出更多图形。     如果画弦、饼、圆弧、弧线之后,可以获取弧线的两个端点的坐标。     增加“画圆弧路径文字()”,可以画出按照圆弧排列的文字 ◆新增类“图片对象”和“ICO图标类” ◆增加子程序:_计算直线角度()、_计算直线的终点()、_计算两点间的距离()、_计算两条直线的交点()。     _计算直线的终点() 需要提供{起点,长度,角度},计算出终点,可以当做计算圆上某一点{圆心,半径,角度} 2.5到3.0版本: ◆新增类“动态矢量画板”,画出的图形可以随着鼠标滚轮滚动放大缩小     画出的形状支持半透明颜色(画笔颜色、刷子颜色、文本颜色为ARGB颜色)     增加更多的命令,可设置Y轴正方向是向上还是向下。 ◆新增类“图片窗口类”,可在“图片窗口示例.e”预览效果。 ◆新增子程序:_计算点到线段的最短距离()、_计算点到直线的垂点距离()、_计算椭圆上的一点()、置窗口透明度_()。 附送一个(源码分享)用内存画板为主体创建的表格类。 3.0到3.5版本:修复部分bug。 ◆内存画板和动态矢量画板增加了  旋转指定角度画图()、旋转角度复位()和画闭合曲线() ◆类“图片对象”增加了  取出图片数据()、旋转()、设置某颜色透明()等更多命令; ◆新增子程序:计算贝塞尔曲线控制点()、计算贝塞尔曲线控制点_X()、_计算对称点()、_计算某点绕一个坐标旋转()     只需要提供贝塞尔曲线的顶点,可计算出曲线的控制点,直接用计算结果的数组画贝塞尔曲线即可 3.5到4.0版本: ◆内存画板新增  写出W()、写文本行W()、定位写出W()等Unicode文本处理命令(感谢网友“xxdahai”提供Unicode文本处理的源码)     画图片_变换()、取文字间距()、设置文字间距()、画笔类型_2()、刷子类型_图案()等命令 ◆类“图片对象”增加了   设置某颜色透明_2()、添加图片对象()、取位图句柄() ◆新增子程序:计算图片旋转后的尺寸()、_计算三角形的重心()、_计算坐标组缩放()、_计算坐标组缩放_X() 4.0到5.0版本: ◆内存画板新增  画繁花曲线()、画玫瑰曲线()、画蝴蝶曲线()     画图片_切图效果()包含55个效果(感谢网友“琪诺兔”提供的图片转场效果的源码) ◆新增类“图片编辑类”,结合命令“内存画板.画图片_裁剪”或“图片对象.编辑图片”使用     类“图片对象”增加了  编辑图片()、取图片透明区域()、设置区域内透明()等更多编辑命令 ◆新增子程序:_计算点与圆的切点()、_计算三角形外接圆的圆心半径()、_计算直线与圆的交点() 5.0到6.0版本: ◆内存画板新增  图片优化模式()、合并分层画板()、空间坐标变换() ◆新增类“分层画板”,透明画板,更加丰富的画笔画刷设置     类“图片对象”增加了  转换分层画板()
内存画板,在内存中创建一个画板画图。 2.0到2.5版本: ◆内存画板增加了画板添加路径,路径或区域转换为剪裁区,剪裁区的基本操作,结合剪裁区的应用可以画出更多图形。     如果画弦、饼、圆弧、弧线之后,可以获取弧线的两个端点的坐标。     增加“画圆弧路径文字()”,可以画出按照圆弧排列的文字 ◆新增类“图片对象”和“ICO图标类” ◆增加子程序:_计算直线角度()、_计算直线的终点()、_计算两点间的距离()、_计算两条直线的交点()。     _计算直线的终点() 需要提供{起点,长度,角度},计算出终点,可以当做计算圆上某一点{圆心,半径,角度} 2.5到3.0版本: ◆新增类“动态矢量画板”,画出的图形可以随着鼠标滚轮滚动放大缩小     画出的形状支持半透明颜色(画笔颜色、刷子颜色、文本颜色为ARGB颜色)     增加更多的命令,可设置Y轴正方向是向上还是向下。 ◆新增类“图片窗口类”,可在“图片窗口示例.e”预览效果。 ◆新增子程序:_计算点到线段的最短距离()、_计算点到直线的垂点距离()、_计算椭圆上的一点()、置窗口透明度_()。 附送一个(源码分享)用内存画板为主体创建的表格类。 3.0到3.5版本:修复部分bug。 ◆内存画板和动态矢量画板增加了  旋转指定角度画图()、旋转角度复位()和画闭合曲线() ◆类“图片对象”增加了  取出图片数据()、旋转()、设置某颜色透明()等更多命令; ◆新增子程序:计算贝塞尔曲线控制点()、计算贝塞尔曲线控制点_X()、_计算对称点()、_计算某点绕一个坐标旋转()     只需要提供贝塞尔曲线的顶点,可计算出曲线的控制点,直接用计算结果的数组画贝塞尔曲线即可 3.5到4.0版本: ◆内存画板新增  写出W()、写文本行W()、定位写出W()等Unicode文本处理命令(感谢网友“xxdahai”提供Unicode文本处理的源码)     画图片_变换()、取文字间距()、设置文字间距()、画笔类型_2()、刷子类型_图案()等命令 ◆类“图片对象”增加了   设置某颜色透明_2()、添加图片对象()、取位图句柄() ◆新增子程序:计算图片旋转后的尺寸()、_计算三角形的重心()、_计算坐标组缩放()、_计算坐标组缩放_X() 4.0到5.0版本: ◆内存画板新增  画繁花曲线()、画玫瑰曲线()、画蝴蝶曲线()     画图片_切图效果()包含55个效果(感谢网友“琪诺兔”提供的图片转场效果的源码) ◆新增类“图片编辑类”,结合命令“内存画板.画图片_裁剪”或“图片对象.编辑图片”使用     类“图片对象”增加了  编辑图片()、取图片透明区域()、设置区域内透明()等更多编辑命令 ◆新增子程序:_计算点与圆的切点()、_计算三角形外接圆的圆心半径()、_计算直线与圆的交点()
内存画板,在内存中创建一个画板画图。 2.0到2.5版本: ◆内存画板增加了画板添加路径,路径或区域转换为剪裁区,剪裁区的基本操作,结合剪裁区的应用可以画出更多图形。     如果画弦、饼、圆弧、弧线之后,可以获取弧线的两个端点的坐标。     增加“画圆弧路径文字()”,可以画出按照圆弧排列的文字 ◆新增类“图片对象”和“ICO图标类” ◆增加子程序:_计算直线角度()、_计算直线的终点()、_计算两点间的距离()、_计算两条直线的交点()。     _计算直线的终点() 需要提供{起点,长度,角度},计算出终点,可以当做计算圆上某一点{圆心,半径,角度} 2.5到3.0版本: ◆新增类“动态矢量画板”,画出的图形可以随着鼠标滚轮滚动放大缩小     画出的形状支持半透明颜色(画笔颜色、刷子颜色、文本颜色为ARGB颜色)     增加更多的命令,可设置Y轴正方向是向上还是向下。 ◆新增类“图片窗口类”,可在“图片窗口示例.e”预览效果。 ◆新增子程序:_计算点到线段的最短距离()、_计算点到直线的垂点距离()、_计算椭圆上的一点()、置窗口透明度_()。 附送一个(源码分享)用内存画板为主体创建的表格类。 3.0到3.5版本:修复部分bug。 ◆内存画板和动态矢量画板增加了  旋转指定角度画图()、旋转角度复位()和画闭合曲线() ◆类“图片对象”增加了  取出图片数据()、旋转()、设置某颜色透明()等更多命令; ◆新增子程序:计算贝塞尔曲线控制点()、计算贝塞尔曲线控制点_X()、_计算对称点()、_计算某点绕一个坐标旋转()     只需要提供贝塞尔曲线的顶点,可计算出曲线的控制点,直接用计算结果的数组画贝塞尔曲线即可 3.5到4.0版本: ◆内存画板新增  写出W()、写文本行W()、定位写出W()等Unicode文本处理命令(感谢网友“xxdahai”提供Unicode文本处理的源码)     画图片_倾斜变换()、取文字间距()、设置文字间距()、画笔类型_2()、刷子类型_图案()等命令 ◆类“图片对象”增加了   设置某颜色透明_2()、添加图片对象()、取位图句柄() ◆新增子程序:计算图片旋转后的尺寸()、_计算三角形的重心()、_计算坐标组缩放()、_计算坐标组缩放_X() 4.0到5.0版本: ◆内存画板新增  画繁花曲线()、画玫瑰曲线()、画蝴蝶曲线()     画图片_切图效果()包含55个效果(感谢网友“琪诺兔”提供的图片转场效果的源码) ◆新增类“图片编辑类”,结合命令“内存画板.画图片_裁剪”或“图片对象.编辑图片”使用     类“图片对象”增加了  编辑图片()、取图片透明区域()、设置区域内透明()等更多编辑命令 ◆新增子程序:_计算点与圆的切点()、_计算三角形外接圆的圆心半径()、_计算直线与圆的交点() 5.0到6.0版本: ◆内存画板新增  图片优化模式()、合并分层画板()、空间坐标变换() ◆新增类“分层画板”,透明画板,更加丰富的画笔画刷设置     类“图片对象”增加了  转换分层画板() 6.0到7.0版本:修复部分bug ◆分层画板增加了  取当前路径()、路径_添加路径()、路径曲线转为线段()、路径_均分路径()、路径_混合路径()等一些路径操作命令     内存画板和分层画板增加了  画图片_扭曲变形() ◆类“图片对象”增加了  创建自位图句柄();类“动态矢量画板”增加了  图形是否显示()、取图形类型()、取图形顶点坐标()     命令“取图形顶点坐标()”提示:如果取圆弧的顶点只取回3个坐标,可以用“_计算三角形外接圆的圆心半径()”命令还原 ◆新增子程序:计算XFORM_指定点旋转()、计算XFORM_指定点缩放()、计算XFORM_指定点倾斜()、取坐标数组范围()、变换坐标组() 2.png (260.85 KB, 下载次数: 0) 3.png (412.58 KB, 下载次数: 0) 4.png (231.94 KB, 下载次数: 0)
内存画板,在内存中创建一个画板画图。 2.0到2.5版本: ◆内存画板增加了画板添加路径,路径或区域转换为剪裁区,剪裁区的基本操作,结合剪裁区的应用可以画出更多图形。     如果画弦、饼、圆弧、弧线之后,可以获取弧线的两个端点的坐标。     增加“画圆弧路径文字()”,可以画出按照圆弧排列的文字 ◆新增类“图片对象”和“ICO图标类” ◆增加子程序:_计算直线角度()、_计算直线的终点()、_计算两点间的距离()、_计算两条直线的交点()。     _计算直线的终点() 需要提供{起点,长度,角度},计算出终点,可以当做计算圆上某一点{圆心,半径,角度} 2.5到3.0版本: ◆新增类“动态矢量画板”,画出的图形可以随着鼠标滚轮滚动放大缩小     画出的形状支持半透明颜色(画笔颜色、刷子颜色、文本颜色为ARGB颜色)     增加更多的命令,可设置Y轴正方向是向上还是向下。 ◆新增类“图片窗口类”,可在“图片窗口示例.e”预览效果。 ◆新增子程序:_计算点到线段的最短距离()、_计算点到直线的垂点距离()、_计算椭圆上的一点()、置窗口透明度_()。 附送一个(源码分享)用内存画板为主体创建的表格类。 3.0到3.5版本:修复部分bug。 ◆内存画板和动态矢量画板增加了  旋转指定角度画图()、旋转角度复位()和画闭合曲线() ◆类“图片对象”增加了  取出图片数据()、旋转()、设置某颜色透明()等更多命令; ◆新增子程序:计算贝塞尔曲线控制点()、计算贝塞尔曲线控制点_X()、_计算对称点()、_计算某点绕一个坐标旋转()     只需要提供贝塞尔曲线的顶点,可计算出曲线的控制点,直接用计算结果的数组画贝塞尔曲线即可 3.5到4.0版本: ◆内存画板新增  写出W()、写文本行W()、定位写出W()等Unicode文本处理命令(感谢网友“xxdahai”提供Unicode文本处理的源码)     画图片_倾斜变换()、取文字间距()、设置文字间距()、画笔类型_2()、刷子类型_图案()等命令 ◆类“图片对象”增加了   设置某颜色透明_2()、添加图片对象()、取位图句柄() ◆新增子程序:计算图片旋转后的尺寸()、_计算三角形的重心()、_计算坐标组缩放()、_计算坐标组缩放_X() 4.0到5.0版本: ◆内存画板新增  画繁花曲线()、画玫瑰曲线()、画蝴蝶曲线()     画图片_切图效果()包含55个效果(感谢网友“琪诺兔”提供的图片转场效果的源码) ◆新增类“图片编辑类”,结合命令“内存画板.画图片_裁剪”或“图片对象.编辑图片”使用 ◆类“图片对象”增加了  编辑图片()、取图片透明区域()、设置区域内透明()等更多编辑命令 ◆新增子程序:_计算点与圆的切点()、_计算三角形外接圆的圆心半径()、_计算直线与圆的交点() 5.0到6.0版本: ◆内存画板新增  图片优化模式()、合并分层画板()、空间坐标变换() ◆新增类“分层画板”,透明画板,更加丰富的画笔画刷设置     类“图片对象”增加了  转换分层画板() 6.0到7.0版本:修复部分bug ◆分层画板增加了  取当前路径()、路径_添加路径()、路径曲线转为线段()、路径_均分路径()、路径_混合路径()等一些路径操作命令     内存画板和分层画板增加了  画图片_扭曲变形() ◆类“图片对象”增加了  创建自位图句柄();类“动态矢量画板”增加了  图形是否显示()、取图形类型()、取图形顶点坐标()     命令“取图形顶点坐标()”提示:如果取圆弧的顶点只取回3个坐标,可以用“_计算三角形外接圆的圆心半径()”命令还原 ◆新增子程序:计算XFORM_指定点旋转()、计算XFORM_指定点缩放()、计算XFORM_指定点倾斜()、取坐标数组范围()、变换坐标组() 7.0到8.0版本: ◆内存画板新增  画图片_倾斜到坐标(),命令“画图片_切图效果”从类中移出为“画图片_转场过渡效果” ◆分层画板增加了  创建_场景句柄()、置灰度图蒙版()、画图片_倾斜到坐标()     类“图片对象”新增  取图像格式()、取各帧延时()、置灰度图蒙版() ◆新增类“APNG解析类”和“多帧图片对象”,多帧图片对象可以合成GIF图片、TIF图片、APNG动画图片(PNG的位图动画格式,属于PNG格式的扩展) ◆新增子程序:_计算三维坐标旋转()、偏移坐标组()、坐标_3D到2D()、坐标_2D到3D() 8.0到9.0版本: ◆分层画板增加了  创建_图片句柄()、画出图元文件()、路径_扩展外观()、路径到区域()、判断坐标与路径的关系()     内存画板新增  画出图元文件();类“图片对象”新增  去除黑底() ◆优化动态矢量画板
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值