You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++井字棋项目鼠标点击异常:所有点击均返回-1求助

解决井字棋鼠标点击始终返回-1的问题

我帮你排查出了代码里的几个关键问题,这就是为什么不管点击哪里都返回-1的原因:


1. 核心问题:GetBoard函数没有传递计算好的棋盘区域

你在GetBoard里计算出了居中的棋盘RECT,但没有把这个结果赋值给传入的pRect参数!这就导致GetMousePoint里调用GetBoard后,rc变量还是空的,PtInRect自然判断鼠标不在棋盘内,直接返回-1。

修复后的GetBoard函数:

const int Cell_Size = 100;
BOOL GetBoard(HWND hwnd, RECT *pRect) {
    RECT rc;
    if (GetClientRect(hwnd, &rc)) {
        int width = rc.right - rc.left;
        int height = rc.bottom - rc.top;
        rc.left = (width - Cell_Size * 3) / 2;
        rc.top = (height - Cell_Size * 3) / 2;
        rc.right = rc.left + Cell_Size * 3;
        rc.bottom = rc.top + Cell_Size * 3;
        *pRect = rc; // 关键:把计算好的棋盘区域赋值给输出参数
        return TRUE;
    }
    SetRectEmpty(pRect);
    return FALSE;
}

2. 单元格序号计算错误

你当前的return column + row;只能得到0到4的数值,和你预期的1-9序号不符。正确的计算应该是按行优先的方式,公式为:row * 3 + column + 1(因为row和column都是从0开始计数,加1转为1-based序号)。

修复后的GetMousePoint函数:

int GetMousePoint(HWND hwnd,int x, int y) {
    POINT pt = { x, y };
    RECT rc;
    if (GetBoard(hwnd,&rc )) {
        if (PtInRect(&rc, pt)) {
            int relativeX = x - rc.left;
            int relativeY = y - rc.top;
            int column = relativeX / Cell_Size;
            int row = relativeY / Cell_Size;
            // 转为1-9的序号:行号*3 + 列号 +1
            return row * 3 + column + 1;
        }
    }
    return -1;
}

3. 额外的小问题:WM_GETMINMAXINFO缺少break

你的WM_GETMINMAXINFO case没有加break;,会导致消息处理“贯穿”到后面的WM_PAINT,虽然暂时可能没明显问题,但不符合Windows消息处理的规范,建议补上:

case WM_GETMINMAXINFO: {
    MINMAXINFO * pMinMax = (MINMAXINFO*)lParam ;
    pMinMax->ptMinTrackSize.x = Cell_Size * 5;
    pMinMax->ptMinTrackSize.y = Cell_Size * 5;
    break; // 加上这个break,避免消息处理贯穿
}

把这些修复点应用到你的代码里,点击棋盘内的单元格就会返回1-9的正确序号,点击棋盘外则返回-1,和你预期的一致。

内容的提问来源于stack exchange,提问作者Chiggy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:11:42