C语言控制台应用程序GDI绘制正弦曲线

 更新时间:2019年06月01日 10:23:02   作者:孤飞云逝  
这篇文章主要为大家详细介绍了C语言控制台应用程序GDI绘制正弦曲线,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

出于本科教学的目的,需要使用C语言在Visual Studio下控制台应用程序中动态绘制曲线,在此查阅了一些资料,制作了一个绘制动态正弦曲线的Demo,大家可根据这个例子查阅GDI、GDI+手册,根据需求丰富自己的绘图程序。

#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;
}

运行结果如下所示:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 详解C++中static的用法

    详解C++中static的用法

    这篇文章主要介绍了c++中static的用法详解,C 语言的 static 关键字有三种用途,具体内容详情大家跟随脚本之家小编一起学习吧
    2018-05-05
  • C++实现Huffman的编解码

    C++实现Huffman的编解码

    这篇文章主要为大家详细介绍了C++实现Huffman的编解码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • c++中string和vector的详细介绍

    c++中string和vector的详细介绍

    这篇文章主要介绍了c++中string和vector的详细介绍,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-09-09
  • C语言 超详细讲解链接器

    C语言 超详细讲解链接器

    在C语言中,一个重要的思想就是分别编译,即若干个源程序能够在不一样的时候单独进行编译,而后在恰当的时候整合到一块儿。可是链接器通常是与C编译器分离的,链接器如何作到把若干个C源程序合并成一个总体呢,我们一起来看看
    2022-03-03
  • C++实现LeetCode(769.可排序的最大块数)

    C++实现LeetCode(769.可排序的最大块数)

    这篇文章主要介绍了C++实现LeetCode(769.可排序的最大块数),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 详解C++-(=)赋值操作符、智能指针编写

    详解C++-(=)赋值操作符、智能指针编写

    C++的智能指针是克服C++大坑的非常有用的的手段,之所以说它智能,是因为它为程序员克服了重要的编程问题——悬挂指针,下面通过本文给大家分享C++-(=)赋值操作符、智能指针编写,感兴趣的朋友一起看看吧
    2018-03-03
  • 实现posix消息队列示例分享

    实现posix消息队列示例分享

    这篇文章主要介绍了实现posix消息队列示例,学习记录锁,线程互斥量,线程条件变量,内存映射,信号,线程的综合应用,需要的朋友可以参考下
    2014-02-02
  • C/C++经典算法之约瑟夫问题详解

    C/C++经典算法之约瑟夫问题详解

    这篇文章主要给大家介绍了关于C/C++经典算法之约瑟夫问题的相关资料,约瑟夫环问题是一道经典的数据结构的题目,本文介绍了解决约瑟夫问题的三种方法,需要的朋友可以参考下
    2021-07-07
  • 详解C++编程中对二进制文件的读写操作

    详解C++编程中对二进制文件的读写操作

    这篇文章主要介绍了C++编程中对二进制文件的读写操作,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • 详解C++ 创建文件夹的四种方式

    详解C++ 创建文件夹的四种方式

    这篇文章主要介绍了C++ 创建文件夹的四种方式,本文示例都是在 E:\database 路径下创建一个叫做 testFolder 的文件夹,文章通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2021-11-11

最新评论