文章目录

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

先看MATLAB如何做

极坐标函数
ρ=exp⁡(cos⁡(θ))−2cos⁡(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);

结果:

如果不用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<windows.h>
#include<math.h>
#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

运行结果:

再来几个例子

三叶草

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

Cpp代码:

#include<windows.h>
#include<math.h>
#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;
}

程序中演示如何设定画笔起始位置。
运行结果:

正弦波:

#include<windows.h>
#include<math.h>
#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;
}

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

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

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<windows.h>
#include<math.h>
#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;
}

结果:

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

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

图就成了这样:

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

......HFONT font = CreateFont(28, // nHeight0, // nWidth50, // nEscapement0, // nOrientationFW_BOLD, // nWeightTRUE, // bItalicFALSE, // bUnderline0, // cStrikeOutANSI_CHARSET, // nCharSetOUT_DEFAULT_PRECIS, // nOutPrecisionCLIP_DEFAULT_PRECIS, // nClipPrecisionDEFAULT_QUALITY, // nQualityDEFAULT_PITCH | FF_SWISS,"Arial" // nPitchAndFamily Arial);SelectObject(hdc, font);
......

作图结果:

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

完整代码:

#include<windows.h>
#include<math.h>
#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, // nHeight0, // nWidth50, // nEscapement0, // nOrientationFW_BOLD, // nWeightTRUE, // bItalicFALSE, // bUnderline0, // cStrikeOutANSI_CHARSET, // nCharSetOUT_DEFAULT_PRECIS, // nOutPrecisionCLIP_DEFAULT_PRECIS, // nClipPrecisionDEFAULT_QUALITY, // nQualityDEFAULT_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<windows.h>
#include<stdio.h>
#include<math.h>
#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;
}

#include<windows.h>
#include<stdio.h>
#include<math.h>
#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;
}

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

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

#include<windows.h>
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<windows.h>
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。

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

  1. 基于VC6.0的控制台作图--动画和双缓冲技术

    文章目录 让图形动起来 直接向屏幕作图 使用双缓冲技术 双缓冲技术编程原理 让图形动起来 让图形动起来的办法就是不断定时清屏.重绘.像放电影那样.然而,直接向屏幕绘图是耗时的,在屏幕上画很多线,将多次 ...

  2. VC6.0建立控制台程序实现PDA应用

    作者:iamlaosong 由于须要,又写起了文本界面的程序,以便PDA通过telnet连上运行. 假设是Linuxserver的话.这是非常easy的事,但是用户server是windows ser ...

  3. 基于VC6.0恶搞小程序

    前言: 环境:VC6.0 小编去年暑假的时候看过杨中科的C语言也能干大事第二版,写了个挺有意思的小软件(挺简单的恶搞...): 视屏下载:点击打开链接 (第二版基于VC6.0,现在已经出了基于VS的, ...

  4. 【Vue3 造轮子项目 ------ kaite-ui】基于vue3.0 + vite + TypeScript 实现一个UI框架 - kaiteUI

    基于vue3.0 + vite + TypeScript 实现一个UI框架 - kaiteUI 前言 前段时间笔者一直忙于学习Vue3方面新知识,比如如何从vue2.0版本过渡到vue3.0,如何理解 ...

  5. JAVA5000行代码什么概念_GitHub - catstiger/mvc: 一个不超过5000行代码的,快速,简单,易用的MVC框架。...

    一个不超过5000行代码的,快速,简单,易用的MVC框架. 我们的目的是: 让MVC回归其最初的目的. 因简单而快速,超过目前各种主流MVC. 零侵入,零配置,易于测试,并且让开发者感觉不到MVC的存 ...

  6. Wechaty Plugin|实现一个微信机器人几行代码即可

    写在前面 晚到几个月的帖子,这几个月有些忙,没顾上,关于为什么要开发微信机器人.技术选型.Token申请.一期简单的开发可以看我4个月之前发布的文章 Wechaty|NodeJS基于iPad协议手撸一 ...

  7. 小新近来魂不守舍,一直思索这样一个问题?3行代码解决GIF圆角问题

    前言 新开的重庆麻辣烫味道不错哟,「大师兄」大快朵颐,这时正好看到「小新」走了进来,一副魂不守舍的样子. PS:文末有人品红包,文末有人品红包,文末有人品红包. 这家麻辣烫真好吃,下次还来.接着讲解 ...

  8. c语言vc6.0编写贪吃蛇,基于VC6.0的贪吃蛇游戏源码

    //******************************************************* //**************************************** ...

  9. 基于VC6.0用MFC编写简易计算器

    功能介绍: 1> 标准型:能进行加.减.乘.除四则运算,具有清空.回退功能,还附加了添加小数点.化为百分数的功能. 2> 科学型:新增了求三角函数(sin.cos.tan).反三角函数(a ...

最新文章

  1. ARM嵌入式操作系统启动
  2. 责任链模式 mashibing代码
  3. shell中的mput_FTP命令详解 及 shell中的使用
  4. OS - MMAP初探
  5. Kafka分布式环境搭建
  6. Center os vi
  7. Zookeeper的概述
  8. 【转载】我为啥不想用Python
  9. 需求分析与建模最佳实践_社交媒体和主题建模:如何在实践中分析帖子
  10. NYOJ2—括号配对问题
  11. 如何新建java内部类_java内部类-1(内部类的定义)
  12. bootstrap兼容ie8以下版本
  13. 音乐的聆听 古典音乐的入门
  14. 小工具:(求ASCII码值)
  15. 纯代码蓝色理想的logo
  16. 机器学习:房价预测项目实战
  17. Android手机无线调试
  18. 【软考-软件设计师精华知识点笔记】第十章 网络与信息安全
  19. JVM成神之路-HotSpot虚拟机-编译原理、JIT、编译优化
  20. CPU 运行频率监控

热门文章

  1. 会哭的人不一定流泪(DJ版)铃声 会哭的人不一定流泪(DJ版)...
  2. Unable to install breakpoint in处理方法
  3. 2021-11-4 kalibr_calibrate_camera 標定Mynteye
  4. 【GUI】一、Swing外观框架BeautyEye使用
  5. 如何应对洗钱犯罪的新变化?探索图数据库在反洗钱中的应用
  6. C++实现复化梯形公式求积分算法
  7. 云效携手ACK助力「上海博卡」DevOps转型之路
  8. 计算机导论实验问题及心得,计算机导论心得.doc
  9. 免费试用腾讯企业邮箱
  10. 2020-2021学年——图像图形编程实践实验3_图像拉普拉斯锐化