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
相关产品推荐
相关产品推荐

