当 getmessage 函数同时获取 EM_MOUSE | EM_CHAR 两个类型的消息时为什么,字符类的消息存不进数组内?
如果改成 mouse1 = getmessage(EM_CHAR); 加 if (mouse1.message == WM_CHAR) STRING1[i] = mouse1.ch;
就非常有效的存进数组内,但同时也失去了 EM_MOUSE 类的消息功能。
所以是啥机制的问题?函数功能或语法上的错误吗?
如果 声明两个 ExMessage 类的来分别实现就更不好搞了,好像是会相互冲突。
下面是 部分示例
ExMessage mouse1;
mouse1 = getmessage(EM_MOUSE | EM_CHAR);
if (mouse1.message == WM_CHAR) STRING1[i] = mouse1.ch;
if (mouse1.message == WM_LBUTTONDOWN)
{
if (mouse1.x > x1 && mouse1.y > y1 && mouse1.y < x2 && mouse1.y < y2)
{
continue;
}
else
{
if (mouse1.x < x1 || mouse1.y < y1 || mouse1.y > x2 || mouse1.y > y2)
{
setlinecolor(WHITE);
line(ad, y1 + ((y2 - y1) - textheight(STRING[0])) / 2, ad, y2 - ((y2 - y1) - textheight(STRING[0])) / 2);
break;
}
}
}
下面是完整示例
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
* 本程序名称:EasyX 绘图库硬核实现 GUI 简单输入框程序实例教程。
* 编译环镜:Microsoft Visual Studio Community 2019
* 绘图库:EasyX_20211109
* 电脑系统:Win10 1809
* 作者:奈叶敬 2963787923@qq.com
* 程序起始时间:2021 - 7 - 10
* 程序最后结束修改时间:2022 - 3 - 9 0:19
*
* 更新内容:
* 1.新增鼠标位置显示。
* 2.新增输入框点击特效。
* 3.新增输入框点击声效。
* 4.新改输入框界面并美化。
* 5.新增输入框颜色修改函数,自由修改颜色,本次预设输入框颜色有,稚红输入框,紫爱输入框,紫白输入框,原色输入框,轻绿输入框,粉紫输入框,青暗输入框,红亮输入框。
* 6.2022 年 3 月 9 日内容大改造,基于配置文件动态生成输入框。
* 目的:使用输入框封闭函数自由方便的批量创建输入框,实现用 EasyX 绘图库做一个简单的鼠标输入框操作,给需要编写 GUI 程序的小伙伴们一个硬核参考,之后如果可以编写一套完整的 GUI 控件。
* 历史:本程序源码历史能运行的,最长源码 300 行,历史最长最短源码 67 行,历史最长折中源码 80 多行,换过无数种思路。
* 编译调试建议:无。
*
* 代码函数定义位置顺序排列如下:
* settextboxini -> gettextboxini - > setgettextboxini - > settextboxcolor - > textbox_textzise - >
* textbox_function -> textbox -> textboxparm - > X_Y - > lnitial_drawing
*
*/
#include <graphics.h> // 绘图库头文件。
#include <conio.h> // 函数 _getch 的所在库。
#include <windows.h> // 系统库。
#include <stdio.h> // 标准库。
#include <string.h> // 字集处理库。
#include <ShlObj.h> // 获取桌面壁纸的函数的头文件。
#include<mmsystem.h> // 音乐播放 API 函数所在库。
#include < assert.h >
#pragma comment(lib, "winmm.lib") // 音乐播放相关。
#define width 800 // 程序宽。
#define high 800 // 程序高。
// 程序函数目录,10 个核心函数构成本程序。
// 定义设置原始输入框位置,字符串,字体大小,的配置文件,并导出成模版函数,内容由读取配置文件函数读取,并打开程序只执行一次。
void settextboxini(TCHAR textboxstring[], TCHAR x1[], TCHAR y1[], TCHAR x2[], TCHAR y2[], TCHAR textsize1[]);
// 定义加载读取配置文件里定义的输入框函数。
void gettextboxini();
// 定义调用设置输入框函数和读取配置文件里定义的输入框函数。
void setgettextboxini();
// 定义输入框颜色修改函数。
void settextboxcolor(int textbox_r1, int textbox_g1, int textbox_b1, int textbox_r2, int textbox_g2, int textbox_b2);
// 修改输入框字体大小函数。
void textbox_textzise(int zise);
// 定义输入框点击功能函数 textbox_function 传入相对应的输入框序号来判断输入框点击后对应设置的功能。
int textbox_function(int i);
// 定义输入框创建函数。
void textbox(int x1, int y1, int x2, int y2, int mouse_x, int mouse_y, int textsize1, int textsize2, TCHAR textbox_string1[], TCHAR textbox_string2[], int click_1);
// 定义输入框传输参数函数。
int textboxparm(int mouse_x, int mouse_y, int click, int click_1);
// 定义显示鼠标移动的坐标函数。
int X_Y(int zise, long mouse_x, long mouse_y);
// 定义 GUI 图形界面的初始化。
void lnitial_drawing();
int textbox_rgb1[3][1] = { 19, 113, 171 }; // 声明颜色 RGB 变量,可以修改这个改变输入框前景或者背景颜色,并可以初始化颜色。
int textbox_rgb2[3][1] = { 201, 222, 245 }; // 声明颜色 RGB 变量,可以修改这个改变输入框前景或者背景颜色,并可以初始化颜色。
int textbox_quantity = 0; // 决定读取配置文件里的输入框数量的值,用于打印输入框。
int textbox_int[100][7] = { 0 }; // 由读取配置函数,存放配置文件里的各各输入框坐标位置,字体大小,并用于输入框函数打印出内容的整形数组。
TCHAR textbox_stringchar[100][4][500] = { 0 }; // 由读取配置函数,存放配置文件里的各各输入框字符串,并用于输入框函数打印出内容字符型数组。
TCHAR textbox_string[256][9][100] = // 三维数组的巧妙应用于,鼠标移动到输入框位置发生不一样选择,原始按的钮坐标,输入框文本,字体大小数据用于生成模版配置文件。
{
{_T("10"), _T("555 "), _T("65"), _T("588"), _T("16")},
{_T("68"), _T("555 "), _T("122"), _T("588"), _T("16")},
{_T("125"), _T("555 "), _T("179"), _T("588"), _T("16")},
{_T("182"), _T("555"), _T("238"), _T("588"), _T("16")},
{_T("10"), _T("509"), _T("65"), _T("544"), _T("13")},
{_T("68"), _T("509"), _T("122"), _T("544"), _T("13")},
{_T("125"), _T("509"), _T("179"), _T("544"), _T("13")},
{_T("182"), _T("509"), _T("238"), _T("544"),_T("13"),},
{_T("10"), _T("13"), _T("240"), _T("50"), _T("16")},
{_T("10"), _T("58"), _T("240"), _T("98"), _T("16")},
{_T("10"), _T("103"), _T("240"), _T("143"), _T("16")},
{_T("10"), _T("148"), _T("240"), _T("188"), _T("16")},
{_T("10"), _T("193"), _T("240"), _T("233"), _T("16")},
{_T("10"), _T("238"), _T("240"), _T("278"), _T("16")},
{_T("10"), _T("283"), _T("240"), _T("323"), _T("16")},
{_T("10"), _T("328"), _T("240"), _T("368"), _T("16")},
{_T("10"), _T("373"), _T("240"), _T("413"), _T("16")},
{_T("10"), _T("418"), _T("240"), _T("458"), _T("16")},
{_T("10"), _T("464"), _T("74"), _T("499"), _T("16")},
{_T("79"), _T("464"), _T("145"), _T("499"), _T("16")},
{_T("149"), _T("464"), _T("240"), _T("499"), _T("16")},
{_T("10"), _T("598"), _T("240"), _T("638"), _T("16")},
};
/// @brief 设置原始输入框位置,字符串,字体大小,的配置文件,并导出成模版函数,内容由读取配置文件函数读取,并打开程序只执行一次。
/// @param textboxstring 输入框名称。
/// @param x1 输入框左上角 X 坐标
/// @param y1 输入框左上角 Y 坐标
/// @param x2 输入框右下角 X 坐标
/// @param y2 输入框右下角 y 坐标
/// @param textboxstr1 输入框没选中时的文本大小
/// @param textboxstr2 输入框没被选中里的文本
/// @param textsize1 输入框被选中里的文本
/// @param textsize2 输入框被选中里的文本
void settextboxini(TCHAR textboxstring[], TCHAR x1[], TCHAR y1[], TCHAR x2[], TCHAR y2[], TCHAR textsize1[])
{
WritePrivateProfileString(textboxstring, _T("框左上 X "), x1, _T(".\\textboxtese.ini"));
WritePrivateProfileString(textboxstring, _T("框左上 Y "), y1, _T(".\\textboxtese.ini"));
WritePrivateProfileString(textboxstring, _T("框右下 X "), x2, _T(".\\textboxtese.ini"));
WritePrivateProfileString(textboxstring, _T("框右下 y "), y2, _T(".\\textboxtese.ini"));
WritePrivateProfileString(textboxstring, _T("框文本大小"), textsize1, _T(".\\textboxtese.ini"));
//WritePrivateProfileString(textboxstring, _T("输入框被选中时的文本大小"), textsize2, _T(".\\textboxtese.ini"));
//WritePrivateProfileString(textboxstring, _T("输入框没被选中里的文本"), textboxstr1, _T(".\\textboxtese.ini"));
//WritePrivateProfileString(textboxstring, _T("输入框被选中里的文本"), textboxstr2, _T(".\\textboxtese.ini"));
}
// 加载读取配置文件里定义的输入框函数。
void gettextboxini()
{
TCHAR textbox_quantity1[155] = { 0 }; // 用于读取输入框的字节暂存值。
for (int i = 0; ; i++)
{
swprintf(textbox_quantity1, 30, _T("%d"), i); // 转化 i 整形成字符型,用于读取函数。
textbox_int[i][0] = GetPrivateProfileInt(textbox_quantity1, _T("框左上 X "), 0, _T(".\\textboxtese.ini"));
textbox_int[i][1] = GetPrivateProfileInt(textbox_quantity1, _T("框左上 Y "), 0, _T(".\\textboxtese.ini"));
textbox_int[i][2] = GetPrivateProfileInt(textbox_quantity1, _T("框右下 X "), 0, _T(".\\textboxtese.ini"));
textbox_int[i][3] = GetPrivateProfileInt(textbox_quantity1, _T("框右下 y "), 0, _T(".\\textboxtese.ini"));
textbox_int[i][4] = GetPrivateProfileInt(textbox_quantity1, _T("框文本大小"), 15, _T(".\\textboxtese.ini"));
// textbox_int[i][5] = GetPrivateProfileInt(textbox_quantity1, _T("输入框被选中时的文本大小"), 5, _T(".\\textboxtese.ini"));
// GetPrivateProfileString(textbox_quantity1, _T("输入框没被选中里的文本"), _T(""), textbox_stringchar[i][0], 155, _T(".\\textboxtese.ini"));
// GetPrivateProfileString(textbox_quantity1, _T("输入框被选中里的文本"), _T(""), textbox_stringchar[i][1], 155, _T(".\\textboxtese.ini"));
textbox_quantity++; // 记录读取多少个输入框的数量,用于后续输入框打印。
if (textbox_int[i][0] == 0) { break; }; // 听我说如果读取到,输入框的末尾或者没有输入框读取了就断开这个加载配置文件函数。
}
}
// 定义调用设置输入框函数和读取配置文件里定义的输入框函数。
void setgettextboxini()
{
int teru1 = 1; // 真假断定,用于让初始化配置函数只执行一次,如果配置文件被册就再调用生成配置文件模版,1 执行,0 不执行。
TCHAR textbox_quantity1[225] = { 0 }; // 生成配置文件里的输入框数量的暂存值,把 for 循环 i 值,转化成输入框字符。
teru1 = GetPrivateProfileInt(_T("true"), _T("只生成一次"), 1, _T(".\\textboxtese.ini"));
if (teru1 == 1)
{
WritePrivateProfileString(_T("true"), _T("只生成一次"), _T("0"), _T(".\\textboxtese.ini"));
for (int i = 0; i < 22; i++)
{
swprintf(textbox_quantity1, 30, _T("%d"), i);
settextboxini(textbox_quantity1, textbox_string[i][0], textbox_string[i][1], textbox_string[i][2], textbox_string[i][3], textbox_string[i][4]);
}
}
gettextboxini();
}
/// @brief settextboxcolor 输入框颜色修改函数
/// @param textbox_r1 输入框背景色 r 色值
/// @param textbox_g1 输入框背景色 g 色值
/// @param textbox_b1 输入框背景色 b 色值
/// @param textbox_r2 输入框被选中的高亮色 r 色值
/// @param textbox_g2 输入框被选中的高亮色 g 色值
/// @param textbox_b2 输入框被选中的高亮色 b 色值
void settextboxcolor(int textbox_r1, int textbox_g1, int textbox_b1, int textbox_r2, int textbox_g2, int textbox_b2)
{
textbox_rgb1[0][0] = textbox_r1;
textbox_rgb1[1][0] = textbox_g1;
textbox_rgb1[2][0] = textbox_b1;
textbox_rgb2[0][0] = textbox_r2;
textbox_rgb2[1][0] = textbox_g2;
textbox_rgb2[2][0] = textbox_b2;
}
/// @brief textbox_textzise 修改输入框字体大小函数
/// @param zise 字体大小数值
void textbox_textzise(int zise)
{
LOGFONT f;
gettextstyle(&f); // 获取当前字体设置。
f.lfHeight = zise; // 设置字体高度为 48。
_tcscpy_s(f.lfFaceName, _T("宋体"));
f.lfQuality = ANTIALIASED_QUALITY; // 设置输出效果为抗锯齿。
settextstyle(&f);
setbkmode(TRANSPARENT); // 设置透明的背景。
}
/// @brief textbox 输入框创建函数
/// @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 textbox_string1 鼠标没选中输入框时显示的文本
/// @param textbox_string2 鼠标选中输入框时显示的文本
/// @param click_1 输入框点击特效参数: 1.启动 0.不启动
/// @return 返回一个判断输入框是否点击的参数:被点击返回 1 没有被点击返回 0
void textbox(TCHAR* STRING1, int x1, int y1, int x2, int y2, int mouse_x, int mouse_y, int textsize1, int click_1)
{
// 选中输入框后,把文字变成白色。
//setfillcolor(RGB(165, 206, 247)); // 使用修改颜色的 RGB 数组,可改变数组从而来自由改变颜色。
//setfillcolor(RGB(63, 63, 70));
//solidroundrect (x1, y1, x2, y2, 20, 20); // 画输入框矩形,有圆角 20,对接输入框的前四个坐标数组。
setfillcolor(WHITE);
solidroundrect(x1, y1, x2, y2, 0, 0);
setlinecolor(BLACK); line(x1 - 1, y1 - 1, x1 - 1, y2 + 1);
setlinecolor(BLACK); line(x1 - 1, y1 - 1, x2 + 1, y1 - 1);
setlinecolor(BLACK); line(x1 - 2, y1 - 2, x1 - 2, y2 + 2);
setlinecolor(BLACK); line(x1 - 2, y1 - 2, x2 + 2, y1 - 2);
setlinecolor(RGB(45, 45, 48)); line(x2, y2, x2, y1);
setlinecolor(RGB(45, 45, 48)); line(x2, y2, x1, y2);
setlinecolor(DARKGRAY); line(x2 + 2, y2 + 2, x2 + 2, y1 - 2);
setlinecolor(DARKGRAY); line(x2 + 2, y2 + 2, x1 - 2, y2 + 2);
setlinecolor(DARKGRAY); line(x2 + 1, y2 + 1, x2 + 1, y1 - 1);
setlinecolor(DARKGRAY); line(x2 + 1, y2 + 1, x1 - 1, y2 + 1);
// 如果输入框没有被鼠标选中就返回 0。
}
TCHAR* textbox1(TCHAR* STRING1, int x1, int y1, int x2, int y2, int mouse_x, int mouse_y, int textsize1, int click_1)
{
ExMessage mouse1;
//ExMessage mouse2;
size_t ad1 = 0;
ad1 = wcslen(STRING1);
bool binput = true;
TCHAR STRING[255] = { '0' };
TCHAR* STRINGp = STRING;
//TCHAR* STRINGp1 = STRING1;
// TCHAR* STRING1 = STRING2;
if (STRING1 == NULL) { return NULL; };
// if (STRING2 == NULL) { return NULL; };
if (STRINGp == NULL) { return NULL; };
textbox_textzise(textsize1); // 设置字体大小函数。
setlinecolor(BLACK); // 选中输入框后把线条变颜色。
settextcolor(BLACK); // 选中输入框后,把文字变成白色。
//setfillcolor(RGB(165, 206, 247)); // 使用修改颜色的 RGB 数组,可改变数组从而来自由改变颜色。
if (mouse_x > x1 && mouse_y > y1 && mouse_x < x2 && mouse_y < y2) // 判断鼠标是否在输入框内部,如果是就执行高亮输入框代码。
{
TCHAR DD[100] = { 0 };
int ad = x1 + 5;
int ab = (((x2 - x1) - 5) / (textwidth(STRING[0])));
int x = 1;
textbox_textzise(textsize1); // 设置选中的输入框字体大小,产生选中字体的视觉差。
setlinecolor(RGB(textbox_rgb1[0][0], textbox_rgb1[1][0], textbox_rgb1[2][0])); // 选中输入框后把线条变颜色。
settextcolor(BLACK); // 选中输入框后,把文字变成白色。
setbkmode(TRANSPARENT); // 把文字背景设置成透明的。
if (click_1 == 1) // 如果点击等于 1 就启动点击输入框特效。
{
if (ad1 != 0)
{
// width - 350, high - 100
setfillcolor(RGB(63, 63, 70));
// solidroundrect(x1, y1, x2, y2, 0, 0);
solidroundrect(width - 350, high - 100, width - 350 + 300, high - 100 + 20, 0, 0);
for (int i = 0; i < ad1; i++)
{
for (int i = 0; i < textbox_quantity; i++)
{
setfillcolor(RGB(63, 63, 70));
// solidroundrect(x1, y1, x2, y2, 0, 0);
solidroundrect(width - 350, high - 100, width - 350 + 300, high - 100 + 20, 0, 0);
// 这个是打印读取了配置文件里的输入框数据数组,并通过 输入框功能函数 textbox_function 判断输入框点击后对应设置的功能。
// textbox_textzise(15);
// settextcolor(WHITE);
// textbox_stringchar[i][0][0] = '\0';
setfillcolor(WHITE);
solidroundrect(textbox_int[i][0] + 350, textbox_int[i][1], textbox_int[i][2] + 350, textbox_int[i][3], 0, 0);
}
setlinecolor(BLACK);
if (STRING1[i] != '\r' && STRING1[i] != '\b')line(ad + textwidth(STRING[0]) - textwidth(STRING[0]), y1 + ((y2 - y1) - textheight(STRING[0])) / 2, ad + textwidth(STRING[0]) - textwidth(STRING[0]), y2 - ((y2 - y1) - textheight(STRING[0])) / 2);
setlinecolor(WHITE);
if (STRING1[i] != '\r' && STRING1[i] != '\b')line(ad, y1 + ((y2 - y1) - textheight(STRING[0])) / 2, ad, y2 - ((y2 - y1) - textheight(STRING[0])) / 2);
if (STRING1[i] == 13)
{
setlinecolor(BLACK);
line(ad, y1 + ((y2 - y1) - textheight(STRING[0])) / 2, ad, y2 - ((y2 - y1) - textheight(STRING[0])) / 2);
break;
}
if (ad >= x2 - (textwidth(STRING[0]) * 2))continue;
settextcolor(BLACK);
if (STRING1[i] != '\r' && STRING1[i] != '\b')outtextxy(ad, (((y2 - y1) / 2) + y1) - (textheight(STRING[0]) / 2), STRING1[i]);
if (STRING1[i] != '\r' && STRING1[i] != '\b')ad = ad + textwidth(STRING[0]) + 1;
}
}
settextcolor(BLACK); // 选中输入框后,把文字变成白色。
setlinecolor(RGB(165, 206, 247)); // 选中输入框后把线条变颜色。
settextcolor(BLACK); // 选中输入框后,把文字变成白色。
if (ad1 == 0)ad1 = ad1 + 1;
//
// for (size_t i = ad1 - 1; i != -1 && binput; i++)
while(binput)for (size_t i = ad1 - 1; binput&& i != -1; i++)
{
// peekmessage(&mouse2, EM_MOUSE | EM_CHAR, false); // 获取消息,但不从消息队列拿出
// else if (mouse2.message == WM_CHAR)
// else if (mouse2.message == WM_CHAR)
{
if (ad > (x1 + 5))if (STRING1[i - 1] == 8)
{
if (ad != 0)
{
setlinecolor(BLACK);
line(ad - textwidth(STRING[0]) - 1, y1 + ((y2 - y1) - textheight(STRING[0])) / 2, ad - textwidth(STRING[0]) - 1, y2 - ((y2 - y1) - textheight(STRING[0])) / 2);
setfillcolor(WHITE);
solidroundrect(ad - textwidth(STRING[0]) - 1, y1 + ((y2 - y1) - textheight(STRING[0])) / 2, ad + textwidth(STRING[0]) - 1, y2 - ((y2 - y1) - textheight(STRING[0])) / 2, 0, 0);
setlinecolor(WHITE);
line(ad, y1 + ((y2 - y1) - textheight(STRING[0])) / 2, ad, y2 - ((y2 - y1) - textheight(STRING[0])) / 2);
STRING1[i - 1] = '\0';
STRING1[i] = '\0';
ad = ad - textwidth(STRING[0]) - 1;
i = i - 2;
}
}
setlinecolor(BLACK);
if (STRING1[i] != '\r' && STRING1[i] != '\b')line(ad + textwidth(STRING[0]) - textwidth(STRING[0]), y1 + ((y2 - y1) - textheight(STRING[0])) / 2, ad + textwidth(STRING[0]) - textwidth(STRING[0]), y2 - ((y2 - y1) - textheight(STRING[0])) / 2);
line(ad + textwidth(STRING[0]) - textwidth(STRING[0]), y1 + ((y2 - y1) - textheight(STRING[0])) / 2, ad + textwidth(STRING[0]) - textwidth(STRING[0]), y2 - ((y2 - y1) - textheight(STRING[0])) / 2);
int aaa = 0;
aaa = textwidth(STRING[0]);
// i < (((x2 - (textwidth(STRING[0]) * 2) - x1) - 5) / textwidth(STRING[0]))
// i < ((x2-x1-5)/ textwidth(STRING[0]))
//if (ad <= x2 - (textwidth(STRING[0]) * 2))
{
// binput
mouse1 = getmessage(EM_MOUSE | EM_CHAR);
// mouse1 = getmessage(EM_CHAR);
if (mouse1.message == WM_CHAR) STRING1[i] = mouse1.ch;
// if (_kbhit()) STRING1[i] = _getch();
// peekmessage(NULL, EM_MOUSE | EM_CHAR);
// peekmessage(NULL, EM_MOUSE | EM_CHAR);
if (mouse1.message == WM_LBUTTONDOWN)
{
// if (mouse_x > x1 && mouse_y > y1 && mouse_x < x2 && mouse_y < y2)
if (mouse1.x > x1 && mouse1.y > y1 && mouse1.y < x2 && mouse1.y < y2)
{
continue;
}
else
{
if (mouse1.x < x1 || mouse1.y < y1 || mouse1.y > x2 || mouse1.y > y2)
{
binput = false;
setlinecolor(WHITE);
line(ad, y1 + ((y2 - y1) - textheight(STRING[0])) / 2, ad, y2 - ((y2 - y1) - textheight(STRING[0])) / 2);
break;
}
}
}
}
// else
{
// mouse1 = getmessage(EM_CHAR);
// STRING1[i] = mouse1.ch;
// setlinecolor(WHITE);
// line(ad, y1 + ((y2 - y1) - textheight(STRING[0])) / 2, ad, y2 - ((y2 - y1) - textheight(STRING[0])) / 2);
// break;
}
if (STRING1[i] == 13)
{
setlinecolor(WHITE);
line(ad, y1 + ((y2 - y1) - textheight(STRING[0])) / 2, ad, y2 - ((y2 - y1) - textheight(STRING[0])) / 2);
break;
}
if (ad >= x2 - (textwidth(STRING[0]) * 2))
{
if (STRING1[i] != 8)STRING1[i] = '\0';
if (STRING1[i] != 8)continue;
}
setlinecolor(WHITE);
if (STRING1[i] != '\r' && STRING1[i] != '\b')line(ad, y1 + ((y2 - y1) - textheight(STRING[0])) / 2, ad, y2 - ((y2 - y1) - textheight(STRING[0])) / 2);
settextcolor(BLACK);
if (STRING1[i] != '\r' && STRING1[i] != '\b')outtextxy(ad, (((y2 - y1) / 2) + y1) - (textheight(STRING[0]) / 2), STRING1[i]);
if (STRING1[i] != '\r' && STRING1[i] != '\b' && STRING1[i] != '\0')ad = ad + textwidth(STRING[0]) + 1;
}
// peekmessage(NULL, EM_MOUSE | EM_CHAR);
}
// while ((*STRING2++ = *STRING1++) != '\0');
}
//return STRING; // 返回 1 说明,鼠标点到了该输入框,可以通过 if 函数来判断返回值 1 要干什么。
}
return NULL; // 如果输入框没有被鼠标选中就返回 0。
}
/// @brief textboxparm 输入框传输参数函数
/// @param mouse_x 传入鼠标 x 坐标
/// @param mouse_y 传入鼠标 y 坐标
/// @param click 选择功能参数:1.启用鼠标点击功能 33.单纯的输入框功能
/// @param click_1 输入框点击特效参数: 1.启动 0.不启动
/// @return 可以通过 if 来返回其他参数来帮助程序退出
int textboxparm(int mouse_x, int mouse_y, int click, int click_1)
{
TCHAR addd[10][500] = { 0 };
int a = 0;
FlushBatchDraw(); // 批量绘图的开始处。
for (int i = 0; i < textbox_quantity + 1; i++)
{
// 这个是打印读取了配置文件里的输入框数据数组,并通过 输入框功能函数 textbox_function 判断输入框点击后对应设置的功能。
textbox1(textbox_stringchar[i][0], textbox_int[i][0], textbox_int[i][1], textbox_int[i][2], textbox_int[i][3], mouse_x, mouse_y, textbox_int[i][4], click_1);
}
EndBatchDraw(); // 批量绘图的结束处。
return 0;
}
/// @brief X_Y 显示鼠标移动的坐标函数
/// @param zise 设定显示鼠标 x, y 坐标数值
/// @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();
textbox_textzise(zise);
settextcolor(MAGENTA);
outtextxy(width - 244, high - 65, _T("当前鼠标 X_Y 坐标->"));
setfillcolor(WHITE); // 为消除显示 X, Y 的值,准备的白色的矩形填充。
solidroundrect(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 的坐标,前一函数设置字体红色,并设置字体大小。
FlushBatchDraw();
return 0;
}
// GUI 图形界面的初始化。
void lnitial_drawing()
{
initgraph(width, high); // 软件界面的大小定义。
HWND hWnd = GetHWnd(); // 获得窗口句柄。
SetWindowText(hWnd, _T("GUI 输入框实例")); // 使用 Windows API 修改窗口名称。
setbkcolor(WHITE); // 设置背景为白色。
cleardevice(); // 刷新白色背景的清屏函数。
setfillcolor(BLUE);
solidroundrect(0, 0, width - 1, high - 1, 20, 20); // 上边是设置蓝色镇充,并画钜形为 20 大小的函数。
//setfillcolor(WHITE);
setfillcolor(RGB(45, 45, 48));
//setfillcolor(RED);
solidroundrect(width - (width - 5), width - (width - 5), width - 5, high - 5, 20, 20); // 是设置白色镇充,并画钜形为 20 大小的函数,设置白色镇充的函数。
X_Y(15, NULL, NULL);
textboxparm(NULL, NULL, 33, NULL); // 调用输入框基本绘制函数,如没有这个,鼠标没有移动到软件里,那么输入框全都是一片空白。
settextcolor(RED); // 设置传入坐标 0 即不启动点击功能,也不启动启动点击判断高亮功能,就是显示所以显示在软件内,而且也只执行一次。
textbox_textzise(15);
outtextxy(width - 244, high - 80, _T("若一片空白请以管理员身份运行!"));
outtextxy(width - 244, high - 45, _T("EasyX 绘图库硬核实现 GUI 输入框 "));
outtextxy(width - 244, high - 25, _T("鼠标点击功能-工具箱-参考小程序"));
textbox_textzise(5);
}
// 主函数,目的第二个参数藏有本程序运行的当前路径。
int main()
{
// 调用设置输入框函数和读取配置文件里定义的输入框函数。
setgettextboxini();
// 初始化函数用于绘制底界面,及设置程序标题。
lnitial_drawing();
// 声明鼠标类型的变量。
TCHAR ADDW[] = { 0 };
ExMessage mouse;
// 嵌入式死循环。
textboxparm(NULL, NULL, 33, NULL);
textbox(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
FlushBatchDraw(); // 批量绘图的开始处。
for (int i = 0; i < textbox_quantity + 1; i++)
{
// 这个是打印读取了配置文件里的输入框数据数组,并通过 输入框功能函数 textbox_function 判断输入框点击后对应设置的功能。
textbox(textbox_stringchar[i][0], textbox_int[i][0], textbox_int[i][1], textbox_int[i][2], textbox_int[i][3], NULL, NULL, textbox_int[i][4], 0);
}
while (true)
{
mouse = getmessage(EM_MOUSE | EM_KEY);
// 获取鼠标消息,然后判断鼠标移动中遇到的事,调用 textboxparm 输入框综合函数。
// 参数 33 代表不开启鼠标点击功能,只创建和绘制输入框加,鼠标移动到输入框坐标上边会有高亮输入框。
// 最后一个参数是决定在鼠标点击时候输入框特效,关闭参数是 0。
if (mouse.message == WM_MOUSEMOVE)
{
// textboxparm(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 (textboxparm(mouse.x, mouse.y, 1, 1) == 1)break;
for (int i = 0; i < textbox_quantity; i++)
{
// 这个是打印读取了配置文件里的输入框数据数组,并通过 输入框功能函数 textbox_function 判断输入框点击后对应设置的功能。
textbox_textzise(15);
settextcolor(RED);
outtextxy(textbox_int[i][0] + 350, textbox_int[i][1], textbox_stringchar[i][0]);
}
mciSendString(_T("close \"C:\\Windows\\media\\Windows Navigation Start.wav\""), NULL, NULL, NULL); // 关闭输入框音效的音乐。
flushmessage(EM_MOUSE);
}
// setfillcolor(RGB(63, 63, 70));
// solidroundrect(x1, y1, x2, y2, 0, 0);
// solidroundrect(width - 350, high - 100, width - 350 + 300, high - 100 + 20, 0, 0);
// 获取鼠标消息,然后判断鼠标在点击中遇到的事,调用 textboxparm 输入框综合函数。
// 参数 1 代表不开启鼠标移动到输入框上的高亮,如果鼠标点击到输入框上,那么 textboxparm 函数会判断发生的事情。
// 最后一个参数是决定在鼠标点击时候输入框特效,启动参数是 1。
// 非常灵活的返回值,自由设定返回值,返回功能,这里返回 1 我就结束主循环退出程序。任意设定。
}
// 关闭绘图库。
closegraph();
// 退出程序并返回零。
return 0;
}