基于VC6.0的控制台作图--一个极坐标曲线图(26行代码)

文章目录

    • 先看MATLAB如何做
    • 如果不用MATLAB呢?
    • 单纯依靠C函数完成作图
    • 再来几个例子
    • 改画笔画刷(颜色、粗细、透明)
    • 稍作变化
    • 还能有比这更简单的C代码吗?
    • 还可让图形动起来
      • 附录: GDI绘图基本步骤总结
        • 一、获得绘图的窗口句柄
        • 二、由窗口句柄得到设备环境句柄HDC
        • 三、图形绘制方法
          • 1、 画笔CreatePen
          • 2、 画刷
          • 3、 点`SetPixel`
          • 4、 直线`MoveToEx、LineTo`
          • 5、 矩形`Rectangle`
          • 6、 椭圆`Ellipse`

先看MATLAB如何做

极坐标函数
ρ = exp ⁡ ( cos ⁡ ( θ ) ) − 2 cos ⁡ ( 4 θ ) + ( sin ⁡ ( θ / 12 ) ) 5 \rho=\exp(\cos(\theta))-2\cos(4\theta)+(\sin(\theta/12))^5 ρ=exp(cos(θ))2cos(4θ)+(sin(θ/12))5
的曲线是何样的?估计用MATLAB作图最简单,三句话即可:

theta=0:0.01:20*pi;
rho=exp(cos(theta))-2*cos(4*theta)+(sin(theta/12)).^5;
polarplot(theta,rho);

结果:
基于VC6.0的控制台作图--一个极坐标曲线图(26行代码)_第1张图片

如果不用MATLAB呢?

如果不用MATLAB呢?估计想得到作图能力强大的软件还有R语言、Python语言。Gnuplot也是一个不错的选择,直接用svg也可做图,或采用百度开发的Echarts也能完成。总之,方法很多。但用Gnuplot是借助了第3方作图工具了,用svg,Echarts或其他javascript包也要借助浏览器来显示。

假如在有些情况下,不允许用任何第3方工具。不允许用windows编程架构或MFC,仅用C/C++语言结合windows的基本绘图函数,也能作图吗?

我们追求简单。在此,我们仅用26行代码,在VC基本编译环境下,在控制台上也作出了如MATLAB那样的曲线结果。

单纯依靠C函数完成作图

windows下作图是使用gdi32.lib, user32.lib中的函数,所以编译要链接相应的库文件。库文件可以通过编译器选项链接,如:

cl.exe  simpledraw.cpp /link user32.lib gdi32.lib

也可在Cpp代码中加入预编指令:

#pragma comment(lib,"user32.lib") 
#pragma comment(lib,"gdi32.lib")

为了引用GDI函数(GDI:图形设备接口),需在main函数前加入:

extern "C" WINBASEAPI HWND WINAPI GetConsoleWindow ();

在main函数中,采用

HWND hwnd = GetConsoleWindow(); 
HDC hdc = GetDC(hwnd); 

来获取控制台窗口句柄,从而操纵控制台使之以图形模式而不是字符模式作图。

【注】还可有第2种方法获得控制台窗口的绘图hdc:先用GetConsoleTitle得到控制台窗口标题,再通过FindWindow函数借助标题获取窗口句柄HWND,之后再利用GetDC函数借助HWND获取HDC。这种做法可避免使用GetConsoleWindow函数。局部代码如下:

