自学EasyX(一):检测鼠标位置和行为

一、声明:源代码改编自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恢复。再次运行后可以得到标题不再是乱码,且文档可以正常查看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JohnWan2Dunk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值