最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

EasyX 繪圖庫硬核實現(xiàn)基于配置文件動態(tài)創(chuàng)建

2022-04-06 20:53 作者:思奈理之父之父  | 我要投稿

簡介

使用 EasyX 繪圖庫做一個簡單高亮,按動特效、聲效、的封閉按鈕,支持鼠標操作,使用配置文件動態(tài)創(chuàng)建按鈕,給需要編寫 GUI 程序的小伙伴們一個硬核參考。

按鈕創(chuàng)建函數(shù) button 和鼠標配套傳參函數(shù) buttonparm 。

目的:使用配置文件進行按鈕封裝,進行更加自由方便的批量創(chuàng)建按鈕。

前言

奈葉敬在學(xué)校時期曾接觸過名為 graphics.h 的繪圖庫,當時也查過是繪圖庫,該繪圖庫是直接在 devcpp 編譯器上運行的,年代似乎沒記錯的話該編譯器版本是 2004 年來著?編譯器是偷偷用電腦傳輸圖片功能傳進來的,是把壓縮包改成 JPG 格式的后綴,就傳進去了,很是神奇的 BUG。當時電腦禁用 USB 文件傳輸。過去了這么久,用現(xiàn)在的眼光來看 EasyX 這個繪圖庫就覺得很有趣,大家也一樣覺得吧?嘿嘿!盡管知道當初的繪圖庫不是 EasyX,沒辦法誰叫官方教程制作的太好了呢!因為現(xiàn)在需要一個門店收入?yún)R總的小程序,之前都是用 devcpp 寫的命令行版本,說的就是界面還是黑黑呼呼的那個。一點也不人性化,其實!就是不好看啊呀!對吧?突然哇,有一次我突靈光一現(xiàn)的在本子上繪制匯總小程序界面草圖,一直到用 Excel 表格把本子上的草圖繪制出來。

就偶然想起了 EasyX 繪圖庫,用了一點時間照著慢羊羊的官方教程去使用 EasyX 開發(fā),初寫程序就是圖片 x、y 文字坐標定位器和 PS 取色器,硬是把 Excel 上的匯總小程序的表格模板,一點點的繪圖,改成圖形界面,然后嘛就做出來了啦!!果然和表格數(shù)據(jù)的界面一模一樣,這就是繪圖庫的誘人的魅力嗎?對于人性化的程序簡直就是光!但是發(fā)現(xiàn)那個匯總小程序需要按鈕和輸入框,EasyX 但也只是繪圖庫,沒有這些東東怎么辦呢?豐衣自足呀?所以把匯總小程序里的按鈕實現(xiàn)方式給有需要做 EasyX GUI 程序的小伙伴門參考一下,繪圖庫它可不是簡簡單單的繪圖作用哎!


高亮按鈕簡單原理

就是繪制一個有顏色邊框且又有填充顏色的矩形,然后使用 drawtext 函數(shù),把文字居中在該矩形坐標里內(nèi),這樣一個基本按鈕界面就畫好了。然后還需要鼠標移動到按鈕界面上,把這個矩形顏色和按鈕字體顏色改變,就有一種按鈕被選中的視覺差。這里我定義了一個函數(shù),把按鈕位置坐標、和傳入的時實鼠標坐標、和按鈕輸出文本、和按鈕字體大小、都封裝在一起。當調(diào)用 button 按鈕創(chuàng)建函數(shù)時,鼠標坐標沒有移動到該按鈕內(nèi)部里時,會畫一下按鈕沒有被選中時的矩形顏色,就是基本文字按鈕界面,當 button 函數(shù)里的 if 判斷鼠標坐標移動到該按鈕上的坐標里,就使用 button 函數(shù)內(nèi)另一個畫有顏色的矩形,和別一個 drawtext 輸出文體。從而復(fù)蓋原有的矩形顏色和文本,簡單來說就是刷新了按鈕。刷新成被鼠標選中的高亮按鈕樣式!然后就有一種按鈕被選中的視覺差,如果該按鈕被點擊了就會返回一個 1,這個值很重要,可以通過 if 去判斷鼠標是否被點中。

現(xiàn)在介紹一下按鈕關(guān)鍵的函數(shù),button 按鈕創(chuàng)建函數(shù)和 buttonparm 鼠標坐標傳參函數(shù)


配置文件創(chuàng)建按鈕原理

button 函數(shù)介紹?

button 函數(shù)(簡單型按鈕創(chuàng)建函數(shù))


button 按鈕創(chuàng)建函數(shù)如果被點擊了會返回一個值,那個值就是 1 可以通過 if 去判斷是否被點擊了??梢杂赡闳我庵付ㄗ鴺宋恢眠M行按鈕創(chuàng)建、也可以通過改變坐標位置從而來改變按鈕大小、還可以任意設(shè)置按鈕字體大小、可以任意傳入字符數(shù)組,任意設(shè)置按鈕上的文本。另外在此基礎(chǔ)上建立由配置文件來創(chuàng)建按鈕的功能。


使用 button 函數(shù)示例

示例 1:

// 如果該函數(shù)的第三個參數(shù)等于 1,那就是啟用鼠標點擊功能,如果等于其他的數(shù),就是單純的按鈕功能,最后一個參數(shù)是決定在鼠標點擊時候按鈕特效,啟動參數(shù)是 1。

int buttonparm(int mouse_x, int mouse_y, int click, int click_1)

{

?FlushBatchDraw(); // 批量繪圖的開始處。

?if (button(10, 10 + 3, 240, 50, mouse_x, mouse_y, 18, 21, button_string[0][0], button_string[1][0], click_1) == click)system("mspaint"); // 創(chuàng)建按鈕,判斷鼠標移動到這按鈕啟動高亮,且點擊該按鈕打開畫圖板。

?EndBatchDraw(); // 批量繪圖的結(jié)束處。

?return 0;

}

示例 2:


ExMessage mouse;


// 嵌入式死循環(huán)。

while (true)