TCHAR title[256];//控制台程序标题
......
int main(int argc,char *argv[]) 
{ 
	GetConsoleTitle(title, 256);//获取控制台标题
	HDC hdc = GetDC(FindWindow(0, title));
......

如果以默认画笔作图,则直接调用作图函数即可。最简单的作图函数就是画直线(LineTo)。如

MoveToEx(hdc,400,300,NULL); //笔移到坐标(400,300)点
LineTo(hdc,(int)x,(int)y); //画线到(x,y)坐标

函数中,hdc就是指向控制台的作图句柄。

好了,完整代码如下:

#include
#include
#pragma comment(lib,"user32.lib") 
#pragma comment(lib,"gdi32.lib")
extern "C" WINBASEAPI HWND WINAPI GetConsoleWindow ();
int main(int argc,char *argv[]) 
{ 
	HWND hwnd = GetConsoleWindow(); 
	HDC hdc = GetDC(hwnd); 
	double rho, theta, x, y;//极坐标和直角坐标
	system("cls");//清屏
	system("color f0");//白底黑字
	Rectangle(hdc, 120, 50, 120+600, 50+500);//画个边框
	MoveToEx(hdc,400,300,NULL); //笔移到坐标原点(屏幕坐标400,300)
	for (int i=0; i<10000; i++)
	{
		theta=0.01*i;
		rho=exp(cos(theta))-2*cos(4*theta)+pow(sin(theta/12.0),5);
		x=400+50*rho*cos(theta);
		y=300-50*rho*sin(theta);
		LineTo(hdc,(int)x,(int)y); //画线作图
	}
	TextOut(hdc, 550, 45, "美丽的蝴蝶结", 12);//写字
    ReleaseDC(hwnd,hdc);
	return 0; 
}

其中,LineTo用以画线,TextOut用以在指定坐标处写字。退出程序前,用ReleaseDC(hwnd,hdc);释放作图资源,不用也行,但这是良好的编程习惯。默认画笔是黑色的,所以画图前将背景设为白色,并清屏。程序中,以屏幕坐标点(400,300)作为数学坐标原点。以极坐标计算后转换为直角坐标(并适当放大)作图。
编译:
1、直接在VC++6.0中编译。或
2、控制台编译:

cl.exe  simpledraw.cpp

3、或链接上库文件(代码中可不要#pragma)

cl.exe  simpledraw.cpp /link user32.lib gdi32.lib

运行结果:
基于VC6.0的控制台作图--一个极坐标曲线图(26行代码)_第2张图片

再来几个例子

三叶草

theta=0:0.01:2*pi;
rho=1+cos(3*theta)+1.5*(sin(3*theta)).^2;
polarplot(theta,rho);

基于VC6.0的控制台作图--一个极坐标曲线图(26行代码)_第3张图片

Cpp代码:

#include
#include
#pragma comment(lib,"user32.lib") 
#pragma comment(lib,"gdi32.lib")
extern "C" WINBASEAPI HWND WINAPI GetConsoleWindow ();
int main(int argc,char *argv[]) 
{ 
	HWND hwnd = GetConsoleWindow(); 
	HDC hdc = GetDC(hwnd); 
	double rho, theta, x, y;//极坐标和直角坐标
	system("cls");//清屏
	system("color f0");//白底黑字
	Rectangle(hdc, 120, 50, 120+600, 50+500);//画个边框
	for (int i=0; i<10000; i++)
	{
		theta=0.01*i;
		rho=1+cos(3*theta)+pow(1.5*(sin(3*theta)),2);
		x=400+50*rho*cos(theta);
		y=300-50*rho*sin(theta);
		if(i==0){
			MoveToEx(hdc,(int)x,(int)y,NULL); //笔移到起点
		}else
		{
			LineTo(hdc,(int)x,(int)y); //画线作图
		}	
	}
	TextOut(hdc, 550, 45, "美丽的三叶草", 12);//写字
    ReleaseDC(hwnd,hdc);
	return 0; 
}

程序中演示如何设定画笔起始位置。
运行结果:
基于VC6.0的控制台作图--一个极坐标曲线图(26行代码)_第4张图片

正弦波:

#include
#include
#pragma comment(lib,"user32.lib") 
#pragma comment(lib,"gdi32.lib")
extern "C" WINBASEAPI HWND WINAPI GetConsoleWindow ();
int main(int argc,char *argv[]) 
{ 
	HWND hwnd = GetConsoleWindow(); 
	HDC hdc = GetDC(hwnd); 
	double x, y;//直角坐标
	system("cls");//清屏
	system("color f0");//白底黑字
	Rectangle(hdc, 120, 50, 120+600, 50+500);//画个边框
	for (int i=0; i<50000; i++)
	{
		x=0.01*i;
		y=300+200*sin(2*3.14159*0.01*x);
		if(i==0){
			MoveToEx(hdc,130+(int)x,(int)y,NULL); //笔移到起点
		}else
		{
			LineTo(hdc,130+(int)x,(int)y); //画线作图
		}	
	}
	TextOut(hdc, 550, 45, "美丽的正弦波", 12);//写字
    ReleaseDC(hwnd,hdc);
	return 0; 
}

基于VC6.0的控制台作图--一个极坐标曲线图(26行代码)_第5张图片

改画笔画刷(颜色、粗细、透明)

也很简单。在作图前设置一下就行。

HPEN hPen = CreatePen(PS_SOLID, 2, RGB(0,255,0));//添加画笔属性。2代表宽度,RGB(0,255,0)用于调颜色为绿色
SelectObject(hdc, hPen);//画笔绑定到句柄
HBRUSH hBrush=(HBRUSH)GetStockObject(NULL_BRUSH) ;//透明的画刷
SelectObject (hdc, hBrush);

完整代码:

#include
#include
#pragma comment(lib,"user32.lib") 
#pragma comment(lib,"gdi32.lib")
extern "C" WINBASEAPI HWND WINAPI GetConsoleWindow ();
int main(int argc,char *argv[]) 
{ 
	HWND hwnd = GetConsoleWindow(); 
	HDC hdc = GetDC(hwnd); 
	double x, y;//直角坐标
	system("cls");//清屏
	system("color 0f");//黑底白字
	HPEN hPen = CreatePen(PS_SOLID, 2, RGB(0,255,0));//添加画笔属性。2代表宽度,RGB(0,255,0)用于调颜色为绿色
    SelectObject(hdc, hPen);//画笔绑定到句柄
	HBRUSH hBrush=(HBRUSH)GetStockObject(NULL_BRUSH) ;//透明
    SelectObject (hdc, hBrush);
	Rectangle(hdc, 120, 50, 120+600, 50+500);//画个边框
	for (int i=0; i<50000; i++)
	{
		x=0.01*i;
		y=300+200*sin(2*3.14159*0.01*x);
		if(i==0){
			MoveToEx(hdc,130+(int)x,(int)y,NULL); //笔移到起点
		}else
		{
			LineTo(hdc,130+(int)x,(int)y); //画线作图
		}	
	}
	TextOut(hdc, 550, 45, "美丽的正弦波", 12);//写字
    ReleaseDC(hwnd,hdc);
	return 0; 
}

结果:
基于VC6.0的控制台作图--一个极坐标曲线图(26行代码)_第6张图片

可见字色还是默认的。如果要改字背景和前景色,可用:

SetBkColor(hdc, RGB(0,0,0));
SetTextColor(hdc, RGB(0,255,0));
//然后再写字:
TextOut(hdc, 550, 45, "美丽的正弦波", 12);//写字

图就成了这样:
基于VC6.0的控制台作图--一个极坐标曲线图(26行代码)_第7张图片

如果还想设置字体,代码就要麻烦点,设置字体后,用SelectObject(hdc, font)选择字体即可,如下:

......
	HFONT font = CreateFont(
		28, // nHeight
		0, // nWidth
		50, // nEscapement
		0, // nOrientation
		FW_BOLD, // nWeight
		TRUE, // bItalic
		FALSE, // bUnderline
		0, // cStrikeOut
		ANSI_CHARSET, // nCharSet
		OUT_DEFAULT_PRECIS, // nOutPrecision
		CLIP_DEFAULT_PRECIS, // nClipPrecision
		DEFAULT_QUALITY, // nQuality
		DEFAULT_PITCH | FF_SWISS,
		"Arial" // nPitchAndFamily Arial
		);
	SelectObject(hdc, font);
......

作图结果:
基于VC6.0的控制台作图--一个极坐标曲线图(26行代码)_第8张图片

可见,用C语言从底层控制作图是极为灵活的。

完整代码:

#include
#include
#pragma comment(lib,"user32.lib") 
#pragma comment(lib,"gdi32.lib")
extern "C" WINBASEAPI HWND WINAPI GetConsoleWindow ();
int main(int argc,char *argv[]) 
{ 
	HWND hwnd = GetConsoleWindow(); 
	HDC hdc = GetDC(hwnd); 
	double x, y;//直角坐标
	system("cls");//清屏
	system("color 0f");//黑底白字
	HPEN hPen = CreatePen(PS_SOLID, 2, RGB(0,255,0));//添加画笔属性。2代表宽度,RGB(0,255,0)用于调颜色为绿色
    SelectObject(hdc, hPen);//画笔绑定到句柄
	HBRUSH hBrush=(HBRUSH)GetStockObject(NULL_BRUSH) ;//透明
    SelectObject (hdc, hBrush);
	Rectangle(hdc, 120, 50, 120+600, 50+500);//画个边框
	for (int i=0; i<50000; i++)
	{
		x=0.01*i;
		y=300+200*sin(2*3.14159*0.01*x);
		if(i==0){
			MoveToEx(hdc,130+(int)x,(int)y,NULL); //笔移到起点
		}else
		{
			LineTo(hdc,130+(int)x,(int)y); //画线作图
		}	
	}

	HFONT font = CreateFont(
		28, // nHeight
		0, // nWidth
		50, // nEscapement
		0, // nOrientation
		FW_BOLD, // nWeight
		TRUE, // bItalic
		FALSE, // bUnderline
		0, // cStrikeOut
		ANSI_CHARSET, // nCharSet
		OUT_DEFAULT_PRECIS, // nOutPrecision
		CLIP_DEFAULT_PRECIS, // nClipPrecision
		DEFAULT_QUALITY, // nQuality
		DEFAULT_PITCH | FF_SWISS,
		"Arial" // nPitchAndFamily Arial
		);
	SelectObject(hdc, font);

	SetBkColor(hdc, RGB(0,0,0));
    SetTextColor(hdc, RGB(0,255,0));
	TextOut(hdc, 520, 45, "美丽的正弦波", 12);//写字
    ReleaseDC(hwnd,hdc);
	return 0; 
}

稍作变化

#include
#include
#include
#pragma comment(lib,"user32.lib") 
#pragma comment(lib,"gdi32.lib")
extern "C" WINBASEAPI HWND WINAPI GetConsoleWindow ();
int main(int argc,char *argv[]) 
{ 
	HWND hwnd = GetConsoleWindow(); 
	HDC hdc = GetDC(hwnd); 
	double rho, theta, x, y;//极坐标和直角坐标
	HPEN hPen1,hPen2,hPen3;
	hPen1 = CreatePen(PS_SOLID, 50, RGB(255,155,0));//添加画笔属性
	hPen2 = CreatePen(PS_SOLID, 0, RGB(0,255,0));//添加画笔属性
	hPen3 = CreatePen(PS_SOLID, 0, RGB(0,0,255));//添加画笔属性

	const double pi=3.14159265;
	system("cls");//清屏
	system("color f0");//白底黑字
	Rectangle(hdc, 120, 50, 120+600, 50+500);//画个边框
	for (int i=0; i<20000; i++)
	{
		theta=-pi+pi/10000.0*i;
		rho=1+cos(3*theta)+pow(1.5*(sin(3*theta)),2);
		x=400+50*rho*cos(theta);
		y=300-50*rho*sin(theta);

        if(theta<(-pi/3.0)){
		    SelectObject(hdc, hPen1);//画笔绑定到句柄
		}	
		if(theta>-pi/3.0 )
		{
			SelectObject(hdc, hPen2);//画笔绑定到句柄
		}	
		if(theta>pi/3.0)
		{
			SelectObject(hdc, hPen3);//画笔绑定到句柄
		}

		MoveToEx(hdc,400,300,NULL); //笔移到起点
		LineTo(hdc,(int)x,(int)y); //画线作图
	}
	TextOut(hdc, 550, 45, "美丽的三叶草", 12);//写字
    ReleaseDC(hwnd,hdc);
	return 0; 
}

基于VC6.0的控制台作图--一个极坐标曲线图(26行代码)_第9张图片

#include
#include
#include
#pragma comment(lib,"user32.lib") 
#pragma comment(lib,"gdi32.lib")
extern "C" WINBASEAPI HWND WINAPI GetConsoleWindow ();
int main(int argc,char *argv[]) 
{ 
	HWND hwnd = GetConsoleWindow(); 
	HDC hdc = GetDC(hwnd); 
	double rho, theta, x, y;//极坐标和直角坐标
	HPEN hPen1,hPen2,hPen3;
	hPen1 = CreatePen(PS_SOLID, 0, RGB(255,155,0));//添加画笔属性
	hPen2 = CreatePen(PS_SOLID, 0, RGB(0,255,0));//添加画笔属性
	hPen3 = CreatePen(PS_SOLID, 0, RGB(0,0,255));//添加画笔属性

	const double pi=3.14159265;
	system("cls");//清屏
	system("color f0");//白底黑字
	Rectangle(hdc, 120, 50, 120+600, 50+500);//画个边框
	for (int i=0; i<20000; i++)
	{
		theta=-pi+pi/10000.0*i;
		rho=1+cos(7*theta)+pow(1.5*(sin(3*theta)),2);
		x=400+50*rho*cos(theta);
		y=300-50*rho*sin(theta);

        if(theta<(-pi/3.0)){
		    SelectObject(hdc, hPen1);//画笔绑定到句柄
		}	
		if(theta>-pi/3.0 )
		{
			SelectObject(hdc, hPen2);//画笔绑定到句柄
		}	
		if(theta>pi/3.0)
		{
			SelectObject(hdc, hPen3);//画笔绑定到句柄
		}

		MoveToEx(hdc,400,300,NULL); //笔移到起点
		LineTo(hdc,(int)x,(int)y); //画线作图
	}
	TextOut(hdc, 550, 45, "美丽的三叶草", 12);//写字
    ReleaseDC(hwnd,hdc);
	return 0; 
}

基于VC6.0的控制台作图--一个极坐标曲线图(26行代码)_第10张图片

还能有比这更简单的C代码吗?

也许如下,画个矩形,只有8行,核心代码3行–建立图形句柄调并用之。

#include
extern "C" WINBASEAPI HWND WINAPI GetConsoleWindow ();
void main(int argc,char *argv[]){ 
	HWND hwnd = GetConsoleWindow(); 
	HDC hdc = GetDC(hwnd); 
	Rectangle(hdc, 120, 50, 120+600, 50+500);//用句柄hdc画矩形
}

或是

#include
TCHAR title[256];//控制台程序标题
void main(int argc,char *argv[]){ 
	GetConsoleTitle(title, 256);//获取控制台标题
	HDC hdc = GetDC(FindWindow(0, title));
	Rectangle(hdc, 120, 50, 120+600, 50+500);//用句柄hdc画矩形
}

编译要加link选项(在VC++6.0集成环境中默认已加了):

cl.exe  simpledraw.cpp /link user32.lib gdi32.lib

还可让图形动起来

让图形动起来的办法就是不断定时清屏、重绘。像放电影那样。然而,直接向屏幕绘图是耗时的,在屏幕上画很多线,将多次调用绘图接口,这样,不但绘制效率低(慢),而且视觉上闪烁感明显。

解决的办法是:先在内存中将多条线的绘制结果准备好,再一次性调用向屏幕绘图的接口。这称为双缓冲法。即先向内存中的缓冲区作图,再将作图结果一次性拷贝到屏幕的显示区。

详細方法下篇再讲。

附录: GDI绘图基本步骤总结

一、获得绘图的窗口句柄

方法:多种


HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName)

HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter,LPCTSTR lpClassName, LPCTSTR lpWindowName)

