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

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

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 <Windows.h>
#include <tchar.h>
#include <stdio.h>

/**
 * 将HBITMAP保存为BMP图片,实现细节见第三节
 */
static void hbitmapToImage(HDC hdc, HBITMAP hbm);

int main(int argc, char *argv[])
{
	// 创建绘制环境
	HDC memDC = CreateCompatibleDC(NULL);
	// 创建画布
	HBITMAP hbm = CreateBitmap(100, 100, 1, 32, NULL);
	// 创建一个字体,其中40是字体大小,参数可以根据自己需求调整
	HFONT hfont = CreateFont(40, 0, 0, 0, FW_THIN, false, false, false, 
		DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, 
		DEFAULT_QUALITY, FF_MODERN, _T("宋体"));
	// 选择画布和字体,你可以保存之前的画布和字体用于恢复,为了篇幅起见,在此就不这样做了
	SelectObject(memDC, hbm);
	SelectObject(memDC, hfont);
	// 开始绘制操作
	RECT imgRect = {0, 0, 100, 100};// 设置为画布的宽高
	SIZE fontPixSize;				// 字符的像素大小,对于一种字体来说,其字符的高是一致的,但是宽基本不同
	// 将背景填充为黑色
	FillRect(memDC, &imgRect, (HBRUSH)GetStockObject(BLACK_BRUSH));
	// 得到字符串的像素宽高,可以为任意字符串
	GetTextExtentPoint32(memDC, _T("我"), 1, &fontPixSize);
	SetTextColor(memDC, RGB(255, 255, 255));	// 设置文本颜色
	SetBkMode(memDC, TRANSPARENT);				// 设置背景模式
	// 计算绘制起始位置,使字符在画布的中间;当然你也可以添加更多的绘制操作,如PolyDraw,LineTo等
	TextOut(memDC, (100 - fontPixSize.cx) / 2, (100 - fontPixSize.cy) / 2, _T("我"), 1);
	// 将HBITMAP保存为BMP图片
	hbitmapToImage(memDC, hbm);
	// 释放资源
	DeleteObject((HGDIOBJ)hfont);
	DeleteObject((HGDIOBJ)hbm);
	DeleteDC(memDC);
	return 0;
}

3      将HBITMAP保存为BMP图片

第2节描述了如何使用GDI在内存中画图,本节介绍如何将HBITMAP保存为BMP图片。代码如下:

/**
 * 将HBITMAP保存为BMP图片
 */
void hbitmapToImage(HDC hdc, HBITMAP hbm)
{
	// 得到hbm中每个像素所占的位数
	int bmPixBitCount = GetDeviceCaps(hdc, BITSPIXEL) * GetDeviceCaps(hdc, PLANES);
	int wBitCount = 0;
	if(bmPixBitCount <=  1)                                                 
		wBitCount = 1;           
	else if(bmPixBitCount <=  4)                             
		wBitCount = 4;           
	else if(bmPixBitCount <=  8)                             
		wBitCount = 8;           
	else                                                                                                                           
		wBitCount = 24;
	//////////////////////////////////////////////////////////////////////////
	BITMAP bm;
	GetObject(hbm, sizeof(bm), &bm);
	int bmRowCount = ((bm.bmWidth * wBitCount + 31) / 32) * 4; // 一行所占的字节数,BMP像素数据按四字节对齐
	int bmByteCount =  bmRowCount * bm.bmHeight; // 像素数据的大小
	char *buf = new char[bmByteCount];
	// 位图信息头结构,定义参考MSDN
	BITMAPINFOHEADER bi;
	bi.biSize= sizeof(BITMAPINFOHEADER);       
	bi.biWidth = bm.bmWidth;       
	bi.biHeight =  bm.bmHeight;       
	bi.biPlanes =  1;       
	bi.biBitCount = wBitCount;       
	bi.biCompression= BI_RGB;       
	bi.biSizeImage=0;       
	bi.biXPelsPerMeter = 0;       
	bi.biYPelsPerMeter = 0;       
	bi.biClrImportant = 0;       
	bi.biClrUsed =  0;
	GetDIBits(hdc, hbm, 0, bm.bmHeight, buf, (BITMAPINFO*)(&bi), DIB_RGB_COLORS); // 得到像素值,保存在buf中
	// 位图文件头结构,定义参考MSDN
	BITMAPFILEHEADER bf;
	bf.bfType = 0x4D42;	// BM
	bf.bfSize = bmByteCount;
	bf.bfReserved1 = 0;
	bf.bfReserved2 = 0;
	bf.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
	// 写入文件
	FILE *bmFile = fopen("demo.bmp", "w+b");
	if (bmFile)
	{
		fwrite(&bf, sizeof(BITMAPFILEHEADER), 1, bmFile);	// 写入位图文件头
		fwrite(&bi, sizeof(BITMAPINFOHEADER), 1, bmFile);	// 写入位图信息头
		fwrite(buf, sizeof(char), bmByteCount, bmFile);		// 写入像素数据
		fclose(bmFile);
	}
	delete []buf;
}

程序运行结果如图1所示:


图1:程序运行结果


内存画板,在内存中创建一个画板画图。 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()
内存画板,在内存中创建一个画板画图。 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版本: ◆分层画板增加了  创建_图片句柄()、画出图元文件()、路径_扩展外观()、路径到区域()、判断坐标与路径的关系()     内存画板新增  画出图元文件();类“图片对象”新增  去除黑底() ◆优化动态矢量画板
内存画板,在内存中创建一个画板画图。 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版本: ◆内存画板新增  图片优化模式()、合并分层画板()、空间坐标变换() ◆新增类“分层画板”,透明画板,更加丰富的画笔画刷设置     类“图片对象”增加了  转换分层画板()
内存画板,在内存中创建一个画板画图。 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个效果(感谢网友“琪诺兔”提供的图片转场效果的源码) ◆新增类“图片编辑类”,结合命令“内存画板.画图片_裁剪”或“图片对象.编辑图片”使用     类“图片对象”增加了  编辑图片()、取图片透明区域()、设置区域内透明()等更多编辑命令 ◆新增子程序:_计算点与圆的切点()、_计算三角形外接圆的圆心半径()、_计算直线与圆的交点()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值