{

?mouse = getmessage(EM_MOUSE | EM_KEY);


?if (mouse.message == WM_MOUSEMOVE)

?{

? // 創(chuàng)建按鈕,判斷鼠標移動到這按鈕啟動高亮,且點擊該按鈕打開畫圖板。

? if (button(10, 10 + 3, 240, 50, mouse.x, mouse.y, 18, 21, button_string[0][0], button_string[1][0], 1) == 22)system("mspaint");? ? ?

?}


?if (mouse.message == WM_LBUTTONDOWN)

?{

? // 創(chuàng)建按鈕,判斷鼠標移動到這按鈕啟動高亮,且點擊該按鈕打開畫圖板。

? if (button(10, 10 + 3, 240, 50, mouse.x, mouse.y, 18, 21, button_string[0][0], button_string[1][0], 1) == 1)system("mspaint");? ? ?

? flushmessage(EM_MOUSE);

?}

}

buttonparm 函數(shù)介紹

buttonparm 函數(shù)(鼠標的坐標傳輸函數(shù))(把鼠標的坐標傳入到 button 函數(shù)里,就不用在 EasyX 繪圖庫里的鼠標移動和鼠標點擊兩個模式里重復(fù)定一堆創(chuàng)建按鈕函數(shù)(指 button 函數(shù)),然后通過參數(shù)開關(guān)選擇函數(shù)功能)。


簡單來說這個 buttonparm 函數(shù)就是在鼠標參數(shù) WM_LBUTTONDOWN 與 WM_MOUSEMOVE 中調(diào)用。而不是在里邊創(chuàng)建大量一堆的 button 函數(shù),那樣難看又復(fù)雜,該函數(shù)可以在程序開頭調(diào)用來繪制你所有創(chuàng)建的按鈕界面,而不是鼠標移動到軟件界面再創(chuàng)建繪制出所有按鈕界面。


可以在程序初始化的時候調(diào)用這個,只要把點擊和移動的工能禁用就行了,這是機制問題。


該函數(shù):


有四個參數(shù),前一二個是參數(shù)鼠標的坐標 X 和 Y 第三個是代碼參數(shù),分別對應(yīng),控制啟用”鼠標點擊“和”鼠標移動高亮按鈕“和”什么都不干只繪制所有按鈕功能“代碼參數(shù)分別是” 1 “ 和” 22 “和” 33 “,最后一個參數(shù)是決定在鼠標點擊時候按鈕特效,啟動參數(shù)是 1。


該函數(shù)有四個功能:


第一:顯示你創(chuàng)建的基本按鈕!得在程序初始化的地方調(diào)用,至少是聲明鼠標類型之前,即鼠標移動到按鈕上不高亮,也不讓鼠標點擊判斷按鈕被點擊,就是基本繪制你創(chuàng)建的所有按鈕圖形界面,等于顯示按鈕。配合 buttonparm 函數(shù)使用(就是把所有的 button 寫到 buttonparm 函數(shù)里,然后在鼠標函數(shù)調(diào)用 buttonparm 函數(shù)。請在 EasyX 初始化相關(guān)的地方里的這樣調(diào)用 buttonparm(NULL, NULL, 33, NULL);??刂茊⒂檬裁炊疾桓桑焕L制按鈕圖形的功能,代碼參數(shù)是 33,例子:buttonparm(NULL, NULL, 33, 1);。


第二:顯示鼠標移動到該按鈕上的高亮按鈕,就是鼠標走到那個按鈕,那個按鈕就高亮視覺差,就是被選擇了的按鈕效果。(但是要把所有的 button 創(chuàng)建按鈕函數(shù)寫到 buttonparm 函數(shù)里,然后在鼠標函數(shù)移動中調(diào)用 buttonparm 函數(shù),并輸入鼠標坐標參數(shù),好讓 button 知道鼠標在哪個位置),


請在 EasyX 鼠標相關(guān)的函數(shù)里的這樣調(diào)用 if (SB.message == WM_MOUSEMOVE)buttonparm(SB.x, SB.y, 33, 0);??刂茊⒂檬髽艘苿痈吡涟粹o,代碼參數(shù)是 33,例子:buttonparm(SB.x, SB.y, 33, 0);。


第三:實現(xiàn)點擊哪個按鈕,哪個按鈕就干什么,哪個按鈕點擊了,就是調(diào)用對應(yīng)的功能。請在 EasyX 鼠標相關(guān)的函數(shù)里的這樣調(diào)用 if (SB.message == WM_LBUTTONDOWN)buttonparm(SB.x, SB.y, 1, 1);。控制啟用鼠標點擊,代碼參數(shù)是 1 例子:buttonparm(SB.x, SB.y, 1, 1);。


button 函數(shù)如果被點擊了會返回一個值,那個值就是 1,可以通過 if 去判斷是否被點擊了,從而進行處理。


第四:鼠標點擊時候按鈕特效,啟動參數(shù)是 1,關(guān)閉參數(shù)是 0。


使用 buttonparm 函數(shù)示例

示例 1:

ExMessage mouse;

// 嵌入式死循環(huán)。

while (true)

{

mouse = getmessage(EM_MOUSE | EM_KEY);

// 獲取鼠標消息,然后判斷鼠標移動中遇到的事,調(diào)用 buttonparm 按鈕綜合函數(shù)。

// 參數(shù) 33 代表不開啟鼠標點擊功能,只創(chuàng)建和繪制按鈕加,鼠標移動到按鈕坐標上邊會有高亮按鈕。

// 最后一個參數(shù)是決定在鼠標點擊時候按鈕特效,關(guān)閉參數(shù)是 0。

if (mouse.message == WM_MOUSEMOVE)

{

buttonparm(mouse.x, mouse.y, 33, 0);

}

if (mouse.message == WM_LBUTTONDOWN)

{

if (buttonparm(mouse.x, mouse.y, 1, 1) == 1)break;

}

// 獲取鼠標消息,然后判斷鼠標在點擊中遇到的事,調(diào)用 buttonparm 按鈕綜合函數(shù)。

// 參數(shù) 1 代表不開啟鼠標移動到按鈕上的高亮,如果鼠標點擊到按鈕上,那么 buttonparm 函數(shù)會判斷發(fā)生的事情。

// 最后一個參數(shù)是決定在鼠標點擊時候按鈕特效,啟動參數(shù)是 1。

// 非常靈活的返回值,自由設(shè)定返回值,返回功能,這里返回 1 我就結(jié)束主循環(huán)退出程序。任意設(shè)定。

}

程序截圖如下

效果圖

各種顏色的

完整代碼如下

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/*

* 本程序名稱:EasyX 繪圖庫硬核實現(xiàn) GUI 簡單按鈕程序?qū)嵗坛獭?/span>

* 編譯環(huán)鏡:Microsoft Visual Studio Community 2019

* 繪圖庫:EasyX_20211109

* 電腦系統(tǒng):Win10 1809

* 作者:奈葉敬 2963787923@qq.com

* 程序起始時間:2021 - 7 - 10

* 程序最后結(jié)束修改時間:2022 - 3 - 9 0:19

*

* 更新內(nèi)容:

* 1.新增鼠標位置顯示。

* 2.新增按扭點擊特效。

* 3.新增按鈕點擊聲效。

* 4.新改按鈕界面并美化。

* 5.新增按鈕顏色修改函數(shù),自由修改顏色,本次預(yù)設(shè)按鈕顏色有,稚紅按鈕,紫愛按鈕,紫白按鈕,原色按鈕,輕綠按鈕,粉紫按鈕,青暗按鈕,紅亮按鈕。

* 6.2022 年 3 月 9 日內(nèi)容大改造,基于配置文件動態(tài)生成按鈕。

* 目的:使用按鈕封閉函數(shù)自由方便的批量創(chuàng)建按鈕,實現(xiàn)用 EasyX 繪圖庫做一個簡單的鼠標按鈕操作,給需要編寫 GUI 程序的小伙伴們一個硬核參考,之后如果可以編寫一套完整的 GUI 控件。

* 歷史:本程序源碼歷史能運行的,最長源碼 300 行,歷史最長最短源碼 67 行,歷史最長折中源碼 80 多行,換過無數(shù)種思路。

* 編譯調(diào)試建議:無。

*

* 代碼函數(shù)定義位置順序排列如下:

* setbuttonini -> getbuttonini - > setgetbuttonini - > setbuttoncolor - > button_textzise - >

* button_function -> button -> buttonparm - > X_Y - > lnitial_drawing

*

*/

#include <graphics.h> // 繪圖庫頭文件。

#include <conio.h> // 函數(shù) _getch 的所在庫。

#include <windows.h> // 系統(tǒng)庫。

#include <stdio.h> // 標準庫。

#include <string.h> // 字集處理庫。

#include <ShlObj.h> // 獲取桌面壁紙的函數(shù)的頭文件。

#include<mmsystem.h> // 音樂播放 API 函數(shù)所在庫。

#pragma comment(lib, "winmm.lib") // 音樂播放相關(guān)。


#define width 250 // 程序?qū)挕?/span>

#define high 750 // 程序高。


// 程序函數(shù)目錄,10 個核心函數(shù)構(gòu)成本程序。


// 定義設(shè)置原始按鈕位置,字符串,字體大小,的配置文件,并導(dǎo)出成模版函數(shù),內(nèi)容由讀取配置文件函數(shù)讀取,并打開程序只執(zhí)行一次。

void setbuttonini(TCHAR buttonstring[], TCHAR x1[], TCHAR y1[], TCHAR x2[], TCHAR y2[], TCHAR buttonstr1[], TCHAR buttonstr2[], TCHAR textsize1[], TCHAR textsize2[]);

// 定義加載讀取配置文件里定義的按鈕函數(shù)。

void getbuttonini();

// 定義調(diào)用設(shè)置按鈕函數(shù)和讀取配置文件里定義的按鈕函數(shù)。

void setgetbuttonini();

// 定義按鈕顏色修改函數(shù)。

void setbuttoncolor(int button_r1, int button_g1, int button_b1, int button_r2, int button_g2, int button_b2);

// 修改按鈕字體大小函數(shù)。

void button_textzise(int zise);

// 定義按鈕點擊功能函數(shù) button_function 傳入相對應(yīng)的按鈕序號來判斷按鈕點擊后對應(yīng)設(shè)置的功能。

int button_function(int i);

// 定義按鈕創(chuàng)建函數(shù)。

int button(int x1, int y1, int x2, int y2, int mouse_x, int mouse_y, int textsize1, int textsize2, TCHAR button_string1[], TCHAR button_string2[], int click_1);

// 定義按鈕傳輸參數(shù)函數(shù)。

int buttonparm(int mouse_x, int mouse_y, int click, int click_1);

// 定義顯示鼠標移動的坐標函數(shù)。

int X_Y(int zise, long mouse_x, long mouse_y);

// 定義 GUI 圖形界面的初始化。

void lnitial_drawing();


int button_rgb1[3][1] = { 19, 113, 171 }; // 聲明顏色 RGB 變量,可以修改這個改變按鈕前景或者背景顏色,并可以初始化顏色。

int button_rgb2[3][1] = { 201, 222, 245 }; // 聲明顏色 RGB 變量,可以修改這個改變按鈕前景或者背景顏色,并可以初始化顏色。

int button_quantity = 0; // 決定讀取配置文件里的按鈕數(shù)量的值,用于打印按鈕。

int button_int[100][7] = { 0 }; // 由讀取配置函數(shù),存放配置文件里的各各按鈕坐標位置,字體大小,并用于按鈕函數(shù)打印出內(nèi)容的整形數(shù)組。

TCHAR button_stringchar[100][4][155] = { 0 }; // 由讀取配置函數(shù),存放配置文件里的各各按鈕字符串,并用于按鈕函數(shù)打印出內(nèi)容字符型數(shù)組。

TCHAR button_string[256][9][100] = // 三維數(shù)組的巧妙應(yīng)用于,鼠標移動到按鈕位置發(fā)生不一樣選擇,原始按的鈕坐標,按鈕文本,字體大小數(shù)據(jù)用于生成模版配置文件。

{

?{_T("10"), _T("555 "), _T("65"), _T("588"), _T("輕綠按鈕"), _T("輕綠按鈕"), _T("13"), _T("12")},

?{_T("68"), _T("555 "), _T("122"), _T("588"), _T("粉紫按鈕"), _T("粉紫按鈕"), _T("13"), _T("12")},

?{_T("125"), _T("555 "), _T("179"), _T("588"), _T("青暗按鈕"), _T("青暗按鈕"), _T("13"), _T("12")},

?{_T("182"), _T("555"), _T("238"), _T("588"), _T("紅亮按鈕"), _T("紅亮按鈕"), _T("13"), _T("12")},

?{_T("10"), _T("509"), _T("65"), _T("544"), _T("稚紅按鈕"), _T("稚紅按鈕"), _T("13"), _T("12")},

?{_T("68"), _T("509"), _T("122"), _T("544"), _T("紫愛按鈕"), _T("紫愛按鈕"), _T("13"), _T("12")},

?{_T("125"), _T("509"), _T("179"), _T("544"), _T("紫白按鈕"), _T("紫白按鈕"), _T("13"), _T("12")},

?{_T("182"), _T("509"), _T("238"), _T("544"), _T("原色按鈕"), _T("原色按鈕"), _T("13"), _T("12")},

?{_T("10"), _T("13"), _T("240"), _T("50"), _T("打開畫板"), _T("-打開畫板-"), _T("15"), _T("18")},

?{_T("10"), _T("58"), _T("240"), _T("98"), _T("計算器"), _T("-計算器-"), _T("15"), _T("18")},

?{_T("10"), _T("103"), _T("240"), _T("143"), _T("打開任務(wù)管理"), _T("-打開任務(wù)管理-"), _T("15"), _T("18")},

?{_T("10"), _T("148"), _T("240"), _T("188"), _T("打開終端"), _T("-打開終端-"), _T("15"), _T("18")},

?{_T("10"), _T("193"), _T("240"), _T("233"), _T("查看電腦版本"), _T("-查看電腦版本-"), _T("15"), _T("18")},

?{_T("10"), _T("238"), _T("240"), _T("278"), _T("打開 VS "), _T("-打開 VS -"), _T("15"), _T("18")},

?{_T("10"), _T("283"), _T("240"), _T("323"), _T("打開資源管理器"), _T("-打開資源管理器-"), _T("15"), _T("18")},

?{_T("10"), _T("328"), _T("240"), _T("368"), _T("打開 EasyX 繪圖庫官網(wǎng)"), _T("-打開 EasyX 繪圖庫官網(wǎng)-"), _T("15"), _T("18")},

?{_T("10"), _T("373"), _T("240"), _T("413"), _T("打開 codebus 官網(wǎng)"), _T("-打開 codebus 官網(wǎng)-"), _T("15"), _T("18")},

?{_T("10"), _T("418"), _T("240"), _T("458"), _T("打開有問必答官網(wǎng)"), _T("-打開有問必答官網(wǎng)-"), _T("15"), _T("18")},

?{_T("10"), _T("464"), _T("74"), _T("499"), _T("關(guān)機電腦"), _T("關(guān)機電腦"), _T("14"), _T("15")},

?{_T("79"), _T("464"), _T("145"), _T("499"), _T("重啟電腦"), _T("重啟電腦"), _T("14"), _T("15")},

?{_T("149"), _T("464"), _T("240"), _T("499"), _T("取消關(guān)機重啟"), _T("取消關(guān)機重啟"), _T("14"), _T("15")},

?{_T("10"), _T("598"), _T("240"), _T("638"), _T("退出小程序"), _T("-退出小程序-"), _T("15"), _T("18")},

};


/// @brief 設(shè)置原始按鈕位置,字符串,字體大小,的配置文件,并導(dǎo)出成模版函數(shù),內(nèi)容由讀取配置文件函數(shù)讀取,并打開程序只執(zhí)行一次。

/// @param buttonstring 按鈕名稱。

/// @param x1 按鈕左上角 X 坐標

/// @param y1 按鈕左上角 Y 坐標

/// @param x2 按鈕右下角 X 坐標

/// @param y2 按鈕右下角 y 坐標

/// @param buttonstr1 按鈕沒選中時的文本大小

/// @param buttonstr2 按鈕沒被選中里的文本

/// @param textsize1 按鈕被選中里的文本

/// @param textsize2 按鈕被選中里的文本

void setbuttonini(TCHAR buttonstring[], TCHAR x1[], TCHAR y1[], TCHAR x2[], TCHAR y2[], TCHAR buttonstr1[], TCHAR buttonstr2[], TCHAR textsize1[], TCHAR textsize2[])

{

?WritePrivateProfileString(buttonstring, _T("按鈕左上角 X 坐標"), x1, _T(".\\buttontese.ini"));

?WritePrivateProfileString(buttonstring, _T("按鈕左上角 Y 坐標"), y1, _T(".\\buttontese.ini"));

?WritePrivateProfileString(buttonstring, _T("按鈕右下角 X 坐標"), x2, _T(".\\buttontese.ini"));

?WritePrivateProfileString(buttonstring, _T("按鈕右下角 y 坐標"), y2, _T(".\\buttontese.ini"));

?WritePrivateProfileString(buttonstring, _T("按鈕沒選中時的文本大小"), textsize1, _T(".\\buttontese.ini"));

?WritePrivateProfileString(buttonstring, _T("按鈕被選中時的文本大小"), textsize2, _T(".\\buttontese.ini"));

?WritePrivateProfileString(buttonstring, _T("按鈕沒被選中里的文本"), buttonstr1, _T(".\\buttontese.ini"));

?WritePrivateProfileString(buttonstring, _T("按鈕被選中里的文本"), buttonstr2, _T(".\\buttontese.ini"));

}

// 加載讀取配置文件里定義的按鈕函數(shù)。

void getbuttonini()

{

?TCHAR button_quantity1[155] = { 0 }; // 用于讀取按鈕的字節(jié)暫存值。

?for (int i = 0; ; i++)

?{

? swprintf(button_quantity1, 30, _T("%d"), i); // 轉(zhuǎn)化 i 整形成字符型,用于讀取函數(shù)。

? button_int[i][0] = GetPrivateProfileInt(button_quantity1, _T("按鈕左上角 X 坐標"), 0, _T(".\\buttontese.ini"));

? button_int[i][1] = GetPrivateProfileInt(button_quantity1, _T("按鈕左上角 Y 坐標"), 0, _T(".\\buttontese.ini"));

? button_int[i][2] = GetPrivateProfileInt(button_quantity1, _T("按鈕右下角 X 坐標"), 0, _T(".\\buttontese.ini"));

? button_int[i][3] = GetPrivateProfileInt(button_quantity1, _T("按鈕右下角 y 坐標"), 0, _T(".\\buttontese.ini"));

? button_int[i][4] = GetPrivateProfileInt(button_quantity1, _T("按鈕沒選中時的文本大小"), 15, _T(".\\buttontese.ini"));

? button_int[i][5] = GetPrivateProfileInt(button_quantity1, _T("按鈕被選中時的文本大小"), 5, _T(".\\buttontese.ini"));

? GetPrivateProfileString(button_quantity1, _T("按鈕沒被選中里的文本"), _T(""), button_stringchar[i][0], 155, _T(".\\buttontese.ini"));

? GetPrivateProfileString(button_quantity1, _T("按鈕被選中里的文本"), _T(""), button_stringchar[i][1], 155, _T(".\\buttontese.ini"));

? button_quantity++; // 記錄讀取多少個按鈕的數(shù)量,用于后續(xù)按鈕打印。


? if (button_int[i][0] == 0) { break; }; // 聽我說如果讀取到,按鈕的末尾或者沒有按鈕讀取了就斷開這個加載配置文件函數(shù)。


?}

}


// 定義調(diào)用設(shè)置按鈕函數(shù)和讀取配置文件里定義的按鈕函數(shù)。

void setgetbuttonini()

{

?int teru1 = 1; // 真假斷定,用于讓初始化配置函數(shù)只執(zhí)行一次,如果配置文件被冊就再調(diào)用生成配置文件模版,1 執(zhí)行,0 不執(zhí)行。

?TCHAR button_quantity1[225] = { 0 }; // 生成配置文件里的按鈕數(shù)量的暫存值,把 for 循環(huán) i 值,轉(zhuǎn)化成按鈕字符。

?teru1 = GetPrivateProfileInt(_T("true"), _T("只生成一次"), 1, _T(".\\buttontese.ini"));


?if (teru1 == 1)

?{

? for (int i = 0; i < 22; i++)

? {

? ?swprintf(button_quantity1, 30, _T("%d"), i);

? ?setbuttonini(button_quantity1, button_string[i][0], button_string[i][1], button_string[i][2], button_string[i][3], button_string[i][4], button_string[i][5], button_string[i][6], button_string[i][7]);

? }

?}

?WritePrivateProfileString(_T("true"), _T("只生成一次"), _T("0"), _T(".\\buttontese.ini"));


?getbuttonini();

}


/// @brief setbuttoncolor 按鈕顏色修改函數(shù)

/// @param button_r1 按鈕背景色 r 色值

/// @param button_g1 按鈕背景色 g 色值

/// @param button_b1 按鈕背景色 b 色值

/// @param button_r2 按鈕被選中的高亮色 r 色值

/// @param button_g2 按鈕被選中的高亮色 g 色值

/// @param button_b2 按鈕被選中的高亮色 b 色值

void setbuttoncolor(int button_r1, int button_g1, int button_b1, int button_r2, int button_g2, int button_b2)

{

?button_rgb1[0][0] = button_r1;

?button_rgb1[1][0] = button_g1;

?button_rgb1[2][0] = button_b1;


?button_rgb2[0][0] = button_r2;

?button_rgb2[1][0] = button_g2;

?button_rgb2[2][0] = button_b2;

}


/// @brief button_textzise 修改按鈕字體大小函數(shù)

/// @param zise 字體大小數(shù)值

void button_textzise(int zise)

{

?LOGFONT f;

?gettextstyle(&f); // 獲取當前字體設(shè)置。

?f.lfHeight = zise; // 設(shè)置字體高度為 48。


?_tcscpy_s(f.lfFaceName, _T("宋體"));

?f.lfQuality = ANTIALIASED_QUALITY; // 設(shè)置輸出效果為抗鋸齒。


?settextstyle(&f);

?setbkmode(TRANSPARENT); // 設(shè)置透明的背景。

}

// 定義按鈕點擊功能函數(shù) button_function 傳入相對應(yīng)的按鈕序號來判斷按鈕點擊后對應(yīng)設(shè)置的功能。

int button_function(int i)

{ // 判斷配置文件里的對應(yīng)按鈕序號,顏色修改函數(shù),輕綠按鈕。

?if (i == 0)setbuttoncolor(17, 153, 142, 56, 239, 125);

?// 判斷配置文件里的對應(yīng)按鈕序號,顏色修改函數(shù),粉紫按鈕。

?if (i == 1)setbuttoncolor(127, 0, 225, 255, 140, 163);

?// 判斷配置文件里的對應(yīng)按鈕序號,顏色修改函數(shù),青暗按鈕。

?if (i == 2)setbuttoncolor(6, 185, 171, 16, 124, 139);

?// 判斷配置文件里的對應(yīng)按鈕序號,顏色修改函數(shù),紅亮按鈕。

?if (i == 3)setbuttoncolor(221, 24, 24, 79, 235, 240);

?// 判斷配置文件里的對應(yīng)按鈕序號,顏色修改函數(shù),稚紅按鈕。

?if (i == 4)setbuttoncolor(254, 67, 100, 252, 157, 153);

?// 判斷配置文件里的對應(yīng)按鈕序號,顏色修改函數(shù),紫愛按鈕。

?if (i == 5)setbuttoncolor(194, 174, 255, 246, 177, 200);

?// 判斷配置文件里的對應(yīng)按鈕序號,顏色修改函數(shù),紫白按鈕。

?if (i == 6)setbuttoncolor(102, 102, 204, 252, 244, 237);

?// 判斷配置文件里的對應(yīng)按鈕序號,顏色修改函數(shù),原色按鈕。

?if (i == 7)setbuttoncolor(19, 113, 171, 201, 222, 245);

?// 判斷配置文件里的對應(yīng)按鈕序號,判斷鼠標移動到這按鈕啟動高亮,且點擊該按鈕打開畫圖板。

?if (i == 8)system("mspaint");

?// 判斷配置文件里的對應(yīng)按鈕序號,判斷鼠標移動到這按鈕啟動高亮,且點擊該按鈕打開計算器。

?if (i == 9)system("start calc");

?// 判斷配置文件里的對應(yīng)按鈕序號,判斷鼠標移動到這按鈕啟動高亮,且點擊該按鈕打開電腦任務(wù)管理器。

?if (i == 10)system("start taskmgr");

?// 判斷配置文件里的對應(yīng)按鈕序號,判斷鼠標移動到這按鈕啟動高亮,且點擊該按鈕打開終端命令行。

?if (i == 11)system("start cmd");

?// 判斷配置文件里的對應(yīng)按鈕序號,判斷鼠標移動到這按鈕啟動高亮,且點擊該按鈕打開電腦信息。

?if (i == 12)system("start winver");

?// 判斷配置文件里的對應(yīng)按鈕序號,判斷鼠標移動到這按鈕啟動高亮,且點擊該按鈕打開 VS。

?if (i == 13)system("start devenv");

?// 判斷配置文件里的對應(yīng)按鈕序號,判斷鼠標移動到這按鈕啟動高亮,且點擊該按鈕打開資源管理器。

?if (i == 14)system("explorer");

?// 判斷配置文件里的對應(yīng)按鈕序號,打開 EASYX 官網(wǎng)。

?if (i == 15)ShellExecuteW(NULL, _T("open"), _T("IEXPLORE"), _T("https://docs.easyx.cn/"), NULL, SW_SHOWMAXIMIZED);

?// 判斷配置文件里的對應(yīng)按鈕序號,打開 EASYX codebus 官網(wǎng)。

?if (i == 16)ShellExecuteW(NULL, _T("open"), _T("IEXPLORE"), _T("https://codebus.cn/"), NULL, SW_SHOWMAXIMIZED);

?// 判斷配置文件里的對應(yīng)按鈕序號,打開 EASYX 有問必答官網(wǎng)。

?if (i == 17)ShellExecuteW(NULL, _T("open"), _T("IEXPLORE"), _T("https://qa.codebus.cn/"), NULL, SW_SHOWMAXIMIZED);

?// 判斷配置文件里的對應(yīng)按鈕序號,判斷鼠標移動到這按鈕啟動高亮,且點擊該按鈕打開關(guān)機。

?if (i == 18)system("shutdown -s -t 30");

?// 判斷配置文件里的對應(yīng)按鈕序號,判斷鼠標移動到這按鈕啟動高亮,且點擊該按鈕打開重啟電腦。

?if (i == 19)system("shutdown -r -t 30");

?// 判斷配置文件里的對應(yīng)按鈕序號,判斷鼠標移動到這按鈕啟動高亮,且點擊該按鈕取消關(guān)機重啟。

?if (i == 20)system("shutdown -a");

?// 判斷配置文件里的對應(yīng)按鈕序號,判斷鼠標移動到這按鈕啟動高亮,且點擊該按鈕打開退出。

?if (i == 21)return 1;


?return 0;

};


/// @brief button 按鈕創(chuàng)建函數(shù)

/// @param x1 按鈕左上角 x 坐標

/// @param y1 按鈕左上角 y 坐標

/// @param x2 按鈕右下角 x 坐標

/// @param y2 按鈕右下角 y 坐標

/// @param mouse_x 鼠標 x 座標

/// @param mouse_y 鼠標 y 座標

/// @param textsize1 鼠標沒選中按鈕時字體大小

/// @param textsize2 鼠標選中按鈕時字體大小

/// @param button_string1 鼠標沒選中按鈕時顯示的文本

/// @param button_string2 鼠標選中按鈕時顯示的文本

/// @param click_1 按鈕點擊特效參數(shù): 1.啟動 0.不啟動

/// @return 返回一個判斷按鈕是否點擊的參數(shù):被點擊返回 1 沒有被點擊返回 0


int button(int x1, int y1, int x2, int y2, int mouse_x, int mouse_y, int textsize1, int textsize2, TCHAR button_string1[], TCHAR button_string2[], int click_1)

{

?button_textzise(textsize1); // 設(shè)置字體大小函數(shù)。


?setlinestyle(PS_NULL);

?setlinecolor(RGB(button_rgb2[0][0], button_rgb2[1][0], button_rgb2[2][0])); // 設(shè)置按鈕顏色的外框線體函數(shù)。

?settextcolor(WHITE); // 設(shè)置按鈕白色的字體函數(shù)。

?setfillcolor(RGB(button_rgb1[0][0], button_rgb1[1][0], button_rgb1[2][0])); // 使用修改顏色的 RGB 數(shù)組,可改變數(shù)組從而來自由改變顏色。


?fillroundrect(x1, y1, x2, y2, 20, 20); // 畫按鈕矩形,有圓角 20,對接按鈕的前四個坐標數(shù)組。

? ? ? ? ? ? ? ? ? ? ? ?// 設(shè)置居中顯示按鈕的文字。

?outtextxy((((x2 - x1) / 2) + x1) - (textwidth(button_string1) / 2), (((y2 - y1) / 2) + y1) - (textheight(button_string1) / 2), button_string1);

?// 特制按鈕,字體居中算法,不知是否比自帶的效率高?但失去了一些強大的功能。


?if (mouse_x > x1 && mouse_y > y1 && mouse_x < x2 && mouse_y < y2) // 判斷鼠標是否在按鈕內(nèi)部,如果是就執(zhí)行高亮按鈕代碼。

?{

? setlinestyle(PS_ENDCAP_FLAT);


? button_textzise(textsize2); // 設(shè)置選中的按鈕字體大小,產(chǎn)生選中字體的視覺差。


? setlinecolor(RGB(button_rgb1[0][0], button_rgb1[1][0], button_rgb1[2][0])); // 選中按鈕后把線條變顏色。

? settextcolor(WHITE); // 選中按鈕后,把文字變成白色。

? setfillcolor(RGB(button_rgb2[0][0], button_rgb2[1][0], button_rgb2[2][0])); // 使用修改顏色的 RGB 數(shù)組,可改變數(shù)組從而來自由改變顏色。

? setbkmode(TRANSPARENT); // 把文字背景設(shè)置成透明的。


? fillroundrect(x1, y1, x2, y2, 20, 20); // 填充的矩形,畫選中的,按鈕的意思。


? outtextxy((((x2 - x1) / 2) + x1) - (textwidth(button_string2) / 2), (((y2 - y1) / 2) + y1) - (textheight(button_string2) / 2), button_string2);

? // 特制按鈕,字體居中算法:按鈕長度減按鈕起點除一半得沒有起點的一半,再加上起點得按鈕寬度中心點減字符串寬度的一半得居左右中字體

? if (click_1 == 1) // 如果點擊等于 1 就啟動點擊按鈕特效。

? {

? ?settextcolor(WHITE); // 選中按鈕后,把文字變成白色。

? ?button_textzise(textsize2 - 3);

? ?fillroundrect(x1, y1, x2, y2, 20, 20); // 填充的矩形,畫選中的,按鈕的意思。

? ? ? ? ? ? ? ? ? ? ? ?// 在填充的矩形顯示居中的高亮放大的文字。

? ?outtextxy((((x2 - x1) / 2) + x1) - (textwidth(button_string2) / 2), (((y2 - y1) / 2) + y1) - (textheight(button_string2) / 2), button_string2);

? ?// 特制按鈕,字體居中算法:按鈕高度減按鈕高度起點除一半得沒有高度起點的一半,再加上起點得按鈕高度中心點減字符串疝度的一半得上下居中字體

? ?Sleep(100); // 顯示按鈕被點擊的效果。

? ?settextcolor(WHITE); // 選中按鈕后,把文字變成藍色。

? ?button_textzise(textsize2);

? ?fillroundrect(x1, y1, x2, y2, 20, 20); // 填充的矩形,畫選中的,按鈕的意思。

? ? ? ? ? ? ? ? ? ? ? ?// 在填充的矩形顯示居中的高亮放大的文字。

? ?outtextxy((((x2 - x1) / 2) + x1) - (textwidth(button_string2) / 2), (((y2 - y1) / 2) + y1) - (textheight(button_string2) / 2), button_string2);

? }


? return 1; // 返回 1 說明,鼠標點到了該按鈕,可以通過 if 函數(shù)來判斷返回值 1 要干什么。

?}

?return 0; // 如果按鈕沒有被鼠標選中就返回 0。

}


/// @brief buttonparm 按鈕傳輸參數(shù)函數(shù)

/// @param mouse_x 傳入鼠標 x 坐標

/// @param mouse_y 傳入鼠標 y 坐標

/// @param click 選擇功能參數(shù):1.啟用鼠標點擊功能 33.單純的按鈕功能

/// @param click_1 按鈕點擊特效參數(shù): 1.啟動 0.不啟動

/// @return 可以通過 if 來返回其他參數(shù)來幫助程序退出

int buttonparm(int mouse_x, int mouse_y, int click, int click_1)

{


?FlushBatchDraw(); // 批量繪圖的開始處。

?for (int i = 0; i < button_quantity + 1; i++)

?{

? // 這個是打印讀取了配置文件里的按鈕數(shù)據(jù)數(shù)組,并通過 按鈕功能函數(shù) button_function 判斷按鈕點擊后對應(yīng)設(shè)置的功能。

? if (button(button_int[i][0], button_int[i][1], button_int[i][2], button_int[i][3], mouse_x, mouse_y, button_int[i][4], button_int[i][5], button_stringchar[i][0], button_stringchar[i][1], click_1) == click)

? {

? ?if (button_function(i) == 1)return 1; // 返回 1 代表退出,按鈕點擊功能函數(shù) button_function 傳入相對應(yīng)的按鈕序號來判斷按鈕點擊后對應(yīng)設(shè)置的功能。

? }

?}

?EndBatchDraw(); // 批量繪圖的結(jié)束處。

?return 0;

}


/// @brief X_Y 顯示鼠標移動的坐標函數(shù)

/// @param zise 設(shè)定顯示鼠標 x, y 坐標數(shù)值

/// @param mouse_x 傳入鼠標 x 坐標

/// @param mouse_y 傳入鼠標 y 坐標

/// @return 0

int X_Y(int zise, long mouse_x, long mouse_y)

{

?TCHAR xx[40] = { 0 }, yy[40] = { 0 }; // 存儲 Y, X 的坐標。


?FlushBatchDraw();


?button_textzise(zise);

?settextcolor(MAGENTA);

?outtextxy(width - 244, high - 65, _T("當前鼠標 X_Y 坐標->"));


?setfillcolor(WHITE); // 為消除顯示 X, Y 的值,準備的白色的矩形填充。

?fillroundrect(width - 110, high - 65, width - 5 - 2, high - 45 - 2, 0, 0); // 為消除顯示 X, Y 的值,準備的白色的矩形填充。


?swprintf(xx, 40, _T("X:%d-"), mouse_x);

?swprintf(yy, 40, _T("-Y:%d"), mouse_y);


?settextcolor(GREEN);

?outtextxy(width - 110, high - 65, xx);


?settextcolor(RED);

?outtextxy(width - 70, high - 65, yy); // 顯示 X 的坐標,前一函數(shù)設(shè)置字體紅色,并設(shè)置字體大小。


?FlushBatchDraw();

?return 0;

}

// GUI 圖形界面的初始化。

void lnitial_drawing()

{


?initgraph(width, high); // 軟件界面的大小定義。


?HWND hWnd = GetHWnd(); // 獲得窗口句柄。

?SetWindowText(hWnd, _T("GUI 按鈕實例")); // 使用 Windows API 修改窗口名稱。


?// setlinestyle(PS_ENDCAP_FLAT);


?setbkcolor(WHITE); // 設(shè)置背景為白色。

?cleardevice(); // 刷新白色背景的清屏函數(shù)。


?setfillcolor(BLUE);

?fillroundrect(0, 0, width - 1, high - 1, 20, 20); // 上邊是設(shè)置藍色鎮(zhèn)充,并畫鉅形為 20 大小的函數(shù)。


?setfillcolor(WHITE);

?fillroundrect(width - (width - 5), width - (width - 5), width - 5, high - 5, 20, 20); // 是設(shè)置白色鎮(zhèn)充,并畫鉅形為 20 大小的函數(shù),設(shè)置白色鎮(zhèn)充的函數(shù)。



?X_Y(15, NULL, NULL);

?buttonparm(NULL, NULL, 33, NULL); // 調(diào)用按鈕基本繪制函數(shù),如沒有這個,鼠標沒有移動到軟件里,那么按鈕全都是一片空白。


?settextcolor(RED); // 設(shè)置傳入坐標 0 即不啟動點擊功能,也不啟動啟動點擊判斷高亮功能,就是顯示所以顯示在軟件內(nèi),而且也只執(zhí)行一次。

?button_textzise(15);

?outtextxy(width - 244, high - 45, _T("EasyX 繪圖庫硬核實現(xiàn) GUI 按鈕 "));

?outtextxy(width - 244, high - 25, _T("鼠標點擊功能-工具箱-參考小程序"));

?button_textzise(5);


}


// 主函數(shù),目的第二個參數(shù)藏有本程序運行的當前路徑。

int main()

{

?// 調(diào)用設(shè)置按鈕函數(shù)和讀取配置文件里定義的按鈕函數(shù)。

?setgetbuttonini();

?// 初始化函數(shù)用于繪制底界面,及設(shè)置程序標題。

?lnitial_drawing();

?// 聲明鼠標類型的變量。


?ExMessage mouse;

?// 嵌入式死循環(huán)。

?while (true)

?{

? mouse = getmessage(EM_MOUSE | EM_KEY);


? // 獲取鼠標消息,然后判斷鼠標移動中遇到的事,調(diào)用 buttonparm 按鈕綜合函數(shù)。

? // 參數(shù) 33 代表不開啟鼠標點擊功能,只創(chuàng)建和繪制按鈕加,鼠標移動到按鈕坐標上邊會有高亮按鈕。

? // 最后一個參數(shù)是決定在鼠標點擊時候按鈕特效,關(guān)閉參數(shù)是 0。

? if (mouse.message == WM_MOUSEMOVE)

? {

? ?buttonparm(mouse.x, mouse.y, 33, 0);


? ?X_Y(15, mouse.x, mouse.y);

? }


? if (mouse.message == WM_LBUTTONDOWN)

? {

? ?mciSendString(_T("open \"C:\\Windows\\media\\Windows Navigation Start.wav\""), NULL, NULL, NULL); // 打開按鈕音效的音樂文件。

? ?mciSendString(_T("play \"C:\\Windows\\media\\Windows Navigation Start.wav\""), NULL, NULL, NULL); // 播放按鈕音效的音樂。


? ?if (buttonparm(mouse.x, mouse.y, 1, 1) == 1)break;

? ?mciSendString(_T("close \"C:\\Windows\\media\\Windows Navigation Start.wav\""), NULL, NULL, NULL); // 關(guān)閉按鈕音效的音樂。

? ?flushmessage(EM_MOUSE);

? }

? // 獲取鼠標消息,然后判斷鼠標在點擊中遇到的事,調(diào)用 buttonparm 按鈕綜合函數(shù)。

? // 參數(shù) 1 代表不開啟鼠標移動到按鈕上的高亮,如果鼠標點擊到按鈕上,那么 buttonparm 函數(shù)會判斷發(fā)生的事情。

? // 最后一個參數(shù)是決定在鼠標點擊時候按鈕特效,啟動參數(shù)是 1。

? // 非常靈活的返回值,自由設(shè)定返回值,返回功能,這里返回 1 我就結(jié)束主循環(huán)退出程序。任意設(shè)定。

?}


?// 關(guān)閉繪圖庫。

?closegraph();

?// 退出程序并返回零。

?return 0;

}

EasyX 繪圖庫硬核實現(xiàn)基于配置文件動態(tài)創(chuàng)建的評論 (共 條)

分享到微博請遵守國家法律
峡江县| 卫辉市| 东光县| 息烽县| 江达县| 攀枝花市| 儋州市| 洪雅县| 贵溪市| 应用必备| 绥江县| 永定县| 东丽区| 元谋县| 高唐县| 霸州市| 德阳市| 肇东市| 尖扎县| 随州市| 望都县| 梅州市| 手机| 内黄县| 板桥市| 平果县| 沽源县| 新乡县| 沁水县| 驻马店市| 德令哈市| 闽侯县| 岑溪市| 房产| 含山县| 永善县| 宁远县| 镇康县| 宜州市| 金阳县| 永登县|