HWND  GetConsoleWindow()   //直接找控制台窗口句柄

HWND WindowFromPoint(POINT& Point)

BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)   
BOOL CALLBACK EnumChildWindows(HWND hWndParent, WNDENUMPROC lpEnumFunc,LPARAM lParam)   
BOOL CALLBACK EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)

二、由窗口句柄得到设备环境句柄HDC

方法(3种):BeginPaint、GetWindowDC、GetDC。

这些函数都需要步骤一中的HWND的句柄。调用这些函数后要释放句柄,相应的有EndPaint、ReleaseDC进行清理。

1、 采用BeginPaint获取HDC

HDC hdc;
PAINTSTRUCT ps;// 保存
hdc = ::BeginPaint( hwnd, &ps );
// 此处添加绘图代码
::EndPaint( hwnd, &ps );

说明:获得的hdc的有效区域仅限于客户区无效区域的设备环境句柄,不包括标题栏、边框等

2、 采用GetWindowDC获取HDC

HDC hdc = ::GetWindowDC( hwnd );
// 此处添加绘图代码
::ReleaseDC( hwnd, hdc );

说明:绘制区域是整个窗口**(边框、标题栏、客户区的总和)**。

3、 采用GetDC获取HDC

HDC hdc = ::GetDC( hwnd );
// 此处添加绘图代码
::ReleaseDC( hwnd, hdc );

