EasyX帮助文档
来源:互联网 发布:mysql存储emoji乱码 编辑:程序博客网 时间:2024/05/23 00:05
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=红)
3. 用 RGB 宏合成颜色。详见 RGB。
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 绘图环境相关函数
相关函数和数据如下:
函数或数据
描述
cleardevice
清除屏幕内容。
initgraph
初始化绘图窗口。
closegraph
关闭图形窗口。
getaspectratio
获取当前缩放因子。
setaspectratio
设置当前缩放因子。
graphdefaults
恢复绘图环境为默认值。
setorigin
设置坐标原点。
setcliprgn
设置当前绘图设备的裁剪区。
clearcliprgn
清除裁剪区的屏幕内容。
GetHWnd
获取绘图窗口句柄。
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 相关函数和数据如下:
函数或数据
描述
getbkcolor
获取当前绘图背景色。
getcolor
获取当前绘图前景色
GetBValue
返回指定颜色中的蓝色值。
GetGValue
返回指定颜色中的绿色值。
GetRValue
返回指定颜色中的红色值。
HSLtoRGB
转换 HSL 颜色为 RGB 颜色。
HSVtoRGB
转换 HSV 颜色为 RGB 颜色。
RGB
通过红、绿、蓝颜色分量合成颜色。
RGBtoGRAY
转换 RGB 颜色为 灰度颜色。
RGBtoHSL
转换 RGB 颜色为 HSL 颜色。
RGBtoHSV
转换 RGB 颜色为 HSV 颜色。
setbkcolor
设置当前绘图背景色。
setcolor
设置当前绘图前景色。
BGR
交换颜色中的红色和蓝色。
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 相关函数和数据如下:
函数或数据
描述
arc
画椭圆弧。
bar
画无边框填充矩形。
bar3d
画有边框三维填充矩形。
circle
画圆。
drawpoly
画多边形。
ellipse
画椭圆。
fillcircle
画填充圆。
fillellipse
画填充椭圆。
fillpoly
画填充的多边形。
floodfill
填充区域。
getfillstyle
获取当前填充类型。
getheight
获取绘图区的高度。
getlinestyle
获取当前线形。
getpixel
获取点的颜色。
getwidth
获取绘图区的宽度。
getx
获取当前 x 坐标。
gety
获取当前 y 坐标。
line
画线。
linerel
画线。
lineto
画线。
moverel
移动当前点。
moveto
移动当前点。
pie
画填充椭圆扇形。
putpixel
画点。
rectangle
画空心矩形。
setfillstyle
设置当前填充类型。
setlinestyle
设置当前线形。
setwritemode
设置绘图位操作模式。
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 相关函数和数据如下:
函数或数据
描述
getfont
获取当前字体样式。
LOGFONT
保存字体样式的结构体。
outtext
在当前位置输出字符串。
outtextxy
在指定位置输出字符串。
drawtext
在指定区域内以指定格式输出字符串。
setbkmode
设置输出文字时的背景模式。
setfont
设置当前字体样式。
textheight
获取字符串实际占用的像素高度。
textwidth
获取字符串实际占用的像素宽度。
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_MODIFYSTRING 标志。
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_MODIFYSTRING标志。
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
如果指定了该值,所有字体的旋转都依赖于坐标系统的方向是逆时针或顺时针。
如果没有指定该值,设备字体始终逆时针旋转,但是其它字体的旋转依赖于坐标系统的方向。
该设置影响 lfOrientation 参数的效果。
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
保存图像的对象。
loadimage
读取图片文件。
saveimage
保存绘图内容至图片文件。
getimage
从当前绘图设备中获取图像。
putimage
在当前绘图设备上绘制指定图像。
GetWorkingImage
获取指向当前绘图设备的指针。
rotateimage
旋转 IMAGE 中的绘图内容。
SetWorkingImage
设定当前绘图设备。
Resize
调整指定绘图设备的尺寸。
GetImageBuffer
获取绘图设备的显存指针。
GetImageHDC
获取绘图设备句柄。
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 相关函数和数据如下:
函数或数据
描述
FlushMouseMsgBuffer
清空鼠标消息缓冲区。
GetMouseMsg
获取一个鼠标消息。如果当前鼠标消息队列中没有,就一直等待。
MouseHit
检测当前是否有鼠标消息。
MOUSEMSG
保存鼠标消息的结构体。
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 相关函数和数据如下:
函数或数据
描述
BeginBatchDraw
开始批量绘图。
EndBatchDraw
结束批量绘制,并执行未完成的绘制任务。
FlushBatchDraw
执行未完成的绘制任务。
GetEasyXVer
获取当前 EasyX 库的版本信息。
InputBox
以对话框形式获取用户输入。
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();
}
- EasyX帮助文档
- EasyX
- easyx
- 帮助文档
- 帮助文档
- 帮助文档
- 帮助文档
- 帮助文档
- 帮助文档
- 帮助文档
- 帮助文档
- 帮助文档
- 文档注释导出帮助文档
- 帮助文档书写日记
- SQL 帮助文档学习.
- Cmd帮助文档
- 帮助文档生成批处理
- Dos批处理帮助文档
- Apophysis作品——鸟巢渲染日志
- 敏捷开发一千零一问系列之十八:长期受制于强势客户怎么办?(下)
- C语言内存分配及函数返回值的解析。
- 敏捷开发一千零一问系列之十九:提问帖
- jQuery中10个强大的遍历函数
- EasyX帮助文档
- 编辑器王者SlickEdit使用_设置篇
- 更改ubuntu的挂载点
- 敏捷开发一千零一问系列之二十:怎样持续改进?(兼谈共振)
- iCade Mobile:让iPhone变身掌上游戏机
- 敏捷开发一千零一问系列之二十一:怎样写设计?(教育软件案例)
- Android 布局----让一个控件居底部
- 敏捷开发一千零一问系列之二十二: UI设计怎么做到敏捷呢?(兼谈对UI热的理解)(上)
- linux下的时间编程