C語(yǔ)言控制臺(tái)應(yīng)用程序GDI繪制正弦曲線(xiàn)
出于本科教學(xué)的目的,需要使用C語(yǔ)言在Visual Studio下控制臺(tái)應(yīng)用程序中動(dòng)態(tài)繪制曲線(xiàn),在此查閱了一些資料,制作了一個(gè)繪制動(dòng)態(tài)正弦曲線(xiàn)的Demo,大家可根據(jù)這個(gè)例子查閱GDI、GDI+手冊(cè),根據(jù)需求豐富自己的繪圖程序。
#include <windows.h>//引入wingdi.h #include <stdio.h> #include <math.h> #include <time.h> #include <conio.h> #define PI 3.1416 #define ORIGINX 0 //曲線(xiàn)起點(diǎn)X坐標(biāo) #define ORIGINY 200 //曲線(xiàn)起點(diǎn)Y坐標(biāo) #define LENGTHX 800 //X坐標(biāo)軸長(zhǎng)度 #define LENGTHY 300 //Y坐標(biāo)軸長(zhǎng)度 #define XDATALEN 300//X坐標(biāo)數(shù)據(jù)量 HDC hdc = 0;//控制臺(tái)繪圖設(shè)備描述句柄 HDC HPEN hPen, hPen2;//畫(huà)筆變量 HPEN hPenOld; TCHAR title[256];//控制臺(tái)程序標(biāo)題 int times = 0;//繪制次數(shù)變量 double datay[XDATALEN];//曲線(xiàn)縱坐標(biāo)數(shù)組 //繪制清屏矩形 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); //繪制黑色矩形,范圍可根據(jù)需要自行更改 Rectangle(hdc, ORIGINX, 0, ORIGINX + LENGTHX + 1, ORIGINY + LENGTHY + 1); } int main() { //獲取控制臺(tái)標(biāo)題 GetConsoleTitle(title, 256); //先通過(guò)FindWindow函數(shù)借助標(biāo)題獲取窗口句柄HWND,之后再利用GetDC函數(shù)借助HWND獲取HDC hdc = GetDC(FindWindow(0, title)); hPen = CreatePen(PS_SOLID, 3, RGB(255, 0, 0));//設(shè)置曲線(xiàn)畫(huà)筆,紅色 hPen2 = CreatePen(PS_SOLID, 3, RGB(0, 0, 255));//設(shè)置X軸畫(huà)筆,藍(lán)色 hPenOld = (HPEN)SelectObject(hdc, hPen); while (1) { ClearWind(hdc);//清屏 hPenOld = (HPEN)SelectObject(hdc, hPen);//選擇畫(huà)筆 MoveToEx(hdc, ORIGINX, ORIGINY, NULL);//移動(dòng)到起點(diǎn) for (int i = 0; i < XDATALEN; i++) { datay[i] = sin(0.1*i + times);//生成曲線(xiàn)縱坐標(biāo)數(shù)組 } for (int i = 0; i < XDATALEN; i++) { //繪制線(xiàn)段,連接前一個(gè)點(diǎn)與下一個(gè)點(diǎn),第二個(gè)參數(shù)為目標(biāo)點(diǎn)x坐標(biāo),第三個(gè)參數(shù)為y坐標(biāo) LineTo(hdc, LENGTHX * i / XDATALEN + ORIGINX, 0.5 * LENGTHY * datay[i] + ORIGINY); } //創(chuàng)建繪制x軸的pen并將其選入設(shè)備上下文 hPenOld = (HPEN)SelectObject(hdc, hPen2);//選擇畫(huà)筆 MoveToEx(hdc, ORIGINX, ORIGINY, NULL);//移動(dòng)到起點(diǎn) LineTo(hdc, ORIGINX + LENGTHX, ORIGINY);//繪制X軸直線(xiàn) times++; Sleep(100);//延時(shí)100ms if (kbhit())//檢查是否有按鍵按下 { if (_getch() == 0x1b)//若按下ESC鍵跳出循環(huán) { break; } } } DeleteObject(hPen);//刪除畫(huà)筆 DeleteObject(hPen2);//刪除畫(huà)筆 return 0; }
運(yùn)行結(jié)果如下所示:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(769.可排序的最大塊數(shù))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(769.可排序的最大塊數(shù)),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07實(shí)現(xiàn)posix消息隊(duì)列示例分享
這篇文章主要介紹了實(shí)現(xiàn)posix消息隊(duì)列示例,學(xué)習(xí)記錄鎖,線(xiàn)程互斥量,線(xiàn)程條件變量,內(nèi)存映射,信號(hào),線(xiàn)程的綜合應(yīng)用,需要的朋友可以參考下2014-02-02詳解C++編程中對(duì)二進(jìn)制文件的讀寫(xiě)操作
這篇文章主要介紹了C++編程中對(duì)二進(jìn)制文件的讀寫(xiě)操作,是C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09