说明:获得的hdc的有效区域仅限于客户区有效区域的设备环境句柄,不包括标题栏、边框等。

三、图形绘制方法

1、 画笔CreatePen

绘画之前先选择画笔,画笔的功能主要是绘制边框,其函数原型如下:

WINGDIAPI HPEN WINAPI CreatePen(
__in int iStyle,           // 画笔的类型,比如是实线,还是虚线等等。
__in int cWidth,          // 线的宽度。
__in COLORREF color       // 线的颜色。
);

其中:
// iStyle参数可选值:
PS_SOLID       = 0;// 实线
PS_DASH        = 1;// 段线; 要求笔宽<=1
PS_DOT         = 2;// 点线; 要求笔宽<=1
PS_DASHDOT     = 3;// 线、点; 要求笔宽<=1
PS_DASHDOTDOT  = 4;// 线、点、点; 要求笔宽<=1
PS_NULL        = 5;// 不可见
PS_INSIDEFRAME = 6;// 实线; 但笔宽是向里扩展

返回值为画笔类型,SelectObject函数选中。选中后,返回原来画刷的句柄用来恢复时使用。图形绘制完毕后使用DeleteObject函数将其释放。

【SelectObject函数说明】:

函数功能:该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。

函数原型:
HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj);

参数:

hdc:设备上下文环境的句柄。
hgdiobj:被选择的对象的句型,该指定对象必须由如下的函数创建。

