当 getmessage函数同时获取EM_MOUSE | EM_CHAR两个类型的消息时为什么,键入字符类的消息通过 mouse1.ch 存不进数组内?

0

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

ava
思奈理

2022-5-11

你的代码太长了,无法直观的看到你描述的问题。 - 慢羊羊 2022-5-15
0

亲测没问题,随意输入字符,鼠标右键退出,打印出输入的 ch

#include <conio.h>
#include <stdio.h>
#include <graphics.h>

int main()
{
	initgraph(600, 400, SHOWCONSOLE);

	TCHAR buf[255] = {'\0'};
	int i = 0;

	while (1)
	{
		ExMessage m = getmessage(EM_MOUSE | EM_CHAR);

		if (m.message == WM_RBUTTONDOWN)
			break;

		if (m.message != WM_MOUSEMOVE)
			buf[i++] = m.ch;
	}

	_tprintf(_T("%s"), buf);

	_getch();
	closegraph();
}
ava
xiongfj ◑◑

2022-5-12

老哥 这样的话 我发现鼠标点击也会被m.h吸收,并且打印出乱码形式,当然其他情况下也甚至鼠标移动也被m.h吸收,并且打印出乱码形式,在关键位置设置WM_CHAR 和EM_CHAR参数 就会出现存不进数组 或者,无任何反应,我的是设 mouse1.message == WM_CHAR  同时排除了鼠标点击 鼠标中键 鼠标移动 等,但是不知道为什么连键盘上的数字也存不进数组你的是设if (m.message != WM_MOUSEMOVE) 就会出现鼠标点击 鼠标中键 鼠标移动 等等被m.h吸收 并输出乱码来这就很难受了回到开关 把ExMessage m = getmessage(EM_MOUSE | EM_CHAR); 设置成 ExMessage m = getmessage(EM_CHAR); 就完完整整不发乱了,但是。。。。这不是我想要的 - 思奈理 2022-5-13
@思奈理 建议你能简化一下你发在顶楼的代码,最好能直观的体现出你描述的问题。目前,我没听懂你的问题。 - 慢羊羊 2022-5-15
@思奈理 老哥,getmessage() 只能区分大类消息,你需要自己去过滤你想要的消息 - xiongfj ◑◑ 昨天 11:18
技术讨论社区