一、声明:源代码改编自EasyX自带的说明文档中的示例代码《示例程序——鼠标操作》
该文档的下载链接:
EasyX说明文档https://docs.easyx.cn/download/zh-cn/EasyX_Help.zip?i=234wewe232321
如果你看不到该文档内容,可能是因为编码出现了问题,详见第三部分。
二、改编后的程序源码
// 编译环境:Visual C++ 6.0~2022,EasyX_2023大暑版
// https://easyx.cn
//
#include <easyx.h>
#include <graphics.h>
#include <stdio.h>
int main()
{
// 初始化图形窗口
initgraph(640, 480);
// 设置窗口标题
// SetWindowText(GetHWnd(), "鼠标行为检测 - 显示坐标");
SetWindowText(GetHWnd(), TEXT("鼠标行为检测器 - 坐标实时显示"));
ExMessage m; // 定义消息变量
// 启用双缓冲绘图
BeginBatchDraw();
// 定义坐标显示区域
const int coordX = 10;
const int coordY = 10;
const int coordWidth = 100;
const int coordHeight = 20;
while(true)
{
// 只清除坐标显示区域,而不是整个屏幕
clearrectangle(coordX, coordY, coordX + coordWidth, coordY + coordHeight);
// 获取一条鼠标或按键消息
m = getmessage(EX_MOUSE | EX_KEY);
switch(m.message)
{
case WM_MOUSEMOVE:
// 鼠标移动的时候画红色的小点
putpixel(m.x, m.y, RED);
break;
case WM_LBUTTONDOWN:
// 如果点左键的同时按下了 Ctrl 键
if (m.ctrl)
// 画一个大方块
rectangle(m.x - 10, m.y - 10, m.x + 10, m.y + 10);
else
// 画一个小方块
rectangle(m.x - 5, m.y - 5, m.x + 5, m.y + 5);
break;
case WM_KEYDOWN:
if (m.vkcode == VK_ESCAPE)
{
// 关闭图形窗口
EndBatchDraw();
closegraph();
return 0; // 按 ESC 键退出程序
}
}
// 在左上角显示鼠标坐标
char coordText[32];
sprintf(coordText, "X:%d Y:%d", m.x, m.y);
// 设置文本背景为半透明
setbkmode(TRANSPARENT);
// 设置文本颜色
settextcolor(WHITE);
// 输出文本
outtextxy(coordX, coordY, coordText);
// 刷新绘图
FlushBatchDraw();
}
// 关闭图形窗口
EndBatchDraw();
closegraph();
return 0;
}
原版的代码可以是在用红点显示鼠标历史轨迹,左键画小方框,Ctrl+左键画大方框,ESC键退出的功能。
改编后的程序在桌布的左上角会显示鼠标当前位置的坐标,但是因为需要一直更新,所以在代码中加入了“指定区域内clear”的代码,而其余部分不清空。可以看到在指定区域周围点击时,该区域内不留痕,以勾勒出区域外框。
三、可能的问题(编码异常导致的窗口标题乱码)
可以在上图中看到,标题为异常乱码。而我在代码中给标题取的名字是“鼠标行为检测器 - 坐标实时显示”。这是因为VSCode的编码异常:
可以看到在我的VSCode下方的编码为UTF-8,这是导致生成窗口标题为乱码的主要原因。
有一个帖子说可以在“控制面板——时钟和区域——区域——管理——更改系统区域设置”中将Beta版选项勾选,如下图所示,这确实可以解决标题乱码的问题,但是这会导致第一部分提到的帮助文档打开后读不到内容!!!因此,请不要勾选该选项!!!请不要勾选该选项!!!请不要勾选该选项!!!
正确的做法是,点击vscode下方的UTF-8,选择“通过编码重新打开——Simplified Chinese(GB18030)”。
这时,文档中的代码也会变成乱码,但是可以通过Ctrl-Z恢复。再次运行后可以得到标题不再是乱码,且文档可以正常查看。