位图:CreateBitmap, CreateBitmapIndirect, CreateCompatible Bitmap, CreateDIBitmap, CreateDIBsection(只有内存设备上下文环境可选择位图,并且在同一时刻只能一个设备上下文环境选择位图)。

画笔:CreateBrushIndirect, CreateDIBPatternBrush, CreateDIBPatternBrushPt, CreateHatchBrush, CreatePatternBrush, CreateSolidBrush。

字体:CreateFont, CreateFontIndirect。
笔:CreatePen, CreatePenIndirect。

区域:CombineRgn, CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn, CreateRectRgn, CreateRectRgnIndirect。

返回值:如果选择对象不是区域并且函数执行成功,那么返回值是被取代的对象的句柄。

【DeleteObject函数说明】:

函数功能:该函数删除一个逻辑笔、画笔、字体、位图、区域或者调色板,释放所有与该对象有关的系统资源,在对象被删除之后,指定的句柄也就失效了。

函数原型:BOOL DeleteObject(HGDIOBJ hObject);

参数:

hObject:逻辑笔、画笔、字体、位图、区域或者调色板的句柄。
返回值:成功,返回非零值;如果指定的句柄无效或者它已被选入设备上下文环境,则返回值为零。

2、 画刷

画刷的功能主要是填充区域内的颜色,创建画刷的方法如下:

