使用c語言easy—x庫實現實時鐘表

先了解一下easy-x庫

EasyX 是針對 C++ 的圖形庫,可以幫助 C++語言初學者快速上手圖形和游戲編程。
可以通過官網下載,文件很小,
easy-x的支持頭文件是

#include<graphics.h>

下載之后雙擊打開會有所有easy-x函數的語法和作用,中文軟件,上手很快在這里插入圖片描述

分割線,開始鐘表制作

這是最終的效果圖
在這里插入圖片描述

第一步:

新建畫布

    initgraph(Width,High);

Width,High在開頭定義為常量

第二步

在畫布中央繪制一個圓
定義圓心坐標為(Width/2,High/2)

int center_x=Width/2;int center_y=High/2;

繪制一個圓,顏色為藍色,半徑為Width/5+20

setcolor(BLUE);circle(center_x,center_y,Width/5+20);

在這里插入圖片描述

第三步

繪制秒針

	//定義秒針長度int secondlength=Width/5;//畫秒針setlinestyle(PS_SOLID,2);//定義線的類型,寬度為2setcolor(BLUE);//定義顏色為藍色line(center_x,center_y,secondend_x,secondend_y);

在這里插入圖片描述

第三部

實現轉動
思路:使用三角函數知識,控制secondend_x,secondend_y的移動

  1. 轉動角度:每分鐘轉動2*PI,則每秒轉動2*PI/60,獲得當前系統時間的秒值,乘以每秒轉動的角度,即可得出當前時間應該轉動的角度
    注意:三角函數需要#include<math.h>支持
//實現秒針轉動
SYSTEMTIME ti;//獲取系統時間
GetLocalTime(&ti);//得當當前系統時間float secondangle=0;//秒針轉動的角度secondangle=ti.wSecond*2*PI/60;//每秒轉動的角度等于當前時間*2*PI/60secondend_x=center_x+secondlength*sin(secondangle);secondend_y=center_y-secondlength*cos(secondangle);

在這里插入圖片描述
2. 動畫的實現:思路:每次繪制完一幀圖像后,繪制一個與背景顏色一樣的秒針,隱藏前一個秒針,并使用while(1)實現死循環

