出于本科教学的目的,需要使用C语言在Visual Studio下控制台应用程序中动态绘制曲线,在此查阅了一些资料,制作了一个绘制动态正弦曲线的Demo,大家可根据这个例子查阅GDI、GDI+手册,根据需求丰富自己的绘图程序。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
#include <windows.h>//引入wingdi.h
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <conio.h>
#define PI 3.1416
#define ORIGINX 0 //曲线起点X坐标
#define ORIGINY 200 //曲线起点Y坐标
#define LENGTHX 800 //X坐标轴长度
#define LENGTHY 300 //Y坐标轴长度
#define XDATALEN 300//X坐标数据量
HDC hdc = 0; //控制台绘图设备描述句柄 HDC
HPEN hPen, hPen2; //画笔变量
HPEN hPenOld;
TCHAR title[256]; //控制台程序标题
int times = 0; //绘制次数变量
double datay[XDATALEN]; //曲线纵坐标数组
//绘制清屏矩形
void ClearWind( HDC hdc)
{
HPEN hPen;
HBRUSH hBrush;
hBrush = CreateSolidBrush(RGB(0, 0, 0));
hPen = CreatePen(PS_SOLID, 0, RGB(0, 0, 0));
SelectObject(hdc, hBrush);
SelectObject(hdc, hPen);
//绘制黑色矩形,范围可根据需要自行更改
Rectangle(hdc, ORIGINX, 0, ORIGINX + LENGTHX + 1, ORIGINY + LENGTHY + 1);
}
int main()
{
//获取控制台标题
GetConsoleTitle(title, 256);
//先通过FindWindow函数借助标题获取窗口句柄HWND,之后再利用GetDC函数借助HWND获取HDC
hdc = GetDC(FindWindow(0, title));
hPen = CreatePen(PS_SOLID, 3, RGB(255, 0, 0)); //设置曲线画笔,红色
hPen2 = CreatePen(PS_SOLID, 3, RGB(0, 0, 255)); //设置X轴画笔,蓝色
hPenOld = ( HPEN )SelectObject(hdc, hPen);
while (1)
{
ClearWind(hdc); //清屏
hPenOld = ( HPEN )SelectObject(hdc, hPen); //选择画笔
MoveToEx(hdc, ORIGINX, ORIGINY, NULL); //移动到起点
for ( int i = 0; i < XDATALEN; i++)
{
datay[i] = sin (0.1*i + times); //生成曲线纵坐标数组
}
for ( int i = 0; i < XDATALEN; i++)
{
//绘制线段,连接前一个点与下一个点,第二个参数为目标点x坐标,第三个参数为y坐标
LineTo(hdc, LENGTHX * i / XDATALEN + ORIGINX, 0.5 * LENGTHY * datay[i] + ORIGINY);
}
//创建绘制x轴的pen并将其选入设备上下文
hPenOld = ( HPEN )SelectObject(hdc, hPen2); //选择画笔
MoveToEx(hdc, ORIGINX, ORIGINY, NULL); //移动到起点
LineTo(hdc, ORIGINX + LENGTHX, ORIGINY); //绘制X轴直线
times++;
Sleep(100); //延时100ms
if (kbhit()) //检查是否有按键按下
{
if (_getch() == 0x1b) //若按下ESC键跳出循环
{
break ;
}
}
}
DeleteObject(hPen); //删除画笔
DeleteObject(hPen2); //删除画笔
return 0;
}
|
运行结果如下所示:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/gufeiyunshi/article/details/75948225