A、CreateSolidBrush函数

函数功能:该函数创建一个具有指定颜色的逻辑刷子。
函数原理:HBRUSH CreateSolidBrush(COLORREF crColor);
参数:
crColor:指定刷子的颜色。
返回值:如果该函数执行成功,那么返回值标识一个逻辑实心刷子;如果函数失败,那么返回值为NULL。

B、GetStockObject函数

函数功能:该函数检索预定义的备用笔、刷子、字体或者调色板的句柄。
函数原型:HGDIOBJ GetStockObject(int fnObject);
参数:

fnObject:指定对象的类型,该参数可取如下值之一;
BLACK_BRUSH:黑色画笔;
DKGRAY_BRUSH:暗灰色画笔;
DC_BRUSH:在Windows98,Windows NT 5.0和以后版本中为纯颜色画笔,缺省色为白色,可以用SetDCBrushColor函数改变颜色,更多的信息参见以下的注释部分。
GRAY_BRUSH:灰色画笔;
HOLLOW_BRUSH:空画笔(相当于HOLLOW_BRUSH);
LTGRAY_BRUSH:亮灰色画笔;
NULL_BRUSH:空画笔(相当于HOLLOW_BRUSH);
WHITE_BRUSH:白色画笔;BLACK_PEN:黑色钢笔;
DC_PEN:在Windows98、Windows NT 5.0和以后版本中为纯色钢笔,缺省色为白色,使用SetDCPenColor函数可以改变色彩,更多的信息,参见下面的注释部分。
WHITE_PEN:白色钢笔;
ANSI_FIXED_FONT:在Windows中为固定间距(等宽)系统字体;
ANSI_VAR_FONT:在Windows中为变间距(比例间距)系统字体;
DEVICE_DEFAUCT_FONT:在WindowsNT中为设备相关字体;
DEFAULT_GUI_FONT:用户界面对象缺省字体,如菜单和对话框;
OEM_FIXED_FONT:原始设备制造商(OEM)相关固定间距(等宽)字体;
SYSTEM_FONT:系统字体,在缺省情况下,系统使用系统字体绘制菜单,对话框控制和文本;
SYSTEM_FIXED_FONT:固定间距(等宽)系统字体,该对象仅提供给兼容16位Windows版本;
DEFAULT_PALETTE:缺省调色板,该调色板由系统调色板中的静态色彩组成。
返回值:如果成功,返回值标识声请的逻辑对象,如果失败,返回值为NULL。

