EasyX指导手册
制作人:jianxiawzx
一、基本概念
1.1 颜色
EasyX 使用 24bit 真彩色,不再支持调色板模式。
表示颜色有以下几种办法:
1. 用预定义颜色常量,如下:
常量 | 值 | 颜色 | 常量 | 值 | 颜色 | |
BLACK | 0 | 黑 | DARKGRAY | 0x545454 | 深灰 | |
BLUE | 0xA80000 | 蓝 | LIGHTBLUE | 0xFC5454 | 亮蓝 | |
GREEN | 0x00A800 | 绿 | LIGHTGREEN | 0x54FC54 | 亮绿 | |
CYAN | 0xA8A800 | 青 | LIGHTCYAN | 0xFCFC54 | 亮青 | |
RED | 0x0000A8 | 红 | LIGHTRED | 0x5454FC | 亮红 | |
MAGENTA | 0xA800A8 | 紫 | LIGHTMAGENTA | 0xFC54FC | 亮紫 | |
BROWN | 0x0054A8 | 棕 | YELLOW | 0x54FCFC | 黄 | |
LIGHTGRAY | 0xA8A8A8 | 浅灰 | WHITE | 0xFCFCFC | 白 |
2. 用 16 进制的颜色表示,形式为:
0xbbggrr (bb=蓝,gg=绿,rr=红)
4. 用 HSLtoRGB、HSVtoRGB 转换其他色彩模型到 RGB 颜色。详见 HSLtoRGB、HSVtoRGB。
示例:
以下是部分设置前景色的方法:
setcolor(0xff0000);
setcolor(BLUE);
setcolor(RGB(0, 0, 255));
setcolor(HSLtoRGB(240, 1, 0.5));
1.2 坐标
在 EasyX 中,坐标分两种:逻辑坐标和物理坐标。
逻辑坐标
逻辑坐标是在程序中用于绘图的坐标体系。
坐标默认的原点在屏幕的左上角,X 轴向右为正,Y 轴向下为正,度量单位是象素。
坐标原点可以通过 setorigin() 函数修改;
坐标轴方向可以通过 setaspectratio() 函数修改;
缩放比例可以通过 setaspectratio() 函数修改。
在本手册中,凡是没有注明的坐标,均指逻辑坐标。
物理坐标
物理坐标是描述设备的坐标体系。
坐标原点在屏幕的左上角,X 轴向右为正,Y 轴向下为正,度量单位是象素。
坐标原点、坐标轴方向、缩放比例都不能改变。
1.3 设备
所谓“设备”,简单来说,就是绘图表面。
在 EasyX 中,设备分两种,一种是默认的绘图窗口,另一种是 IMAGE 对象。通过 SetWorkingImage() 函数可以设置当前用于绘图的设备。
设置当前用于绘图的设备后,所有的绘图函数都会绘制在该设备上。
二、绘图函数
2.1 绘图环境相关函数
相关函数和数据如下:
函数或数据 | 描述 |
清除屏幕内容。 | |
初始化绘图窗口。 | |
关闭图形窗口。 | |
获取当前缩放因子。 | |
设置当前缩放因子。 | |
恢复绘图环境为默认值。 | |
设置坐标原点。 | |
设置当前绘图设备的裁剪区。 | |
清除裁剪区的屏幕内容。 | |
获取绘图窗口句柄。 |
2.1.1 clearcliprgn
这个函数用于清空裁剪区的屏幕内容。
void clearcliprgn();
2.1.2 cleardevice
这个函数用于清除屏幕内容。具体的,是用当前背景色清空屏幕,并将当前点移至 (0, 0)。
void cleardevice();
2.1.3 closegraph
这个函数用于关闭图形环境。
void closegraph();
2.1.4 getaspectratio
这个函数用于获取当前缩放因子。
void getaspectratio(float *pxasp,float *pyasp);
参数:pxasp返回 x 方向上的缩放因子。pyasp返回 y 方向上的缩放因子。
2.1.5 GetHWnd
这个函数用于获取绘图窗口句柄。
HWND GetHWnd();
在 Windows 下,句柄是一个窗口的标识,得到句柄后,可以使用 Windows SDK 中的各种命令实现对窗口的控制。
示例:
// 获得窗口句柄
HWND hWnd = GetHWnd();
// 使用 API 函数修改窗口名称
SetWindowText(hWnd, "Hello!");
2.1.6 graphdefaults
这个函数用于重置视图、当前点、绘图色、背景色、线形、填充类型、字体为默认值。
void graphdefaults();
2.1.7initgraph
这个函数用于初始化绘图环境。
HWND initgraph(int Width,int Height,int Flag = NULL);
参数:Width绘图环境的宽度。Height绘图环境的高度。
Style绘图环境的样式,默认为 NULL。可为以下值:
值 | 含义 |
SHOWCONSOLE | 表示可以保留原控制台窗口。 |
2.1.8 setaspectratio
这个函数用于设置当前缩放因子。
void setaspectratio(float xasp,float yasp);
参数:
Xasp x 方向上的缩放因子。例如绘制宽度为 100 的矩形,实际的绘制宽度为 100 * xasp。
Yasp y 方向上的缩放因子。例如绘制高度为 100 的矩形,实际的绘制高度为 100 * yasp。
说明:
如果缩放因子为负,可以实现坐标轴的翻转。例如,执行 setaspectratio(1, -1); 后,可使 y 轴向上为正。
2.1.9 setcliprgn
这个函数用于设置当前绘图设备的裁剪区。
void setcliprgn(HRGN hrgn);
参数:hrgn区域的句柄。创建区域所使用的坐标为物理坐标。如果该值为 NULL,表示取消之前设置的裁剪区。
说明:
HRGN 是 Windows 定义的表示区域的句柄。将该区域设置为裁剪区后,任何区域外的绘图都将无效(但仍然可以通过操作显存在裁剪区外绘图)。
可以使用 Windows GDI 函数创建一个区域。例如,创建矩形区域可以使用函数:
HRGN CreateRectRgn(int left, int top, int right, int bottom);
此外,还可以使用函数 CreateEllipticRgn 创建椭圆形的区域,使用 CreatePolygonRgn 创建多边形的区域等等。还可以使用 CombineRgn 组合区域。更多关于区域的 GDI 函数,请参考 MSDN 中的 Region Functions。
注意:创建区域后,如果不再使用,请执行 DeleteObject(HRGN hrgn) 以释放该区域对应的系统资源。
示例:
以下代码用于创建一个矩形裁剪区,并在该裁剪区内画圆,请观察裁剪效果:
#include <graphics.h>
#include <conio.h>
void main()
{
// 初始化绘图窗口
initgraph(640, 480);
// 创建一个矩形区域
HRGN rgn = CreateRectRgn(100, 100, 200, 200);
// 将该矩形区域设置为裁剪区
setcliprgn(rgn);
// 不再使用 rgn,清理 rgn 占用的系统资源
DeleteObject(rgn);
// 画圆,受裁剪区影响,只显示出四段圆弧
circle(150, 150, 55);
// 取消之前设置的裁剪区
setcliprgn(NULL);
// 画圆,不再受裁剪区影响,显示出一个完整的圆
circle(150, 150, 60);
// 按任意键退出
getch();
closegraph();
}
2.1.10setorigin
这个函数用于设置坐标原点。
void setorigin(int x, int y);
x原点的 x 坐标(使用物理坐标)。y原点的 y 坐标(使用物理坐标)。
2.2 颜色表示及相关函数
2.2.1 相关函数和数据如下:
函数或数据 | 描述 |
获取当前绘图背景色。 | |
获取当前绘图前景色 | |
返回指定颜色中的蓝色值。 | |
返回指定颜色中的绿色值。 | |
返回指定颜色中的红色值。 | |
转换 HSL 颜色为 RGB 颜色。 | |
转换 HSV 颜色为 RGB 颜色。 | |
通过红、绿、蓝颜色分量合成颜色。 | |
转换 RGB 颜色为 灰度颜色。 | |
转换 RGB 颜色为 HSL 颜色。 | |
转换 RGB 颜色为 HSV 颜色。 | |
设置当前绘图背景色。 | |
设置当前绘图前景色。 | |
交换颜色中的红色和蓝色。 |
2.2.2 BGR
BGR 宏用于交换颜色中的红色和蓝色。
COLORREF BGR(COLORREF color);
参数:color需要交换红色和蓝色的颜色。
返回值:
返回交换红色和蓝色后的颜色。
说明:
颜色在内存中的表示形式为:0xbbggrr (bb=蓝,gg=绿,rr=红),但是显存中的颜色表现形式为 0xrrggbb。注意,两者的红色和蓝色是相反的。直接操作显存时,可以通过 BGR 宏交换颜色的红色和蓝色部分。
2.2.3 getbkcolor
这个函数用于获取当前绘图背景色。
COLORREF getbkcolor();
2.2.4 GetBValue
GetBValue 宏用于返回指定颜色中的蓝色值。
BYTE GetBValue(COLORREF rgb);
参数:rgb指定的颜色。
返回值:
指定颜色中的蓝色值,值的范围 0~255。
说明:
GetBValue 宏在 Windows SDK 中定义。
2.2.5 getcolor
这个函数用于获取当前绘图前景色
COLORREF getcolor();
2.2.6 GetGValue
GetGValue 宏用于返回指定颜色中的绿色值。
BYTE GetGValue(COLORREF rgb);
参数:rgb指定的颜色。
返回值:
指定颜色中的绿色值,值的范围 0~255。
说明:
GetGValue 宏在 Windows SDK 中定义。
2.2.7 GetRValue
GetRValue 宏用于返回指定颜色中的红色值。
BYTE GetRValue(COLORREF rgb);
参数:rgb指定的颜色。
返回值:
指定颜色中的红色值,值的范围 0~255。
说明:
GetRValue 宏在 Windows SDK 中定义。
2.2.8 HSLtoRGB
该函数用于转换 HSL 颜色为 RGB 颜色。
COLORREF HSLtoRGB(float H,float S,float L);
参数:
H原 HSL 颜色模型的 Hue(色相) 分量,0 <= H < 360。
S原 HSL 颜色模型的 Saturation(饱和度) 分量,0 <= S <= 1。
L原 HSL 颜色模型的 Lightness(亮度) 分量,0 <= L <= 1。
返回值:
对应的 RGB 颜色。
说明:
HSL 又称 HLS。
HSL 的颜色模型如图所示:
H 是英文 Hue 的首字母,表示色相,即组成可见光谱的单色。红色在 0 度,绿色在 120 度,蓝色在 240 度,以此方向过渡。
S 是英文 Saturation 的首字母,表示饱和度,等于 0 时为灰色。在最大饱和度 1 时,具有最纯的色光。
L 是英文 Lightness 的首字母,表示亮度,等于 0 时为黑色,等于 0.5 时是色彩最鲜明的状态,等于 1 时为白色。
示例:
请参见 示例程序 中的“彩虹”。
2.2.9 HSVtoRGB
该函数用于转换 HSV 颜色为 RGB 颜色。
COLORREF HSVtoRGB(float H,float S,float V);
参数:
H原 HSV 颜色模型的 Hue(色相) 分量,0 <= H < 360。
S原 HSV 颜色模型的 Saturation(饱和度) 分量,0 <= S <= 1。
V原 HSV 颜色模型的 Value(明度) 分量,0 <= V <= 1。
返回值:
对应的 RGB 颜色。
说明:
HSV 又称 HSB。
HSV 的颜色模型如图所示:
H 是英文 Hue 的首字母,表示色相,即组成可见光谱的单色。红色在 0 度,绿色在 120 度,蓝色在 240 度,以此方向过渡。
S 是英文 Saturation 的首字母,表示饱和度,等于 0 时为灰色。在最大饱和度 1 时,每一色相具有最纯的色光。
V 是英文 Value 的首字母,表示明度,等于 0 时为黑色,在最大明度 1 时,是色彩最鲜明的状态。
示例:
HSV 颜色模型类似于 HSL,示例程序 中的“彩虹”是 HSL 模型的操作范例,可以参考。
2.2.10 RGB
RGB 宏用于通过红、绿、蓝颜色分量合成颜色。
COLORREF RGB(
BYTE byRed, // 颜色的红色部分
BYTE byGreen, // 颜色的绿色部分
BYTE byBlue // 颜色的蓝色部分
);
参数:
byRed颜色的红色部分,取值范围:0~255。
byGreen颜色的绿色部分,取值范围:0~255。
byBlue颜色的蓝色部分,取值范围:0~255。
返回值:
返回合成的颜色。
说明:
可以通过 GetRValue、GetGValue、GetBValue 宏从颜色中分离出红、绿、蓝颜色分量。
注:
RGB 宏在 Windows SDK 中定义。
2.2.11 RGBtoGRAY
该函数用于返回与指定颜色对应的灰度值颜色。
COLORREF RGBtoGRAY( COLORREF rgb);
参数:
rgb原 RGB 颜色。
2.2.12 RGBtoHSL
该函数用于转换 RGB 颜色为 HSL 颜色。
void RGBtoHSL(COLORREF rgb,float *H,float *S,float *L);
参数:
rgb原 RGB 颜色。
H用于返回 HSL 颜色模型的 Hue(色相) 分量,0 <= H < 360。
S用于返回 HSL 颜色模型的 Saturation(饱和度) 分量,0 <= S <= 1。
L用于返回 HSL 颜色模型的 Lightness(亮度) 分量,0 <= L <= 1。
说明:
HSL 详见 HSLtoRGB。
2.2.13 RGBtoHSV
该函数用于转换 RGB 颜色为 HSV 颜色。
void RGBtoHSV(COLORREF rgb,float *H,float *S,float *V);
参数:
rgb原 RGB 颜色。
H用于返回 HSV 颜色模型的 Hue(色相) 分量,0 <= H < 360。
S用于返回 HSV 颜色模型的 Saturation(饱和度) 分量,0 <= S <= 1。
V用于返回 HSV 颜色模型的 Value(明度) 分量,0 <= V <= 1。
2.2.14 setbkcolor
这个函数用于设置当前绘图背景色。
void setbkcolor(COLORREF color);
参数:color指定要设置的背景颜色。
说明:
“背景色”是调色板绘图模式下的概念,所谓的背景色,是调色板中编号为 0 的颜色,可以通过修改编号 0 的颜色达到随时修改背景色的目的。在调色板模式下,显存中保存的是每种颜色在调色板中的编号。在 EasyX 中,已经废弃了调色板模式。
真彩色绘图模式下没有调色板,显存中直接保存每个点的颜色,没有背景色的概念。
EasyX 采用真彩色绘图模式,同时使用背景色,目的有两个:
1. 当文字背景不是透明时,指定文字的背景色。
2. 执行 cleardevice() 或 clearcliprgn() 时,使用该颜色清空屏幕或裁剪区。
示例:
以下示例实现在蓝色背景下绘制红色的矩形:
#include <graphics.h>
#include <conio.h>
void main()
{
// 初始化绘图窗口
initgraph(640, 480);
// 设置背景色为蓝色
setbkcolor(BLUE);
// 用背景色清空屏幕
cleardevice();
// 设置绘图色为红色
setcolor(RED);
// 画矩形
rectangle(100, 100, 300, 300);
// 按任意键退出
getch();
closegraph();
}
2.2.15setcolor
这个函数用于设置当前绘图前景色。
void setcolor(COLORREF color);
参数:color要设置的前景颜色。
2.3 绘制图形相关函数
2.3.1 相关函数和数据如下:
函数或数据 | 描述 |
画椭圆弧。 | |
画无边框填充矩形。 | |
画有边框三维填充矩形。 | |
画圆。 | |
画多边形。 | |
画椭圆。 | |
画填充圆。 | |
画填充椭圆。 | |
画填充的多边形。 | |
填充区域。 | |
获取当前填充类型。 | |
获取绘图区的高度。 | |
获取当前线形。 | |
获取点的颜色。 | |
获取绘图区的宽度。 | |
获取当前 x 坐标。 | |
获取当前 y 坐标。 | |
画线。 | |
画线。 | |
画线。 | |
移动当前点。 | |
移动当前点。 | |
画填充椭圆扇形。 | |
画点。 | |
画空心矩形。 | |
设置当前填充类型。 | |
设置当前线形。 | |
设置绘图位操作模式。 |
2.3.2arc
这个函数用于画椭圆弧。
void arc(int left,int top,int right,int bottom,double stangle,double endangle);
参数:
left圆弧所在椭圆的外切矩形的左上角 x 坐标。
top圆弧所在椭圆的外切矩形的左上角 y 坐标。
right圆弧所在椭圆的外切矩形的右下角 x 坐标。
bottom圆弧所在椭圆的外切矩形的右下角 y 坐标。
stangle圆弧的起始角的弧度。
endangle圆弧的终止角的弧度。
2.3.3 bar
这个函数用于画无边框填充矩形。
void bar(int left,int top,int right,int bottom);
参数:
left矩形左部 x 坐标。
top矩形上部 y 坐标。
right矩形右部 x 坐标。
bottom矩形下部 y 坐标。
2.3.4 bar3d
这个函数用于画有边框三维填充矩形。
void bar3d(int left,int top,int right, int bottom,int depth,bool topflag);
参数:
left矩形左部 x 坐标。
top矩形上部 y 坐标。
right矩形右部 x 坐标。
bottom矩形下部 y 坐标。
depth矩形深度。
topflag为 false 时,将不画矩形的三维顶部。该选项可用来画堆叠的三维矩形。
2.3.5 circle
这个函数用于画圆。
void circle(int x,int y,int radius);
参数:
x圆的圆心 x 坐标。
y圆的圆心 y 坐标。
radius圆的半径。
2.3.6 drawpoly
这个函数用于画多边形。
void drawpoly(int numpoints,const int *polypoints);
参数:
numpoints多边形点的个数。
polypoints每个点的坐标,数组元素个数为 numpoints * 2。
该函数并不会自动连接多边形首尾。如果需要画封闭的多边形,请将最后一个点设置为与第一点相同。
以下局部代码绘制一个封闭的三角形:
int points[] = {50, 200, 200, 200, 200, 50, 50, 200};
drawpoly(4, points);
2.3.7 ellipse
这个函数用于画椭圆。
void ellipse(int left,int top,int right,int bottom);
参数:
left椭圆外切矩形的左上角 x 坐标。
top椭圆外切矩形的左上角 y 坐标。
right椭圆外切矩形的右下角 x 坐标。
bottom椭圆外切矩形的右下角 y 坐标。
说明:
由于屏幕像素点坐标是整数,因此用圆心和半径描述的椭圆无法处理直径为偶数的情况。而该函数的参数采用外切矩形来描述椭圆,可以解决这个问题。
当外切矩形为正方形时,可以绘制圆。
2.3.8 fillcircle
这个函数用于画填充圆。
void fillcircle(int x,int y,int radius);
参数:
x圆心的 x 坐标。
y圆心的 y 坐标。
radius圆的半径。
说明:
该函数使用当前线形和当前填充样式绘制有外框的填充圆。
2.3.9 fillellipse
这个函数用于画填充的椭圆。
void fillellipse(int left,int top,int right,int bottom);
参数:
left椭圆外切矩形的左上角 x 坐标。
top椭圆外切矩形的左上角 y 坐标。
right椭圆外切矩形的右下角 x 坐标。
bottom椭圆外切矩形的右下角 y 坐标。
说明:
该函数使用当前线形和当前填充样式绘制有外框的填充椭圆。
由于屏幕像素点坐标是整数,因此用圆心和半径描述的椭圆无法处理直径为偶数的情况。而该函数的参数采用外切矩形来描述椭圆,可以解决这个问题。
当外切矩形为正方形时,可以绘制填充圆。
2.3.10 fillpoly
这个函数用于画填充的多边形。
void fillpoly(int numpoints,const int *polypoints);
参数:
numpoints多边形点的个数。
polypoints每个点的坐标,数组元素个数为 numpoints * 2。该函数会自动连接多边形首尾。
说明:
该函数使用当前线形和当前填充样式绘制有外框的填充多边形。
示例:
以下局部代码绘制一个封闭的填充三角形:
int points[] = {50, 200, 200, 200, 200, 50};
fillpoly(3, points);
2.3.11 floodfill
这个函数用于填充区域。
void floodfill(int x, int y, COLORREF border)
参数:
x待填充区域内任意点的 x 坐标。
y待填充区域内任意点的 y 坐标。
border待填充区域的边界颜色。填充动作在该颜色围成的封闭区域内填充。
说明:
填充动作以 (x, y) 为起点,向周围扩散,直到遇到 border 指定的颜色才会终止。所以,指定的区域必须是封闭的。
填充的颜色和样式可以使用 setfillstyle 函数指定。
2.3.12 getfillstyle
这个函数用于获取当前填充类型。
void getfillstyle(COLORREF *pcolor,int *ppattern = NULL,char *pupattern = NULL);
参数:
pcolor返回当前填充色。
ppattern返回当前填充图案。详见 setfillstyle。
pupattern指向 char[8] 的指针,如果该指针不为空,且当前填充图案为 USER_FILL,返回当前的自定义填充样式。
2.3.13 getheight
这个函数用于获取绘图区高度。
int getheight();
2.3.14 getlinestyle
这个函数用于获取当前线形。
void getlinestyle(int *plinestyle,WORD *pupattern = NULL,int *pthickness = NULL);
参数:
plinestyle返回当前线型。详见 setlinestyle。
pupattern返回当前自定义线形数据。
pthickness返回当前线形宽度。
2.3.15 getpixel
这个函数用于获取点的颜色。
COLORREF getpixel(int x, int y);
参数:
x要获取颜色的 x 坐标。
y要获取颜色的 y 坐标。
2.3.16 getwidth
该函数用于获取绘图区宽度。
int getwidth();
2.3.17 getx
这个函数用于获取当前 x 坐标。
int getx();
2.3.18 gety
这个函数用于获取当前 y 坐标。
int gety();
2.3.19 line
这个函数用于画线。还可以用 linerel 和 lineto 画线。
void line(int x1,int y1,int x2,int y2);
参数:
x1线的起始点的 x 坐标。
y1线的起始点的 y 坐标。
x2线的终止点的 x 坐标。
y2线的终止点的 y 坐标。
2.3.20 linerel
这个函数用于画线。还可以用 line 和 lineto 画线。
void linerel(int dx,int dy);
参数:
dx从“当前点”开始画线,沿 x 轴偏移 dx。
dy从“当前点”开始画线,沿 y 轴偏移 dy。
2.3.21 lineto
这个函数用于画线。还可以用 line 和 linerel 画线。
void lineto(int x,int y);
参数:
x目标点的 x 坐标(从“当前点”开始画线)。
y目标点的 y 坐标(从“当前点”开始画线)。
2.3.22 moverel
这个函数用于移动当前点。有些绘图操作会从“当前点”开始,这个函数可以设置该点。还可以用 moveto 设置当前点。
void moverel(int dx,int dy);
参数:
dx将当前点沿 x 轴移动 dx。
dy将当前点沿 y 轴移动 dy。
2.3.23 moveto
这个函数用于移动当前点。有些绘图操作会从“当前点”开始,这个函数可以设置该点。还可以用 moverel 设置当前点。
void moveto(int x,int y);
参数:
x新的当前点 x 坐标。
y新的当前点 y 坐标。
2.3.24 pie
这个函数用于画填充椭圆扇形。
void pie(int left,int top,int right,int bottom,double stangle,double endangle);
参数:
left扇形所在椭圆的外切矩形的左上角 x 坐标。
top扇形所在椭圆的外切矩形的左上角 y 坐标。
right扇形所在椭圆的外切矩形的右下角 x 坐标。
bottom扇形所在椭圆的外切矩形的右下角 y 坐标。
stangle椭圆扇形的起始角的弧度。
endangle椭圆扇形的终止角的弧度。
2.3.25 putpixel
这个函数用于画点。
void putpixel(int x, int y, COLORREF color);
参数:
x点的 x 坐标。
y点的 y 坐标。
color点的颜色。
2.3.26 rectangle
这个函数用于画空心矩形。
void rectangle(int left,int top,int right,int bottom);
参数:
left矩形左部 x 坐标。
top矩形上部 y 坐标。
right矩形右部 x 坐标。
bottom矩形下部 y 坐标。
2.3.27 setfillstyle
这个函数用于设置当前填充类型。
void setfillstyle(COLORREF color,int pattern = SOLID_FILL,const char *pupattern = NULL);
参数:
color填充颜色。
pattern填充类型,可以是以下宏或值:
宏 | 值 | 含义 |
NULL_FILL | 1 | 不填充 |
SOLID_FILL | 2 | 固实填充 |
BDIAGONAL_FILL | 3 | |
CROSS_FILL | 4 | |
DIAGCROSS_FILL | 5 | |
DOT_FILL | 6 | |
FDIAGONAL_FILL | 7 | |
HORIZONTAL_FILL | 8 | |
VERTICAL_FILL | 9 | |
BDIAGONAL2_FILL | 10 | |
CROSS2_FILL | 11 | |
DIAGCROSS2_FILL | 12 | |
DOT2_FILL | 13 | |
FDIAGONAL2_FILL | 14 | |
HORIZONTAL2_FILL | 15 | |
VERTICAL2_FILL | 16 | |
BDIAGONAL3_FILL | 17 | |
CROSS3_FILL | 18 | |
DIAGCROSS3_FILL | 19 | |
DOT3_FILL | 20 | |
FDIAGONAL3_FILL | 21 | |
HORIZONTAL3_FILL | 22 | |
VERTICAL3_FILL | 23 | |
INTERLEAVE_FILL | 24 | |
PATTERN_FILL | 25 | 指定图案填充。详见 pupattern 参数。 |
pupattern
指定图案填充时的样式,仅当 pattern 为 PATTERN_FILL 时有效。该指针指向 char[8] 数组,该数组表示 8x8 的填充样式。具体的,每个数组元素表示一行的样式,每个 char 元素有 8 位,按位从高到低表示从左到右,每个位表示一个点的状态,由此组成 8x8 的区域。
示例:
设置蓝色固实填充:
setfillstyle(BLUE);
设置红色斜线填充:
setfillstyle(RED, LTSLASH_FILL);
设置黄色的自定义的填充样式(圆形图案填充):
setfillstyle(YELLOW, PATTERN_FILL, "\x3e\x41\x80\x80\x80\x80\x80\x41");
设置绿色的自定义的填充样式(细斜线夹粗斜线图案填充):
setfillstyle(GREEN, PATTERN_FILL, "\x5a\x2d\x96\x4b\xa5\xd2\x69\xb4");
2.3.28 setlinestyle
这个函数用于设置当前线形。
void setlinestyle(int linestyle,WORD upattern = NULL,int thickness = 1);
参数:
linestyle线型,可以是以下值:
值 | 含义 |
PS_SOLID | 线形为实线。 |
PS_DASH | 线形为:------------ |
PS_DOT | 线形为:············ |
PS_DASHDOT | 线形为:-·-·-·-·-·-· |
PS_DASHDOTDOT | 线形为:-··-··-··-·· |
PS_NULL | 线形为不可见。 |
PS_USERSTYLE | 线形样式是自定义的,依赖于 upattern 参数。 |
upattern自定义线形数据。
自定义规则:该数据为 WORD 类型,共 16 个二进制位,每位为 1 表示画线,为 0 表示空白。从低位到高位表示从起始到终止的方向。
仅当线型为 PS_USERSTYLE 时该参数有效。
thickness线形宽度。
示例:
设置线形为点划线: setlinestyle(PS_DASHDOT);
设置线形为宽度 3 像素的虚线: setlinestyle(PS_DASH, NULL, 3);
2.3.29 setwritemode
这个函数用于设置绘图位操作模式。
void setwritemode(int mode);
参数:
mode二元光栅操作码(即位操作模式),支持全部的 16 种二元光栅操作码,罗列如下:
位操作模式 | 描述 |
R2_BLACK | 绘制出的像素颜色 = 黑色 |
R2_COPYPEN | 绘制出的像素颜色 = 当前颜色(默认) |
R2_MASKNOTPEN | 绘制出的像素颜色 = 屏幕颜色 AND (NOT 当前颜色) |
R2_MASKPEN | 绘制出的像素颜色 = 屏幕颜色 AND 当前颜色 |
R2_MASKPENNOT | 绘制出的像素颜色 = (NOT 屏幕颜色) AND 当前颜色 |
R2_MERGENOTPEN | 绘制出的像素颜色 = 屏幕颜色 OR (NOT 当前颜色) |
R2_MERGEPEN | 绘制出的像素颜色 = 屏幕颜色 OR 当前颜色 |
R2_MERGEPENNOT | 绘制出的像素颜色 = (NOT 屏幕颜色) OR 当前颜色 |
R2_NOP | 绘制出的像素颜色 = 屏幕颜色 |
R2_NOT | 绘制出的像素颜色 = NOT 屏幕颜色 |
R2_NOTCOPYPEN | 绘制出的像素颜色 = NOT 当前颜色 |
R2_NOTMASKPEN | 绘制出的像素颜色 = NOT (屏幕颜色 AND 当前颜色) |
R2_NOTMERGEPEN | 绘制出的像素颜色 = NOT (屏幕颜色 OR 当前颜色) |
R2_NOTXORPEN | 绘制出的像素颜色 = NOT (屏幕颜色 XOR 当前颜色) |
R2_WHITE | 绘制出的像素颜色 = 白色 |
R2_XORPEN | 绘制出的像素颜色 = 屏幕颜色 XOR 当前颜色 |
注:
1. AND / OR / NOT / XOR 为布尔运算。
2. "屏幕颜色"指绘制所经过的屏幕像素点的颜色。
3. "当前颜色"是指通过 setcolor 设置的用于当前绘制的颜色。
2.4 文字输出相关函数
2.4.1 相关函数和数据如下:
函数或数据 | 描述 |
获取当前字体样式。 | |
保存字体样式的结构体。 | |
在当前位置输出字符串。 | |
在指定位置输出字符串。 | |
在指定区域内以指定格式输出字符串。 | |
设置输出文字时的背景模式。 | |
设置当前字体样式。 | |
获取字符串实际占用的像素高度。 | |
获取字符串实际占用的像素宽度。 |
2.4.2 drawtext
这个函数用于在指定区域内以指定格式输出字符串。
int drawtext(LPCTSTR str,RECT* pRect,UINT uFormat);
int drawtext(TCHAR c,RECT* pRect,UINT uFormat);
参数:
str待输出的字符串。
pRect指定的矩形区域的指针。某些 uFormat 标志会使用这个矩形区域做返回值。详见后文说明。
uFormat指定格式化输出文字的方法。详见后文说明。
C待输出的字符。
返回值:
函数执行成功时,返回文字的高度。
如果指定了 DT_VCENTER 或 DT_BOTTOM 标志,返回值表示从 pRect->top 到输出文字的底部的偏移量。
如果函数执行失败,返回 0。
说明:
注:下文关于文字位置的描述,均是相对于 pRect 指向的矩形而言。
标志 | 描述 |
DT_BOTTOM | 调整文字位置到矩形底部,仅当和 DT_SINGLELINE 一起使用时有效。 |
DT_CALCRECT | 检测矩形的宽高。如果有多行文字,drawtext 使用 pRect 指定的宽度,并且扩展矩形的底部以容纳每一行文字。如果只有一行文字,drawtext 修改 pRect 的右边以容纳最后一个文字。无论哪种情况,drawtext 都返回格式化后的文字高度,并且不输出文字。 |
DT_CENTER | 文字水平居中。 |
DT_EDITCONTROL | 以单行编辑的方式复制可见文本。具体的说,就是以字符的平均宽度为计算依据,同时用这个方式应用于编辑控制,并且这种方式不显示可见部分的最后一行。 |
DT_END_ELLIPSIS | 对于文本显示,如果字符串的末字符不在矩形内,它会被截断并以省略号标识。 如果是一个单词而不是一个字符,其末尾超出了矩形范围,它不会被截断。 |
DT_EXPANDTABS | 展开 TAB 符号。 默认每个 TAB 占8个字符位置。注意,DT_WORD_ELLIPSIS、DT_PATH_ELLIPSIS 和 DT_END_ELLIPSIS 不能和 DT_EXPANDTABS 一起用。 |
DT_EXTERNALLEADING | 在行高里包含字体的行间距。通常情况下,行间距不被包含在正文的行高里。 |
DT_HIDEPREFIX | Windows 2000/XP:忽略文字中的前缀字符(&),并且前缀字符后面的字符不会出现下划线。其他前缀字符仍会被处理。例如: 输入字符串: "A&bc&&d" 通常输出: "Abc&d" DTDT_HIDEPREFIX: "Abc&d" |
DT_INTERNAL | 使用系统字体计算文字的宽高等属性。 |
DT_LEFT | 文字左对齐。 |
DT_MODIFYSTRING | 修改指定字符串为显示出的正文。仅当和 DT_END_ELLIPSIS 或 DT_PATH_ELLIPSIS 标志同时使用时有效。 |
DT_NOCLIP | 使输出文字不受 pRect 裁剪限制。使用 DT_NOCLIP 会使 drawtext 执行稍快一些。 |
DT_NOFULLWIDTHCHARBREAK | Windows 2000/XP:防止换行符插入到 DBCS (double-wide character string,即宽字符串),换行规则相当于 SBCS 字符串。仅当和 DT_WORDBREAK 一起使用时有效。例如,汉字就是宽字符,设置该标志后,连续的汉字会像英文单词一样不被换行符中断。 |
DT_NOPREFIX | 关闭前缀字符的处理。通常,DrawText 解释前缀转义符 & 为其后的字符加下划线,解释 && 为显示单个 &。指定 DT_NOPREFIX,这种处理被关闭。例如: 输入字符串: "A&bc&&d" 通常输出: "Abc&d" DT_NOPREFIX: "A&bc&&d" |
DT_PATH_ELLIPSIS | 对于显示的文字,用省略号替换字符串中间的字符以便容纳于矩形内。如果字符串包含反斜杠(\),DT_PATH_ELLIPSIS 尽可能的保留最后一个反斜杠后面的文字。 |
DT_PREFIXONLY | Windows 2000/XP:仅仅在(&)前缀字符的位置下绘制一个下划线。不绘制字符串中的任何其他字符。例如: 输入字符串: "A&bc&&d" 通常输出: "Abc&d" DT_PREFIXONLY: " _ " |
DT_RIGHT | 文字右对齐。 |
DT_RTLREADING | 设置从右向左的阅读顺序(当文字是希伯来文或阿拉伯文时)。默认的阅读顺序是从左向右。 |
DT_SINGLELINE | 使文字显示在一行。回车和换行符都无效。 |
DT_TABSTOP | 设置 TAB 制表位。uFormat 的 15–8 位指定 TAB 的字符宽度。默认 TAB 表示 8 个字符宽度。注意,DT_CALCRECT、DT_EXTERNALLEADING、DT_INTERNAL、DT_NOCLIP 和 DT_NOPREFIX 不能和 DT_TABSTOP 一起用。 |
DT_TOP | 文字顶部对齐。 |
DT_VCENTER | 文字垂直居中。仅当和 DT_SINGLELINE 一起使用时有效。 |
DT_WORDBREAK | 自动换行。当文字超过右边界时会自动换行(不拆开单词)。回车符同样可以换行。 |
DT_WORD_ELLIPSIS | 截去无法容纳的文字,并在末尾增加省略号。 |
示例:
以下范例在屏幕中央输出字符串“Hello World”:
#include <graphics.h>
#include <conio.h>
void main()
{
// 绘图环境初始化
initgraph(640, 480);
// 在屏幕中央输出字符串
RECT r = {0, 0, 640, 480};
drawtext("Hello World", &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
// 按任意键退出
getch();
closegraph();
}
2.4.3 getfont
这个函数用于获取当前字体样式。
void getfont(LOGFONT *font);
参数:
font指向 LOGFONT 结构体的指针。
2.4.4 LOGFONT
这个结构体定义了字体的属性。
struct LOGFONT {LONG lfHeight;LONG lfWidth,LONG lfEscapement;LONG lfOrientati,
LONG lfWeight;BYTE lfItalic;BYTE lfUnderline,BYTE lfStrikeOut;
BYTE lfCharSet;BYTE lfOutPrecision;BYTE lfClipPrecision;
BYTE lfQuality,BYTE lfPitchAndFamily;
TCHAR lfFaceName[LF_FACESIZE];};
成员
lfHeight指定高度(逻辑单位)。
lfWidth指定字符的平均宽度(逻辑单位)。如果为 0,则比例自适应。
lfEscapement字符串的书写角度,单位 0.1 度,默认为 0。
lfOrientation每个字符的书写角度,单位 0.1 度,默认为 0。
lfWeight字符的笔画粗细,范围 0~1000,0 表示默认粗细,使用数字或下表中定义的宏均可。
宏 | 粗细值 |
FW_DONTCARE | 0 |
FW_THIN | 100 |
FW_EXTRALIGHT | 200 |
FW_ULTRALIGHT | 200 |
FW_LIGHT | 300 |
FW_NORMAL | 400 |
FW_REGULAR | 400 |
FW_MEDIUM | 500 |
FW_SEMIBOLD | 600 |
FW_DEMIBOLD | 600 |
FW_BOLD | 700 |
FW_EXTRABOLD | 800 |
FW_ULTRABOLD | 800 |
FW_HEAVY | 900 |
FW_BLACK | 900 |
lfItalic指定字体是否是斜体。
lfUnderline指定字体是否有下划线。
lfStrikeOut指定字体是否有删除线。
lfCharSet指定字符集。可以使用以下预定义的值:
ANSI_CHARSET
BALTIC_CHARSET
CHINESEBIG5_CHARSET
DEFAULT_CHARSET
EASTEUROPE_CHARSET
GB2312_CHARSET
GREEK_CHARSET
HANGUL_CHARSET
MAC_CHARSET
OEM_CHARSET
RUSSIAN_CHARSET
SHIFTJIS_CHARSET
SYMBOL_CHARSET
TURKISH_CHARSET
其中,OEM_CHARSET 表示字符集依赖本地操作系统。
DEFAULT_CHARSET 表示字符集基于本地操作系统。例如,系统位置是 English (United States),字符集将设置为 ANSI_CHARSET。
lfOutPrecision指定文字的输出精度。输出精度定义输出与所请求的字体高度、宽度、字符方向、行距、间距和字体类型相匹配必须达到的匹配程度。可以是以下值:
值 | 含义 |
OUT_DEFAULT_PRECIS | 指定默认的映射行为。 |
OUT_DEVICE_PRECIS | 当系统包含多个名称相同的字体时,指定设备字体。 |
OUT_OUTLINE_PRECIS | 指定字体映射选择 TrueType 和其它的 outline-based 字体。 |
OUT_RASTER_PRECIS | 当系统包含多个名称相同的字体时,指定光栅字体(即点阵字体)。 |
OUT_STRING_PRECIS | 这个值并不能用于指定字体映射,只是指定点阵字体枚举数据。 |
OUT_STROKE_PRECIS | 这个值并不能用于指定字体映射,只是指定 TrueType 和其他的 outline-based 字体,以及矢量字体的枚举数据。 |
OUT_TT_ONLY_PRECIS | 指定字体映射只选择 TrueType 字体。如果系统中没有安装 TrueType 字体,将选择默认操作。 |
OUT_TT_PRECIS | 当系统包含多个名称相同的字体时,指定 TrueType 字体。 |
lfClipPrecision指定文字的剪辑精度。剪辑精度定义如何剪辑字符的一部分位于剪辑区域之外的字符。可以是以下值:
值 | 含义 |
CLIP_DEFAULT_PRECIS | 指定默认的剪辑行为。 |
CLIP_STROKE_PRECIS | 这个值并不能用于指定字体映射,只是指定光栅(即点阵)、矢量或 TrueType 字体的枚举数据。 |
CLIP_EMBEDDED | 当使用内嵌的只读字体时,必须指定这个标志。 |
CLIP_LH_ANGLES | 如果指定了该值,所有字体的旋转都依赖于坐标系统的方向是逆时针或顺时针。 |
lfQuality指定文字的输出质量。输出质量定义图形设备界面 (GDI) 必须尝试将逻辑字体属性与实际物理字体的字体属性进行匹配的仔细程度。可以是以下值:
值 | 含义 |
ANTIALIASED_QUALITY | 指定输出质量是抗锯齿的(如果字体支持)。 |
DEFAULT_QUALITY | 指定输出质量不重要。 |
DRAFT_QUALITY | 草稿质量。字体的显示质量是不重要的。对于光栅字体(即点阵字体),缩放是有效的,这就意味着可以使用更多的尺寸,但是显示质量并不高。如果需要,粗体、斜体、下划线和删除线字体会被合成。 |
NONANTIALIASED_QUALITY | 指定输出质量不是抗锯齿的。 |
PROOF_QUALITY | 正稿质量。指定字体质量比匹配字体属性更重要。对于光栅字体(即点阵字体),缩放是无效的,会选用其最接近的字体大小。虽然选中 PROOF_QUALITY 时字体大小不能精确地映射,但是输出质量很高,并且不会有畸变现象。如果需要,粗体、斜体、下划线和删除线字体会被合成。 |
如果 ANTIALIASED_QUALITY 和 NONANTIALIASED_QUALITY 都未被选择,抗锯齿效果将依赖于控制面板中字体抗锯齿的设置。
lfPitchAndFamily指定以常规方式描述字体的字体系列。字体系列描述大致的字体外观。字体系列用于在所需精确字体不可用时指定字体。
1~2 位指定字体间距,可以是以下值:
值 | 含义 |
DEFAULT_PITCH | 指定默认间距。 |
FIXED_PITCH | 指定固定间距。 |
VARIABLE_PITCH | 指定可变间距。 |
4~7 位指定字体系列,可以是以下值:
值 | 含义 |
FF_DECORATIVE | 指定特殊字体。例如 Old English。 |
FF_DONTCARE | 指定字体系列不重要。 |
FF_MODERN | 指定具有或不具有衬线的等宽字体。例如,Pica、Elite 和 Courier New 都是等宽字体。 |
FF_ROMAN | 指定具有衬线的等比字体。例如 MS Serif。 |
FF_SCRIPT | 指定设计为类似手写体的字体。例如 Script 和 Cursive。 |
FF_SWISS | 指定不具有衬线的等比字体。例如 MS Sans Serif。 |
字体间距和字体系列可以用布尔运算符 OR 连接(即符号 |)。
lfFaceName字体名称,名称不得超过 31 个字符。如果是空字符串,系统将使用第一个满足其它属性的字体。
2.4.5 outtext
这个函数用于在当前位置输出字符串。
void outtext(LPCTSTR str);
void outtext(TCHAR c);
参数:
str待输出的字符串的指针。
c待输出的字符。
说明:
该函数会改变当前位置至字符串末尾。所以,可以连续使用该函数使输出的字符串保持连续。
示例:
// 输出字符串
char s[] = "Hello World";
outtext(s);
// 输出字符
char c = 'A';
outtext(c);
// 输出数值,先将数字格式化输出为字符串
char s[5];
sprintf(s, "%d", 1024);
outtext(s);
2.4.6 outtextxy
这个函数用于在指定位置输出字符串。
void outtextxy(int x,int y,LPCTSTR str);
void outtextxy(int x,int y,TCHAR c);
参数:
x字符串输出时头字母的 x 轴的坐标值
y字符串输出时头字母的 y 轴的坐标值。
str待输出的字符串的指针。
c待输出的字符。
说明:
该函数不会改变当前位置。
示例:
// 输出字符串
char s[] = "Hello World";
outtextxy(10, 20, s);
// 输出字符
char c = 'A';
outtextxy(10, 40, c);
// 输出数值,先将数字格式化输出为字符串
char s[5];
sprintf(s, "%d", 1024);
outtextxy(10, 60, s);
2.4.7 setbkmode
这个函数用于设置输出文字时的背景模式。
void setbkmode(int iBkMode);
参数:iBkMode
指定输出文字时的背景模式,可以是以下值:
值 | 描述 |
OPAQUE | 背景用当前背景色填充(默认)。 |
TRANSPARENT | 背景是透明的。 |
2.4.8 setfont
这个函数用于设置当前字体样式。
void setfont(int nHeight,int nWidth,LPCTSTR lpszFace);
void setfont(int nHeight,int nWidth,LPCTSTR lpszFace,int nEscapement,int nOrientation,
int nWeight,bool bItalic,bool bUnderline,bool bStrikeOut);
void setfont(int nHeight,int nWidth,LPCTSTR lpszFace,int nEscapement,int nOrientation,
int nWeight,bool bItalic,bool bUnderline,bool bStrikeOut,
BYTE fbCharSet,BYTEfbOutPrecision,BYTE fbClipPrecision,BYTE fbQuality,
BYTE fbPitchAndFamily);
void setfont(const LOGFONT *font);
参数:
nHeigh 指定高度(逻辑单位)。
nWidth字符的平均宽度(逻辑单位)。如果为 0,则比例自适应。
lpszFace字体名称。
nEscapement字符串的书写角度,单位 0.1 度。
nOrientation每个字符的书写角度,单位 0.1 度。
nWeight字符的笔画粗细,范围 0~1000。0 表示默认粗细。使用数字或下表中定义的宏均可:
宏 | 粗细值 |
FW_DONTCARE | 0 |
FW_THIN | 100 |
FW_EXTRALIGHT | 200 |
FW_ULTRALIGHT | 200 |
FW_LIGHT | 300 |
FW_NORMAL | 400 |
FW_REGULAR | 400 |
FW_MEDIUM | 500 |
FW_SEMIBOLD | 600 |
FW_DEMIBOLD | 600 |
FW_BOLD | 700 |
FW_EXTRABOLD | 800 |
FW_ULTRABOLD | 800 |
FW_HEAVY | 900 |
FW_BLACK | 900 |
bItalic是否斜体,true / false。
bUnderline是否有下划线,true / false。
bStrikeOut是否有删除线,true / false。
fbCharSet\指定字符集(详见 LOGFONT 结构体)。
fbOutPrecision指定文字的输出精度(详见 LOGFONT 结构体)。
fbClipPrecision指定文字的剪辑精度(详见 LOGFONT 结构体)。
fbQuality指定文字的输出质量(详见 LOGFONT 结构体)。
fbPitchAndFamily指定以常规方式描述字体的字体系列(详见 LOGFONT 结构体)。
font指向 LOGFONT 结构体的指针。
示例:
// 设置当前字体为高 16 像素的“宋体”。
setfont(16, 0,"宋体");
outtextxy(0, 0,"测试");
// 设置输出效果为抗锯齿
LOGFONT f;
getfont(&f); // 获取当前字体设置
f.lfHeight = 48; // 设置字体高度为 48
strcpy(f.lfFaceName, "黑体"); // 设置字体为“黑体”
f.lfQuality = ANTIALIASED_QUALITY; // 设置输出效果为抗锯齿
setfont(&f); // 设置字体样式
outtextxy(0,50,"抗锯齿效果");
2.4.9 textheight
这个函数用于获取字符串实际占用的像素高度。
int textheight(LPCTSTR str);
int textheight(TCHAR c);
参数:
Str指定的字符串指针。
c指定的字符。
返回值:
该字符串实际占用的像素高度。
2.4.10 textwidth
这个函数用于获取字符串实际占用的像素宽度。
int textwidth(LPCTSTR str);
int textwidth(TCHAR c);
参数:
str指定的字符串指针。
c指定的字符。
返回值:
该字符串实际占用的像素宽度。
2.5 图像处理相关函数
2.5.1 相关函数和数据如下:
函数或数据 | 描述 |
保存图像的对象。 | |
读取图片文件。 | |
保存绘图内容至图片文件。 | |
从当前绘图设备中获取图像。 | |
在当前绘图设备上绘制指定图像。 | |
获取指向当前绘图设备的指针。 | |
旋转 IMAGE 中的绘图内容。 | |
设定当前绘图设备。 | |
调整指定绘图设备的尺寸。 | |
获取绘图设备的显存指针。 | |
获取绘图设备句柄。 |
2.5.1 getimage
这个函数用于从当前绘图设备中获取图像。
// 从当前绘图设备获取图像
void getimage(IMAGE* pDstImg, int srcX, int srcY, int srcWidth, int srcHeight);
参数:
pDstImg保存图像的 IMAGE 对象指针。
srcX要获取图像区域的左上角 x 坐标。
srcY要获取图像区域的左上角 y 坐标。
srcWidth要获取图像区域的宽度。
srcHeight要获取图像区域的高度。
示例:
请参考 putimage 函数示例。
2.5.2 GetImageBuffer
这个函数用于获取绘图设备的显存指针。
DWORD* GetImageBuffer(IMAGE* pImg = NULL);
参数:
pImg绘图设备指针。如果为 NULL,表示默认的绘图窗口。
返回值:
返回绘图设备的显存指针。
说明:
获取到的显存指针可以直接读写。
在显存中,每个点占用 4 个字节,因此:显存的大小 = 宽度 × 高度 × 4 (字节)。像素点在显存中按照从左到右、从上向下的顺序依次排列。访问显存请勿越界,否则会造成难以预料的后果。
显存中的每个点对应 RGBTRIPLE 类型的结构体:
struct RGBTRIPLE {BYTE rgbtBlue;BYTE rgbtGreen;BYTE rgbtRed;}
RGBTRIPLE 在内存中的表示形式为:0xrrggbb (bb=蓝,gg=绿,rr=红),而常用的 COLORREF 在内存中的表示形式为:0xbbggrr。注意,两者的红色和蓝色是相反的,请用 BGR 宏交换红色和蓝色。
如果操作绘图窗口的显存,请在操作完毕后,执行 FlushBatchDraw() 使操作生效。
示例:
以下代码通过直接操作显存绘制渐变的蓝色:
#include <graphics.h>
#include <conio.h>
void main()
{
// 初始化绘图窗口
initgraph(640, 480);
// 获取指向显存的指针
DWORD* pMem = GetImageBuffer();
// 直接对显存赋值
for(int i = 0; i < 640 * 480; i++)
pMem[i] = BGR(RGB(0, 0, i * 256 / (640 * 480) ));
// 使显存生效(注:操作指向 IMAGE 的显存不需要这条语句)
FlushBatchDraw();
// 按任意键退出
getch();
closegraph();
}
2.5.3 GetImageHDC
这个函数用于获取绘图设备句柄(HDC)。
HDC GetImageHDC(IMAGE* pImg = NULL);
参数:
pImg绘图设备指针。如果为 NULL,表示默认的绘图窗口。
返回值:
返回绘图设备句柄(HDC)。
说明:
获取到的 HDC 句柄可以用在 Windows GDI 函数中。
每个 IMAGE 对象都有一个 HDC 句柄,可以通过 HDC 句柄实现对该 IMAGE 的 GDI 函数操作。在同一个 IMAGE 设备中,请勿混用 EasyX 绘图函数和 GDI 绘图函数。
如果获取默认绘图窗口的 HDC 句柄,那么执行 GDI 函数后并不会直接显示到屏幕上,请执行 FlushBatchDraw() 显示之前的 GDI 操作效果。
示例:
#include <graphics.h>
#include <conio.h>
void main()
{
// 初始化绘图窗口
initgraph(640, 480);
// 获取默认绘图窗口的 HDC 句柄
HDC hdc = GetImageHDC();
// 执行 Windows GDI 绘图函数
MoveToEx(hdc, 10, 10, NULL);
LineTo(hdc, 100, 100);
// 使之前的 Windows GDI 绘图生效
FlushBatchDraw();
// 创建大小为 200x200 的 img 对象
IMAGE img(200, 200);
// 获取该 img 对象的 HDC 句柄
hdc = GetImageHDC(&img);
// 执行 Windows GDI 绘图函数
Ellipse(hdc, 0, 50, 199, 150);
// 将 img 对象显示到绘图窗口上面
putimage(100, 0, &img);
// 按任意键退出
getch();
closegraph();
}
2.5.4 GetWorkingImage
这个函数用于获取当前的绘图设备。
IMAGE* GetWorkingImage();
返回值:
返回指向当前绘图设备的指针。如果返回值为 NULL,表示当前绘图设备为绘图窗口。
2.5.5 IMAGE
保存图像的对象。
class IMAGE(int width = 0, int height = 0);
成员:
(隐藏)
由于 EasyX 库面向初学者,所以尽力隐藏了面向对象的内容。
示例:以下语句可以创建一个名为 img 的 IMAGE 对象:
IMAGE img;
更多示例请参考 putimage 函数示例。
2.5.6 loadimage
这个函数用于从文件中读取图像。
// 从图片文件获取图像(bmp/jpg/gif/emf/wmf/ico)
void loadimage(
IMAGE* pDstImg, // 保存图像的 IMAGE 对象指针
LPCTSTR pImgFile, // 图片文件名
int nWidth = 0, // 图片的拉伸宽度
int nHeight = 0, // 图片的拉伸高度
bool bResize = false // 是否调整 IMAGE 的大小以适应图片
);
// 从资源文件获取图像(bmp/jpg/gif/emf/wmf/ico)
void loadimage(
IMAGE* pDstImg, // 保存图像的 IMAGE 对象指针
LPCTSTR pResType, // 资源类型
LPCTSTR pResName, // 资源名称
int nWidth = 0, // 图片的拉伸宽度
int nHeight = 0, // 图片的拉伸高度
bool bResize = false // 是否调整 IMAGE 的大小以适应图片
);
参数:
pDstImg
保存图像的 IMAGE 对象指针。如果为 NULL,表示图片将读取至绘图窗口。
pImgFile
图片文件名。支持 bmp / jpg / gif / emf / wmf / ico 类型的图片。gif 类型的图片仅加载第一帧,不支持透明。
nWidth
图片的拉伸宽度。加载图片后,会拉伸至该宽度。对于矢量图片十分有用。
nHeight
图片的拉伸高度。加载图片后,会拉伸至该高度。对于矢量图片十分有用。
bResize
是否调整 IMAGE 的大小以适应图片。
pResType
图片资源类型。
pResName
图片资源名称。
说明:
如果创建 IMAGE 对象的时候没有指定宽高,可以通过 Resize 函数设置。
对于没有设置宽高的 IMAGE 对象,执行 loadimage 会将其宽高设置为和读取的图片一样的尺寸。
示例:
以下范例加载图片“D:\test.jpg”至绘图窗口:
#include <graphics.h>
#include <conio.h>
// 主函数
void main()
{
// 绘图环境初始化
initgraph(640, 480);
// 读取图片至绘图窗口
loadimage(NULL, "D:\\test.jpg");
// 按任意键退出
getch();
closegraph();
}
2.5.7 putimage
这个函数的几个重载用于在当前设备上绘制指定图像。
// 绘制图像
void putimage(
int dstX, // 绘制位置的 x 坐标
int dstY, // 绘制位置的 y 坐标
IMAGE *pSrcImg, // 要绘制的 IMAGE 对象指针
DWORD dwRop = SRCCOPY // 三元光栅操作码(详见备注)
);
// 绘制图像(指定宽高和起始位置)
void putimage(
int dstX, // 绘制位置的 x 坐标
int dstY, // 绘制位置的 y 坐标
int dstWidth, // 绘制的宽度
int dstHeight, // 绘制的高度
IMAGE *pSrcImg, // 要绘制的 IMAGE 对象指针
int srcX, // 绘制内容在 IMAGE 对象中的左上角 x 坐标
int srcY, // 绘制内容在 IMAGE 对象中的左上角 y 坐标
DWORD dwRop = SRCCOPY // 三元光栅操作码(详见备注)
);
参数:
(详见各重载函数原型内的注释)
备注:
三元光栅操作码(即位操作模式),支持全部的 256 种三元光栅操作码,常用的几种如下:
值 | 含义 |
DSTINVERT | 绘制出的像素颜色 = NOT 屏幕颜色 |
MERGECOPY | 绘制出的像素颜色 = 图像颜色 AND 当前填充颜色 |
MERGEPAINT | 绘制出的像素颜色 = 屏幕颜色 OR (NOT 图像颜色) |
NOTSRCCOPY | 绘制出的像素颜色 = NOT 图像颜色 |
NOTSRCERASE | 绘制出的像素颜色 = NOT (屏幕颜色 OR 图像颜色) |
PATCOPY | 绘制出的像素颜色 = 当前填充颜色 |
PATINVERT | 绘制出的像素颜色 = 屏幕颜色 XOR 当前填充颜色 |
PATPAINT | 绘制出的像素颜色 = 屏幕颜色 OR ((NOT 图像颜色) OR 当前填充颜色) |
SRCAND | 绘制出的像素颜色 = 屏幕颜色 AND 图像颜色 |
SRCCOPY | 绘制出的像素颜色 = 图像颜色 |
SRCERASE | 绘制出的像素颜色 = (NOT 屏幕颜色) AND 图像颜色 |
SRCINVERT | 绘制出的像素颜色 = 屏幕颜色 XOR 图像颜色 |
SRCPAINT | 绘制出的像素颜色 = 屏幕颜色 OR 图像颜色 |
注:
1. AND / OR / NOT / XOR 为布尔运算。
2. "屏幕颜色"指绘制所经过的屏幕像素点的颜色。
3. "图像颜色"是指通过 IMAGE 对象中的图像的颜色。
4. "当前填充颜色"是指通过 setfillstyle 设置的用于当前填充的颜色。
5. 查看全部的三元光栅操作码请点这里:三元光栅操作码。
示例:
以下局部代码将屏幕 (0,0) 起始的 100x100 的图像拷贝至 (200,200) 位置:
IMAGE img;
getimage(&img, 0, 0, 100, 100);
putimage(200, 200, &img);
2.5.8 Resize
这个函数用于调整指定绘图设备的尺寸。
void Resize(IMAGE* pImg, int width, int height);
参数:
pImg指定要调整尺寸的绘图设备。如果为 NULL,则表示默认绘图窗口。
width指定绘图设备的宽度。
height指定绘图设备的高度。
2.5.9 rotateimage
这个函数用于旋转 IMAGE 中的绘图内容。
void rotateimage(IMAGE *dstimg,IMAGE *srcimg,double radian,
COLORREF bkcolor = BLACK,bool autosize = false,bool highquality = true);
参数:
dstimg指定目标 IMAGE 对象指针,用来保存旋转后的图像。
srcimg指定原 IMAGE 对象指针。
radian指定旋转的弧度。
bkcolor指定旋转后产生的空白区域的颜色。默认为黑色。
autosize指定目标 IMAGE 对象是否自动调整尺寸以完全容纳旋转后的图像。默认为 false。
srcimg指定是否采用高质量的旋转。在追求性能的场合请使用低质量旋转。默认为 true。
示例:
以下示例加载图片 "C:\\test.jpg" 并旋转 30 度 (PI / 6),然后显示在左上角:
#include <graphics.h>
#include <conio.h>
#define PI 3.1415926535
void main()
{
// 绘图环境初始化
initgraph(640, 480);
// 定义图像
IMAGE img1, img2;
// 从文件加载图像
loadimage(&img1, _T("C:\\test.jpg"));
// 旋转图像 30 度 (PI / 6)
rotateimage(&img2, &img1, PI / 6);
// 显示旋转后的图像
putimage(0, 0, &img2);
// 按任意键退出
getch();
closegraph();
}
2.5.10 saveimage
这个函数用于保存绘图内容至图片文件。
void saveimage(LPCTSTR strFileName,IMAGE* pImg = NULL);
参数:
strFileName指定文件名。pImg 指向的图片将保存到该文件中,图片以 BMP 格式保存,已存在的文件将被覆盖。
pImg指向 IMAGE 对象的指针。如果为 NULL,表示绘图窗口。
示例:
以下示例保存绘图窗口的内容为 "D:\\test.bmp":
#include <graphics.h>
#include <conio.h>
void main()
{
// 绘图环境初始化
initgraph(640, 480);
// 绘制图像
outtextxy(100, 100, "Hello World!");
// 保存绘制的图像
saveimage("D:\\test.bmp");
// 按任意键退出
getch();
closegraph();
}
2.5.11 SetWorkingImage
这个函数用于设定当前的绘图设备。
void SetWorkingImage(IMAGE* pImg = NULL);
参数:
pImg绘图设备指针。如果为 NULL,表示绘图设备为默认绘图窗口。
说明:
如果需要对某个 IMAGE 做绘图操作,可以通过该函数将其设置为当前的绘图设备,之后所有的绘图语句都会绘制在该 IMAGE 上面。将参数置为 NULL 可恢复对默认绘图窗口的绘图操作。
示例:
#include <graphics.h>
#include <conio.h>
void main()
{
// 初始化绘图窗口
initgraph(640, 480);
// 创建 200x200 的 img 对象
IMAGE img(200, 200);
// 设置绘图目标为 img 对象
SetWorkingImage(&img);
// 以下绘图操作都会绘制在 img 对象上面
line(0, 100, 200, 100);
line(100, 0, 100, 200);
circle(100, 100, 50);
// 设置绘图目标为绘图窗口
SetWorkingImage();
// 将 img 对象显示在绘图窗口中
putimage(220, 140, &img);
// 按任意键退出
getch();
closegraph();
}
2.5.12 三元光栅操作码
这篇补充文档列出了 putimage 函数支持的所有三元光栅操作码。
三元光栅操作码定义了源图像与屏幕图像的位合并形式,这个合并形式是以下三个操作数对应像素的布尔运算:
操作数 | 含义 |
D | 屏幕图像 |
P | 当前填充颜色 |
S | 源图像 |
布尔运算符包括以下几种:
操作 | 含义 |
a | 位的 AND 运算(双目运算) |
n | 位的 NOT 运算(单目运算) |
o | 位的 OR 运算(双目运算) |
x | 位的 XOR 运算(双目运算) |
所有的布尔操作都采用逆波兰表示法,例如,“当前填充颜色 or 源图像”可表示为:PSo。(当然 SPo 也是等价的,这里只列举出了其中一种等价格式)
三元光栅操作码是 __int32 类型,其高位字是布尔操作索引,低位字是操作码。布尔操作索引的 16 个位中,高 8 位用 0 填充,低 8 位是当前填充颜色、源图像和屏幕的布尔操作结果。例如,PSo 和 DPSoo 的操作索引如下:
P | S | D | PSo | DPSoo |
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 1 | 1 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 0 | 1 | 1 | 1 |
1 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 1 |
操作索引: | 00FCh | 00FEh |
上例中,PSo 的操作索引是 00FC (从下往上读),DPSoo 的是 00FE。这些值定义了相应的三元光栅操作码在“三元光栅操作码”表格中的位置,PSo 在 252 (00FCh) 行,DPSoo 在 254 (00FEh) 行。常用的三元光栅操作码已经定义了常量名,程序中可以直接使用。
三元光栅操作码
布尔功能 (16 进制) | 光栅操作 (16 进制) | 布尔功能的逆波兰表示法 | 常量名 |
00 | 00000042 | 0 | BLACKNESS |
01 | 00010289 | DPSoon | |
02 | 00020C89 | DPSona | |
03 | 000300AA | PSon | |
04 | 00040C88 | SDPona | |
05 | 000500A9 | DPon | |
06 | 00060865 | PDSxnon | |
07 | 000702C5 | PDSaon | |
08 | 00080F08 | SDPnaa | |
09 | 00090245 | PDSxon | |
0A | 000A0329 | DPna | |
0B | 000B0B2A | PSDnaon | |
0C | 000C0324 | SPna | |
0D | 000D0B25 | PDSnaon | |
0E | 000E08A5 | PDSonon | |
0F | 000F0001 | Pn | |
10 | 00100C85 | PDSona | |
11 | 001100A6 | DSon | NOTSRCERASE |
12 | 00120868 | SDPxnon | |
13 | 001302C8 | SDPaon | |
14 | 00140869 | DPSxnon | |
15 | 001502C9 | DPSaon | |
16 | 00165CCA | PSDPSanaxx | |
17 | 00171D54 | SSPxDSxaxn | |
18 | 00180D59 | SPxPDxa | |
19 | 00191CC8 | SDPSanaxn | |
1A | 001A06C5 | PDSPaox | |
1B | 001B0768 | SDPSxaxn | |
1C | 001C06CA | PSDPaox | |
1D | 001D0766 | DSPDxaxn | |
1E | 001E01A5 | PDSox | |
1F | 001F0385 | PDSoan | |
20 | 00200F09 | DPSnaa | |
21 | 00210248 | SDPxon | |
22 | 00220326 | DSna | |
23 | 00230B24 | SPDnaon | |
24 | 00240D55 | SPxDSxa | |
25 | 00251CC5 | PDSPanaxn | |
26 | 002606C8 | SDPSaox | |
27 | 00271868 | SDPSxnox | |
28 | 00280369 | DPSxa | |
29 | 002916CA | PSDPSaoxxn | |
2A | 002A0CC9 | DPSana | |
2B | 002B1D58 | SSPxPDxaxn | |
2C | 002C0784 | SPDSoax | |
2D | 002D060A | PSDnox | |
2E | 002E064A | PSDPxox | |
2F | 002F0E2A | PSDnoan | |
30 | 0030032A | PSna | |
31 | 00310B28 | SDPnaon | |
32 | 00320688 | SDPSoox | |
33 | 00330008 | Sn | NOTSRCCOPY |
34 | 003406C4 | SPDSaox | |
35 | 00351864 | SPDSxnox | |
36 | 003601A8 | SDPox | |
37 | 00370388 | SDPoan | |
38 | 0038078A | PSDPoax | |
39 | 00390604 | SPDnox | |
3A | 003A0644 | SPDSxox | |
3B | 003B0E24 | SPDnoan | |
3C | 003C004A | PSx | |
3D | 003D18A4 | SPDSonox | |
3E | 003E1B24 | SPDSnaox | |
3F | 003F00EA | PSan | |
40 | 00400F0A | PSDnaa | |
41 | 00410249 | DPSxon | |
42 | 00420D5D | SDxPDxa | |
43 | 00431CC4 | SPDSanaxn | |
44 | 00440328 | SDna | SRCERASE |
45 | 00450B29 | DPSnaon | |
46 | 004606C6 | DSPDaox | |
47 | 0047076A | PSDPxaxn | |
48 | 00480368 | SDPxa | |
49 | 004916C5 | PDSPDaoxxn | |
4A | 004A0789 | DPSDoax | |
4B | 004B0605 | PDSnox | |
4C | 004C0CC8 | SDPana | |
4D | 004D1954 | SSPxDSxoxn | |
4E | 004E0645 | PDSPxox | |
4F | 004F0E25 | PDSnoan | |
50 | 00500325 | PDna | |
51 | 00510B26 | DSPnaon | |
52 | 005206C9 | DPSDaox | |
53 | 00530764 | SPDSxaxn | |
54 | 005408A9 | DPSonon | |
55 | 00550009 | Dn | DSTINVERT |
56 | 005601A9 | DPSox | |
57 | 00570389 | DPSoan | |
58 | 00580785 | PDSPoax | |
59 | 00590609 | DPSnox | |
5A | 005A0049 | DPx | PATINVERT |
5B | 005B18A9 | DPSDonox | |
5C | 005C0649 | DPSDxox | |
5D | 005D0E29 | DPSnoan | |
5E | 005E1B29 | DPSDnaox | |
5F | 005F00E9 | DPan | |
60 | 00600365 | PDSxa | |
61 | 006116C6 | DSPDSaoxxn | |
62 | 00620786 | DSPDoax | |
63 | 00630608 | SDPnox | |
64 | 00640788 | SDPSoax | |
65 | 00650606 | DSPnox | |
66 | 00660046 | DSx | SRCINVERT |
67 | 006718A8 | SDPSonox | |
68 | 006858A6 | DSPDSonoxxn | |
69 | 00690145 | PDSxxn | |
6A | 006A01E9 | DPSax | |
6B | 006B178A | PSDPSoaxxn | |
6C | 006C01E8 | SDPax | |
6D | 006D1785 | PDSPDoaxxn | |
6E | 006E1E28 | SDPSnoax | |
6F | 006F0C65 | PDSxnan | |
70 | 00700CC5 | PDSana | |
71 | 00711D5C | SSDxPDxaxn | |
72 | 00720648 | SDPSxox | |
73 | 00730E28 | SDPnoan | |
74 | 00740646 | DSPDxox | |
75 | 00750E26 | DSPnoan | |
76 | 00761B28 | SDPSnaox | |
77 | 007700E6 | DSan | |
78 | 007801E5 | PDSax | |
79 | 00791786 | DSPDSoaxxn | |
7A | 007A1E29 | DPSDnoax | |
7B | 007B0C68 | SDPxnan | |
7C | 007C1E24 | SPDSnoax | |
7D | 007D0C69 | DPSxnan | |
7E | 007E0955 | SPxDSxo | |
7F | 007F03C9 | DPSaan | |
80 | 008003E9 | DPSaa | |
81 | 00810975 | SPxDSxon | |
82 | 00820C49 | DPSxna | |
83 | 00831E04 | SPDSnoaxn | |
84 | 00840C48 | SDPxna | |
85 | 00851E05 | PDSPnoaxn | |
86 | 008617A6 | DSPDSoaxx | |
87 | 008701C5 | PDSaxn | |
88 | 008800C6 | DSa | SRCAND |
89 | 00891B08 | SDPSnaoxn | |
8A | 008A0E06 | DSPnoa | |
8B | 008B0666 | DSPDxoxn | |
8C | 008C0E08 | SDPnoa | |
8D | 008D0668 | SDPSxoxn | |
8E | 008E1D7C | SSDxPDxax | |
8F | 008F0CE5 | PDSanan | |
90 | 00900C45 | PDSxna | |
91 | 00911E08 | SDPSnoaxn | |
92 | 009217A9 | DPSDPoaxx | |
93 | 009301C4 | SPDaxn | |
94 | 009417AA | PSDPSoaxx | |
95 | 009501C9 | DPSaxn | |
96 | 00960169 | DPSxx | |
97 | 0097588A | PSDPSonoxx | |
98 | 00981888 | SDPSonoxn | |
99 | 00990066 | DSxn | |
9A | 009A0709 | DPSnax | |
9B | 009B07A8 | SDPSoaxn | |
9C | 009C0704 | SPDnax | |
9D | 009D07A6 | DSPDoaxn | |
9E | 009E16E6 | DSPDSaoxx | |
9F | 009F0345 | PDSxan | |
A0 | 00A000C9 | DPa | |
A1 | 00A11B05 | PDSPnaoxn | |
A2 | 00A20E09 | DPSnoa | |
A3 | 00A30669 | DPSDxoxn | |
A4 | 00A41885 | PDSPonoxn | |
A5 | 00A50065 | PDxn | |
A6 | 00A60706 | DSPnax | |
A7 | 00A707A5 | PDSPoaxn | |
A8 | 00A803A9 | DPSoa | |
A9 | 00A90189 | DPSoxn | |
AA | 00AA0029 | D | |
AB | 00AB0889 | DPSono | |
AC | 00AC0744 | SPDSxax | |
AD | 00AD06E9 | DPSDaoxn | |
AE | 00AE0B06 | DSPnao | |
AF | 00AF0229 | DPno | |
B0 | 00B00E05 | PDSnoa | |
B1 | 00B10665 | PDSPxoxn | |
B2 | 00B21974 | SSPxDSxox | |
B3 | 00B30CE8 | SDPanan | |
B4 | 00B4070A | PSDnax | |
B5 | 00B507A9 | DPSDoaxn | |
B6 | 00B616E9 | DPSDPaoxx | |
B7 | 00B70348 | SDPxan | |
B8 | 00B8074A | PSDPxax | |
B9 | 00B906E6 | DSPDaoxn | |
BA | 00BA0B09 | DPSnao | |
BB | 00BB0226 | DSno | MERGEPAINT |
BC | 00BC1CE4 | SPDSanax | |
BD | 00BD0D7D | SDxPDxan | |
BE | 00BE0269 | DPSxo | |
BF | 00BF08C9 | DPSano | |
C0 | 00C000CA | PSa | MERGECOPY |
C1 | 00C11B04 | SPDSnaoxn | |
C2 | 00C21884 | SPDSonoxn | |
C3 | 00C3006A | PSxn | |
C4 | 00C40E04 | SPDnoa | |
C5 | 00C50664 | SPDSxoxn | |
C6 | 00C60708 | SDPnax | |
C7 | 00C707AA | PSDPoaxn | |
C8 | 00C803A8 | SDPoa | |
C9 | 00C90184 | SPDoxn | |
CA | 00CA0749 | DPSDxax | |
CB | 00CB06E4 | SPDSaoxn | |
CC | 00CC0020 | S | SRCCOPY |
CD | 00CD0888 | SDPono | |
CE | 00CE0B08 | SDPnao | |
CF | 00CF0224 | SPno | |
D0 | 00D00E0A | PSDnoa | |
D1 | 00D1066A | PSDPxoxn | |
D2 | 00D20705 | PDSnax | |
D3 | 00D307A4 | SPDSoaxn | |
D4 | 00D41D78 | SSPxPDxax | |
D5 | 00D50CE9 | DPSanan | |
D6 | 00D616EA | PSDPSaoxx | |
D7 | 00D70349 | DPSxan | |
D8 | 00D80745 | PDSPxax | |
D9 | 00D906E8 | SDPSaoxn | |
DA | 00DA1CE9 | DPSDanax | |
DB | 00DB0D75 | SPxDSxan | |
DC | 00DC0B04 | SPDnao | |
DD | 00DD0228 | SDno | |
DE | 00DE0268 | SDPxo | |
DF | 00DF08C8 | SDPano | |
E0 | 00E003A5 | PDSoa | |
E1 | 00E10185 | PDSoxn | |
E2 | 00E20746 | DSPDxax | |
E3 | 00E306EA | PSDPaoxn | |
E4 | 00E40748 | SDPSxax | |
E5 | 00E506E5 | PDSPaoxn | |
E6 | 00E61CE8 | SDPSanax | |
E7 | 00E70D79 | SPxPDxan | |
E8 | 00E81D74 | SSPxDSxax | |
E9 | 00E95CE6 | DSPDSanaxxn | |
EA | 00EA02E9 | DPSao | |
EB | 00EB0849 | DPSxno | |
EC | 00EC02E8 | SDPao | |
ED | 00ED0848 | SDPxno | |
EE | 00EE0086 | DSo | SRCPAINT |
EF | 00EF0A08 | SDPnoo | |
F0 | 00F00021 | P | PATCOPY |
F1 | 00F10885 | PDSono | |
F2 | 00F20B05 | PDSnao | |
F3 | 00F3022A | PSno | |
F4 | 00F40B0A | PSDnao | |
F5 | 00F50225 | PDno | |
F6 | 00F60265 | PDSxo | |
F7 | 00F708C5 | PDSano | |
F8 | 00F802E5 | PDSao | |
F9 | 00F90845 | PDSxno | |
FA | 00FA0089 | DPo | |
FB | 00FB0A09 | DPSnoo | PATPAINT |
FC | 00FC008A | PSo | |
FD | 00FD0A0A | PSDnoo | |
FE | 00FE02A9 | DPSoo | |
FF | 00FF0062 | 1 | WHITENESS |
2.6 鼠标相关函数
鼠标消息缓冲区可以缓冲 63 个未处理的鼠标消息。每一次 GetMouseMsg 将从鼠标消息缓冲区取出一个最早发生的消息。当鼠标消息缓冲区满了以后,不再接收任何鼠标消息。2.6.1 相关函数和数据如下:
函数或数据 | 描述 |
清空鼠标消息缓冲区。 | |
获取一个鼠标消息。如果当前鼠标消息队列中没有,就一直等待。 | |
检测当前是否有鼠标消息。 | |
保存鼠标消息的结构体。 |
2.6.2 FlushMouseMsgBuffer
这个函数用于清空鼠标消息缓冲区。
void FlushMouseMsgBuffer();
2.6.3 GetMouseMsg
这个函数用于获取一个鼠标消息。如果当前鼠标消息队列中没有,就一直等待。
MOUSEMSG GetMouseMsg();
返回值:
返回保存有鼠标消息的结构体。
示例:
请参见 示例程序 中的“鼠标操作范例”。
2.6.4 MouseHit
这个函数用于检测当前是否有鼠标消息。
bool MouseHit();
参数:
返回值:
如果存在鼠标消息,返回 true;否则返回 false。
2.6.5 MOUSEMSG
这个结构体用于保存鼠标消息,定义如下:
struct MOUSEMSG
{
UINT uMsg; // 当前鼠标消息
bool mkCtrl; // Ctrl 键是否按下
bool mkShift; // Shift 键是否按下
bool mkLButton; // 鼠标左键是否按下
bool mkMButton; // 鼠标中键是否按下
bool mkRButton; // 鼠标右键是否按下
int x; // 当前鼠标 x 坐标(物理坐标)
int y; // 当前鼠标 y 坐标(物理坐标)
int wheel; // 鼠标滚轮滚动值
};
成员:
uMsg:
指定鼠标消息类型,可为以下值:
值 | 含义 |
WM_MOUSEMOVE | 鼠标移动消息。 |
WM_MOUSEWHEEL | 鼠标滚轮拨动消息。 |
WM_LBUTTONDOWN | 左键按下消息。 |
WM_LBUTTONUP | 左键弹起消息。 |
WM_LBUTTONDBLCLK | 左键双击消息。 |
WM_MBUTTONDOWN | 中键按下消息。 |
WM_MBUTTONUP | 中键弹起消息。 |
WM_MBUTTONDBLCLK | 中键双击消息。 |
WM_RBUTTONDOWN | 右键按下消息。 |
WM_RBUTTONUP | 右键弹起消息。 |
WM_RBUTTONDBLCLK | 右键双击消息。 |
mkCtrl Ctrl 键是否按下
mkShift Shift 键是否按下
mkLButton 鼠标左键是否按下
mkMButton 鼠标中键是否按下
mkRButton 鼠标右键是否按下
X 当前鼠标 x 坐标(物理坐标)
y当前鼠标 y 坐标(物理坐标)
wheel鼠标滚轮滚动值,为 120 的倍数。
2.7 其它函数
2.7.1 相关函数和数据如下:
函数或数据 | 描述 |
开始批量绘图。 | |
结束批量绘制,并执行未完成的绘制任务。 | |
执行未完成的绘制任务。 | |
获取当前 EasyX 库的版本信息。 | |
以对话框形式获取用户输入。 |
2.7.2 BeginBatchDraw
这个函数用于开始批量绘图。执行后,任何绘图操作都将暂时不输出到屏幕上,直到执行 FlushBatchDraw 或 EndBatchDraw 才将之前的绘图输出。
void BeginBatchDraw();
示例:
以下代码实现一个圆从左向右移动,会有比较明显的闪烁。
请取消 main 函数中的三个注释,以实现批绘图功能,可以消除闪烁。
#include <graphics.h>
void main()
{
initgraph(640,480);
setcolor(WHITE);
setfillstyle(RED);
// BeginBatchDraw();
for(int i=50; i<600; i++)
{
circle(i,100,40);
floodfill(i, 100, WHITE);
// FlushBatchDraw();
Sleep(10);
cleardevice();
}
// EndBatchDraw();
closegraph();
}
2.7.3 EndBatchDraw
这个函数用于结束批量绘制,并执行未完成的绘制任务。
// 结束批量绘制,并执行未完成的绘制任务
void EndBatchDraw();
// 结束批量绘制,并执行指定区域内未完成的绘制任务
void EndBatchDraw(int left,int top,int right,int bottom);
参数:
left指定区域的左部 x 坐标。
top指定区域的上部 y 坐标。
right指定区域的右部 x 坐标。
bottom指定区域的下部 y 坐标。
请参见 BeginBatchDraw 的示例。
2.7.4 FlushBatchDraw
这个函数用于执行未完成的绘制任务。
// 执行未完成的绘制任务
void FlushBatchDraw();
// 执行指定区域内未完成的绘制任务
void FlushBatchDraw(int left,int top,int right,int bottom);
参数:
left指定区域的左部 x 坐标。
top指定区域的上部 y 坐标。
right指定区域的右部 x 坐标。
bottom指定区域的下部 y 坐标。
示例:
请参见 BeginBatchDraw 的示例。
2.7.5 GetEasyXVer
这个函数用于获取当前 EasyX 库的版本信息。
TCHAR* GetEasyXVer();
返回值:
返回当前 EasyX 库的版本信息。
示例:
以下代码实现输出当前 EasyX 版本号:
#include <stdio.h>
#include <graphics.h>
void main()
{
TCHAR* s = GetEasyXVer();
_tprintf("EasyX 当前版本:%s\n", s);
}
2.7.6 InputBox
这个函数用于以对话框形式获取用户输入。
bool InputBox(LPTSTR pString,int nMaxCount,LPCTSTR pPrompt = NULL,
LPCTSTR pTitle = NULL,LPCTSTR pDefault = NULL,int width = 0,
int height = 0,bool bOnlyOK = true);
参数:
pString指定接收用户输入字符串的指针。
nMaxCount指定 pString 指向的缓冲区的大小,该值会限制用户输入内容的长度。缓冲区的大小包括表示字符串结尾的 '\0' 字符。当允许多行输入时,用户键入的回车占两个字符位置。
pPrompt指定显示在窗体中的提示信息。提示信息中可以用“\n”分行。InputBox 的高度会随着提示信息内容的多少自动扩充。如果该值为 NULL,则不显示提示信息。
pTitle指定 InputBox 的标题栏。如果为 NULL,将显示应用程序的名称。
pDefault指定显示在用户输入区的默认值。
width指定 InputBox 的宽度(不包括边框),最小为 200 像素。如果为 0,则使用默认宽度。
height指定 InputBox 的高度(不包括边框)。如果为 0,表示自动计算高度,用户输入框只允许输入一行内容,按“回车”确认输入信息;如果大于 0,用户输入框的高度会自动拓展,同时允许输入多行内容,按“Ctrl+回车”确认输入信息。
bOnlyOK指定是否允许用户取消输入。如果为 true(默认),InputBox 只有一个“确定”按钮,没有“X”关闭按钮,按 ESC 无效;如果为 false,InputBox 有“确定”和“取消”按钮,允许点“X”和按 ESC 关闭窗口。
返回值:
返回用户是否输入信息。如果用户按“确定”,返回 true;如果用户按“取消”,返回 false。
示例:
以下示例提示用户输入圆的半径,并画圆:
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
void main()
{
// 初始化图形窗口
initgraph(640, 480);
// 定义字符串缓冲区,并接收用户输入
char s[10];
InputBox(s, 10, "请输入半径");
// 将用户输入转换为数字
int r;
sscanf(s, "%d", &r);
// 画圆
circle(320, 240, r);
// 按任意键退出
getch();
closegraph();
}