SYSTEMTIME ti;//獲取系統時間
while(1){GetLocalTime(&ti);//得當當前系統時間//實現秒針轉動secondangle=ti.wSecond*2*PI/60;secondend_x=center_x+secondlength*sin(secondangle);secondend_y=center_y-secondlength*cos(secondangle);//畫秒針setlinestyle(PS_SOLID,2);//定義線的類型,寬度為2setcolor(BLUE);//定義顏色為藍色line(center_x,center_y,secondend_x,secondend_y);//隱藏前一個秒針setcolor(BLACK);line(center_x,center_y,secondend_x,secondend_y);}

但是我們發現圖像一直在閃爍我們加上sleep也不行,easyx提供了批量繪圖函數BeginBatchDraw();FlushBatchDraw();EndBatchDraw();
具體使用方法看百度
注意:sleep需要#include<conio.h>支持

SYSTEMTIME ti;//獲取系統時間BeginBatchDraw();while(1){GetLocalTime(&ti);//得當當前系統時間//實現秒針轉動secondangle=ti.wSecond*2*PI/60;secondend_x=center_x+secondlength*sin(secondangle);secondend_y=center_y-secondlength*cos(secondangle);//畫秒針setlinestyle(PS_SOLID,2);//定義線的類型,寬度為2setcolor(BLUE);//定義顏色為藍色line(center_x,center_y,secondend_x,secondend_y);FlushBatchDraw();Sleep(50);//隱藏前一個秒針setcolor(BLACK);line(center_x,center_y,secondend_x,secondend_y);}EndBatchDraw();

在這里插入圖片描述

類似的,畫出分針和時針,注意時針一個周期是12小時,所以時針的角度應該是
hourAngle=ti.wHour*2*PI/12;
注意代碼結構,先是定義,然后FlushBatchDraw();批量繪制,最后隱藏
拿出代碼

float secondangle=0;//秒針轉動的角度float minuteangle=0;//分針轉動的角float hourAngle=0;//定義時針轉動的角SYSTEMTIME ti;//獲取系統時間BeginBatchDraw();while(1){GetLocalTime(&ti);//得當當前系統時間//實現秒針轉動secondangle=ti.wSecond*2*PI/60;secondend_x=center_x+secondlength*sin(secondangle);secondend_y=center_y-secondlength*cos(secondangle);//實現分針轉動minuteangle=ti.wMinute*2*PI/60;minuteend_x=center_x+minutelength*sin(minuteangle);minuteend_y=center_y-minutelength*cos(minuteangle);//實現時針轉動hourAngle=ti.wHour*2*PI/12;hourEnd_x=center_x+hourlength*sin(hourAngle);hourEnd_y=center_y-hourlength*cos(hourAngle);//畫秒針setlinestyle(PS_SOLID,2);//定義線的類型,寬度為2setcolor(BLUE);//定義顏色為藍色line(center_x,center_y,secondend_x,secondend_y);//畫分針setlinestyle(PS_SOLID,2);//定義線的類型,寬度為2setcolor(YELLOW);//定義顏色為黃色line(center_x,center_y,minuteend_x,minuteend_y);//畫分針setlinestyle(PS_SOLID,3);//定義線的類型,寬度為3setcolor(RED);//定義顏色為黃色line(center_x,center_y,hourEnd_x,hourEnd_y);setcolor(BLUE);FlushBatchDraw();Sleep(50);//隱藏前一個秒針setcolor(BLACK);line(center_x,center_y,secondend_x,secondend_y);//隱藏前一個分針	setcolor(BLACK);line(center_x,center_y,minuteend_x,minuteend_y);//隱藏前一個時針setcolor(BLACK);line(center_x,center_y,hourEnd_x,hourEnd_y);}EndBatchDraw();

在這里插入圖片描述

最后,刻畫表盤

同樣是使用三角函數知識,可以類比指針畫,我使用了一種及其復雜和智障的方法畫,先畫出了12,3,6,9,然后再一個一個刻畫,寫完才想到懶得改了
easyx中文字的輸入用到outtextxy函數以下為outtextxy的用法和實例

outtextxy
這個函數用于在指定位置輸出字符串。void outtextxy(int x,int y,LPCTSTR str
);void outtextxy(int x,int y,TCHAR c
);參數:x 
字符串輸出時頭字母的 x 軸的坐標值 
y 
字符串輸出時頭字母的 y 軸的坐標值。 
str 
待輸出的字符串的指針。 
c 
待輸出的字符。 
返回值:(無)說明:該函數不會改變當前位置。字符串常見的編碼有兩種:MBCS 和 Unicode。VC6 新建的項目默認為 MBCS 編碼,VC2008 及高版本的 VC 默認為 Unicode 編碼。LPCTSTR 可以同時適應兩種編碼。為了適應兩種編碼,請使用 TCHAR 字符串及相關函數。

來自easyx官網

TCHAR s[] = _T("*輸入文字*");outtextxy(x_11+R/3-10, y_11+sqrt(3.0)/2*R+R/2, s);

最后貼上完整代碼和最終效果

上面的代碼是好幾年前寫的,新版本easyx已經放棄了之前的一些函數,有小伙伴反映代碼錯誤很多,我已經在新版本環境下修改了,目前環境是vs2019+easyx 2018春風版,上面代碼沒有修改,思路是一樣的下面貼上修改后的完整源碼

#include<graphics.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
#define High 480
#define Width 640
#define PI 3.1415926
int main()
{//初始化畫布initgraph(Width, High);//定義鐘表中點坐標int center_x = Width / 2;int center_y = High / 2;//定義秒針長度int secondlength = Width / 5;//定義分針長度int minutelength = secondlength - 50;//定義時針長度int hourlength = minutelength - 20;//定義秒針終點坐標int secondend_x, secondend_y;secondend_x = center_x + secondlength;secondend_y = center_y;//定義分針終點坐標int minuteend_x = center_x + minutelength;int minuteend_y = center_y;//定義時針終點坐標int hourEnd_x = center_x + hourlength;int hourEnd_y = center_y;setcolor(BLUE);circle(center_x, center_y, secondlength + 20);//繪制6:00setfillcolor(GREEN);solidcircle(Width / 2 + 4, High / 2 + secondlength + 15, 4);TCHAR s_6[5];_stprintf_s(s_6, _T("%d"), 6);        // 高版本 VC 推薦使用 _stprintf_s 函數outtextxy(Width / 2 - 2, High / 2 + secondlength - 5, s_6);//繪制12:00solidcircle(Width / 2, High / 2 - secondlength - 17, 4);TCHAR s_12[5];_stprintf_s(s_12, _T("%d"), 12);        // 高版本 VC 推薦使用 _stprintf_s 函數outtextxy(Width / 2 - 6, High / 2 - secondlength - 13, s_12);//繪制3:00solidcircle(center_x + secondlength + 17, center_y, 4);TCHAR s_3[5];_stprintf_s(s_3, _T("%d"), 3);        // 高版本 VC 推薦使用 _stprintf_s 函數outtextxy(center_x + secondlength, center_y - 5, s_3);//繪制9:00solidcircle(center_x - secondlength - 17, center_y, 4);TCHAR s_9[5];_stprintf_s(s_9, _T("%d"), 9);        // 高版本 VC 推薦使用 _stprintf_s 函數outtextxy(center_x - secondlength - 8, center_y - 5, s_9);//繪制其他刻度int R = secondlength + 20;int x_11, y_11;x_11 = Width / 2 - R / 2;//11:00刻度橫坐標y_11 = High / 2 - sqrt(3.0) / 2 * R;//11:00刻度縱坐標solidcircle(x_11, y_11, 3);TCHAR s_11[5];_stprintf_s(s_11, _T("%d"), 11);        // 高版本 VC 推薦使用 _stprintf_s 函數outtextxy(x_11, y_11, s_11);int x_10, y_10;x_10 = Width / 2 - sqrt(3.0) / 2 * R;//10:00刻度橫坐標y_10 = High / 2 - R / 2;//11:00刻度縱坐標solidcircle(x_10, y_10, 3);TCHAR s_10[5];_stprintf_s(s_10, _T("%d"), 10);        // 高版本 VC 推薦使用 _stprintf_s 函數outtextxy(x_10, y_10, s_10);int x_8, y_8;x_8 = x_10;y_8 = y_10 + R;solidcircle(x_8, y_8, 3);TCHAR s_8[5];_stprintf_s(s_8, _T("%d"), 8);        // 高版本 VC 推薦使用 _stprintf_s 函數outtextxy(x_8, y_8, s_8);int x_7, y_7;x_7 = x_11;y_7 = y_11 + sqrt(3.0) * R;solidcircle(x_7, y_7, 3);TCHAR s_7[5];_stprintf_s(s_7, _T("%d"), 7);        // 高版本 VC 推薦使用 _stprintf_s 函數outtextxy(x_7, y_7, s_7);int x_5, y_5;x_5 = x_7 + R;y_5 = y_7;solidcircle(x_5, y_5, 3);TCHAR s_5[5];_stprintf_s(s_5, _T("%d"), 5);        // 高版本 VC 推薦使用 _stprintf_s 函數outtextxy(x_5, y_5, s_5);int x_4, y_4;x_4 = x_8 + sqrt(3.0) * R;y_4 = y_8;solidcircle(x_4, y_4, 3);TCHAR s_4[5];_stprintf_s(s_4, _T("%d"), 4);        // 高版本 VC 推薦使用 _stprintf_s 函數outtextxy(x_4, y_4, s_4);int x_2, y_2;x_2 = x_10 + sqrt(3.0) * R;y_2 = y_10;solidcircle(x_2, y_2, 3);TCHAR s_2[5];_stprintf_s(s_2, _T("%d"), 2);        // 高版本 VC 推薦使用 _stprintf_s 函數outtextxy(x_2, y_2, s_2);int x_1, y_1;x_1 = x_11 + R;y_1 = y_11;solidcircle(x_1, y_1, 3);TCHAR s_1[5];_stprintf_s(s_1, _T("%d"), 1);        // 高版本 VC 推薦使用 _stprintf_s 函數outtextxy(x_1, y_1, s_1);float secondangle = 0;//秒針轉動的角度float minuteangle = 0;//分針轉動的角float hourAngle = 0;//定義時針轉動的角SYSTEMTIME ti;//獲取系統時間BeginBatchDraw();while (1){GetLocalTime(&ti);//得當當前系統時間//實現秒針轉動secondangle = ti.wSecond * 2 * PI / 60;secondend_x = center_x + secondlength * sin(secondangle);secondend_y = center_y - secondlength * cos(secondangle);//實現分針轉動minuteangle = ti.wMinute * 2 * PI / 60;minuteend_x = center_x + minutelength * sin(minuteangle);minuteend_y = center_y - minutelength * cos(minuteangle);//實現時針轉動hourAngle = ti.wHour * 2 * PI / 12;hourEnd_x = center_x + hourlength * sin(hourAngle);hourEnd_y = center_y - hourlength * cos(hourAngle);//畫秒針setlinestyle(PS_SOLID, 2);//定義線的類型,寬度為2setcolor(BLUE);//定義顏色為藍色line(center_x, center_y, secondend_x, secondend_y);//畫分針setlinestyle(PS_SOLID, 2);//定義線的類型,寬度為2setcolor(YELLOW);//定義顏色為黃色line(center_x, center_y, minuteend_x, minuteend_y);//畫分針setlinestyle(PS_SOLID, 3);//定義線的類型,寬度為3setcolor(RED);//定義顏色為黃色line(center_x, center_y, hourEnd_x, hourEnd_y);setcolor(BLUE);TCHAR s[] = _T("*小張鐘表*");outtextxy(x_11 + R / 3 - 10, y_11 + sqrt(3.0) / 2 * R + R / 2, s);FlushBatchDraw();Sleep(50);//隱藏前一個秒針setcolor(BLACK);line(center_x, center_y, secondend_x, secondend_y);//隱藏前一個分針	setcolor(BLACK);line(center_x, center_y, minuteend_x, minuteend_y);//隱藏前一個時針setcolor(BLACK);line(center_x, center_y, hourEnd_x, hourEnd_y);}EndBatchDraw();_getch();closegraph();system("pause");return 0;
}

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457715.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457715.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457715.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java基礎—方法重載(overload)

一、方法的重載 方法名一樣&#xff0c;但參數不一樣&#xff0c;這就是重載(overload)。 所謂的參數不一樣&#xff0c;主要有兩點&#xff1a;第一是參數的個數不一樣&#xff0c;第二是參數的類型不一樣。只要這兩方面有其中的一方面不一樣就可以構成方法的重載了。 1 packa…

word 編輯域中的漢字_word中插入的cad對象無法雙擊編輯問題解決記錄

昨日&#xff0c;安裝了天正插件5.0后&#xff0c;插入word中的cad圖無法編輯了&#xff0c;彈出提示的大意是檢查是否安裝了cad或者是否關閉了CAD中所有的彈窗。在此之前&#xff0c;計算機裝了office2010和cad2014及cad2018&#xff0c;office自動關聯cad2018&#xff0c;即使…

php實現注冊登陸驗證

歡迎界面很簡單&#xff0c;直接放上代碼 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"> <head&…

iOS touch事件單擊雙擊區分響應

如果您的 iPhone 應用里有個 view&#xff0c;既有單擊操作又有雙擊操作。用戶雙擊 view 時&#xff0c;總是先執行一遍單擊的操作再執行雙擊的操作。所以直接判斷時就會發現不能直接進入雙擊操作。下面是區分 touch 事件是單擊還是雙擊的方法 -(void)singleTap{ NSLog(&quo…

搭建高可用的redis集群,避免standalone模式帶給你的苦難

現在項目上用redis的話&#xff0c;很少說不用集群的情況&#xff0c;畢竟如果生產上只有一臺redis會有極大的風險&#xff0c;比如機器掛掉&#xff0c;或者內存爆掉&#xff0c;就比如我們生產環境 曾今也遭遇到這種情況&#xff0c;導致redis內存不夠掛掉的情況&#xff0c;…

python計算a的平方加b的平方_NumPy計算范數2的平方

老實說&#xff0c;沒有比np.inner或np.dot更快的了。如果你覺得中間變量很煩人&#xff0c;你可以創建一個lambda函數&#xff1a;sqeuclidean lambda x: np.inner(x, x)np.inner和np.dot利用BLAS例程&#xff0c;幾乎肯定比標準的元素乘法加和快。In [1]: %%timeit -n 1 -r …

php連接MySQL

先說一下我踩了三天的坑 我在這之前用mysql申請了一個數據庫&#xff0c;然后用php連接一直連接不上&#xff0c;試了許多辦法&#xff0c;都不行 下載MySQL時顯示3306端口被占用&#xff0c;所以選了3307 一直報錯&#xff0c;三天后&#xff0c;終于知道了&#xff0c;你用的…

SVG動畫

動畫原理 SVG動畫&#xff0c;就是元素的屬性值關于時間的變化。 如下圖來說&#xff0c;元素的某個屬性值的起始值&#xff08;from&#xff09;到結束值&#xff08;to&#xff09;在一個時間段&#xff08;duration&#xff09;根據時間函數&#xff08;timing-function&…

bootstrap彈出的模態框水平垂直居中的實現

學習javascript從入門到放棄&#xff01;&#xff0c;這是第一篇隨筆&#xff0c;經驗不足&#xff0c;如有不當之處&#xff0c;還望指出。好了廢話不多說直接切入正題吧 1.bootstrap默認的model寫法&#xff1a; //觸發模態框的button <button data-toggle"modal&quo…

python開發實踐教程_Python開發實踐教程

前言第一章 通過求三角形面積步入Python程序世界 案例1-1 求三角形面積 導讀 知識梳理與擴展 小結 練習一第二章 常用運算、使用自定義函數 案例2-1 用函數的方法計算三角形面積 導讀 案例2-2 開發一個求三角形面積的工具包 知識梳理與擴展 小結 練習二第三章 分支、循環和列表…

正則表達式 PHP

正則表達式的常用函數&#xff1a; 先寫一個函數show&#xff0c;用來輸出數組&#xff0c;使代碼看起來方便&#xff0c;且把經常重復用到的量放在前面 function show($varnull) {if(empty($var))//檢測變量是否為空{echo null;}elseif (is_array($var)||is_object($var))//…

iis發布網站怎么支持.json文件

轉載于:https://www.cnblogs.com/daizhipeng/p/5622839.html

PHP Cookie和Session

cookie cookle常用來識別用戶&#xff0c;可以理解為瀏覽器留下的一種文件&#xff0c;cookie可以分為會話cookie和硬盤cookie兩種&#xff0c;會話cookie生命周期短&#xff0c;瀏覽器關閉即銷毀&#xff0c;硬盤cookie生命周期由開發者設定&#xff0c;可長可短 1.創建cook…

瀏覽器渲染機制

1. 明白瀏覽器渲染的目的 可訪問性&#xff08;Accessability&#xff09;、加載性能和重構靈活性一直是前端工程師們關心的主題。 其中加載性能與瀏覽器的渲染機制深深掛鉤&#xff0c;弄明白瀏覽器背后的渲染機制&#xff0c;才能在日常的前端的開發中明白如何進行性能優化。…

java中List Set Map使用

Testpublic void run(){ArrayList<String> list new ArrayList<String>();list.add( "美女");list.add( "帥哥");list.add( "芙蓉姐姐" );for (int i 0; i < list.size(); i) {String strlist.get(i);System. out.println(str);…

python免費開源工具推薦_年薪200萬的程序員,推薦這10大Python免費開源工具!

原標題&#xff1a;年薪200萬的程序員&#xff0c;推薦這10大Python免費開源工具&#xff01;毫無疑問&#xff0c;Python是最流行的語言之一&#xff0c;其成功的原因之一是它為科學計算提供了廣泛的報道。 在這里&#xff0c;我們仔細研究用于機器學習和數據科學的十大Python…

通過Yeoman快速搭建AngularJS webapp應用的實踐

這里主要記錄關于使用yeoman快速構建angluarJS的前端應用的實踐&#xff1a; 安裝node、yeoman等過程略去 1、首頁我們可以在公共的腳手架中找到自己想要的腳手架&#xff0c;官方腳手架庫的地址 Yeoman generators: http://yeoman.io/generators/ 這里我們選擇官方團隊出的ang…

[Objective-C]編程藝術 筆記整理

看了《禪與 Objective-C 編程藝術》&#xff0c;發現不少平時不注意的或注意但沒有系統總結的東西&#xff0c;特此記錄一下。 這次沒有整理完&#xff0c;后續更新會結合手里的一些其他資料整理。 新博客wossoneri.com傳送門 完整的介紹看這兩個鏈接Google開源項目風格指南禪與…

python大數據工程師 培訓_大數據工程師學習之路

大數據的作用&#xff1a;發現過去事件的特征預測未來最優化選擇職位劃分&#xff1a;數據產品經理數據分析師->商業敏感性&#xff0c;產品經理的助手數據研發工程師數據挖掘工程師/數據科學家需要準備的技術知識&#xff1a;Linux操作系統與網絡編程&#xff1a;進程/線程…

python序列

python序列 列表 python變量不存放值&#xff0c;之存放值的引用&#xff0c;所以列表中元素可以是不同類型 1.常用方法 1.1 增加元素 append,在末尾插入元素 extend&#xff0c;將一個列表整體插入到尾部 insert&#xff0c;將某個元素插入到特定位 /*&#xff0c;拼合…