C、CreateHatchBrush函数

函数功能:该函数可以创建一个具有指定阴影模式和颜色的逻辑刷子。
函数原型:HBRUSH CreateHatchBrush(int fnStyle, COLORREF clrref);
参数:
fnStyle:指定刷子的阴影样式。该参数可以取下列值,这些值的含义为:
HS_BDIAGONAL:表示45度向下,从左至右的阴影;
HS_CROSS:水平和垂直交叉险影;
HS_DIAGCROSS:45度交叉阴影;
HS_FDIAGONAL:45度向上,自左至右阴影;
HS_HORIZONTAL:水平阴影;
HS_VERTICAL:垂直阴影。
cirref:指定用于阴影的刷子的前景色。
返回值:如果函数执行成功,那么返回值标识为逻辑刷子;如果函数执行失败,那么返回值为NULL。

画刷的选中和释放,请参照画笔。

3、 点SetPixel

函数功能:该函数将指定坐标处的像素设为指定的颜色。
函数原型:COLORREF SetPixel(HDC hdc, int X, int Y, COLORREF crColor);
参数:
hdc:设备环境句柄。
X:指定要设置的点的X轴坐标,按逻辑单位表示坐标。
Y:指定要设置的点的Y轴坐标,按逻辑单位表示坐标。
crColor:指定要用来绘制该点的颜色。
返回值:如果函数执行成功,那么返回值就是函数设置像素的RGB颜色值。这个值可能与crColor指定的颜色有不同,之所以有时发生这种情况是因为没有找到对指定颜色进行真正匹配造成的;如果函数失败,那么返回值是0。

4、 直线MoveToEx、LineTo

A、 MoveToEx
函数功能:将当前位置指定为特定的某一点
函数原型:BOOL MoveToEx( __in HDC hdc, __in int X, __in int Y, __out LPPoint lpPoint )
参数:
hdc:设备环境句柄。
X:指定要设置的点的X轴坐标,按逻辑单位表示坐标。
Y:指定要设置的点的Y轴坐标,按逻辑单位表示坐标。
lpPoint:指向一个POINT结构,用来接收前一位置,为空时,当前位置不被返回。
返回值:执行成功返回非零,否则返回值为零。

B、 LineTo

函数功能:从当前点到目标点进行画线。
函数原型:BOOL LineTo( int x, int y )
参数说明:
X:目标点的横坐标。
Y:目标点的纵坐标。
返回值:成功非零,其它返回零。

5、 矩形Rectangle

函数功能:该函数画一个矩形,用当前的画笔画矩形轮廓,用当前画刷进行填充。
函数原型:BOOL Rectangle(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);
参数:
hdc:设备环境句柄。
nLeftRect:指定矩形左上角的逻辑X坐标。
nTopRect:指定矩形左上角的逻辑Y坐标。
nRightRect:指定矩形右下角的逻辑X坐标。
nBottomRect:指定矩形右下角的逻辑Y坐标。
返回值:如果函数调用成功,返回值非零,否则返回值为0。

6、 椭圆Ellipse

函数功能:该函数画一个椭圆形,用当前的画笔画矩形轮廓,用当前画刷进行填充。
函数原型:
BOOL Ellipse( HDC hdc, int x1, int y1, int x2, int y2 )

参数:
hdc:设备环境句柄。
x1:指定椭圆形左上角的逻辑X坐标。
y1:指定椭圆形左上角的逻辑Y坐标。
x2:指定椭圆形右下角的逻辑X坐标。
y2:指定椭圆形右下角的逻辑Y坐标。
返回值:如果函数调用成功,返回值非零,否则返回值为0。

你可能感兴趣的:(C语言开发应用)