确定MouseCursor所在的控制台上的角色

时间:2018-05-17 01:07:03

标签: c++ winapi console mouse

众所周知,控制台缓冲区大小就像2D数组一样。我试图实现on click buttons(绘制按钮而不是子窗口)但我有准确性问题。

由于Console Window可移动且可调整大小,因此我必须相对于Mouse Cursor TopLeft角落采取Console Window位置(我已经找到了一种准确的方法像素)。但现在问题来了。当我试图找出character square Mouse Cursor所在的on click buttons时,它会变为无效(大约3~5像素的误差),这在实施GetCurrentConsoleFont()时就会出现问题。

这些是我使用的功能。另请注意,我们之前需要声明/** This returns the cursor position relative to any window (not just the console).*/ POINT GetCursPosRelWin(HWND hWindow) { POINT rCoord; RECT windowCoord; HWND hConsole = GetConsoleWindow(); GetWindowRect(hConsole,&windowCoord); POINT ptCursor; GetCursorPos(&ptCursor); rCoord.x = ptCursor.x - windowCoord.left; rCoord.y = ptCursor.y - windowCoord.top; return rCoord; } WORD GetCurrentFontHeight() { CONSOLE_FONT_INFO cfi; GetCurrentConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &cfi); return cfi.dwFontSize.Y; } WORD GetCurrentFontWidth() { CONSOLE_FONT_INFO cfi; GetCurrentConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &cfi); return cfi.dwFontSize.X; } 。 (找到它here

为了便于测试,我实施了一些"画我的东西"主游戏(see full code)。

/** See the full code for a better understanding */
/** In the main function as parameters of MoveConsoleCursor() */
MoveConsoleCursor(
                  (SHORT)((double)(ptCursor.x/GetCurrentFontWidth() - ((ptCursor.x/GetCurrentFontWidth())%10)/10 )), 
                  (SHORT)((double)(ptCursor.y/GetCurrentFontHeight() - 0.5))
                 );

那么,有没有办法让这种方法更准确?

编辑:这是我设法找到的最准确的方法,虽然它仍然不是很精确。

{{1}}

1 个答案:

答案 0 :(得分:2)

您可以将GetCursPosRelWin更改为:

POINT GetCursPosRelWin(HWND hWindow)
{
    POINT ptCursor;
    GetCursorPos(&ptCursor);

    ScreenToClient(hWindow, &ptCursor);

    return ptCursor;
}

MoveConsoleCursor致电:

MoveConsoleCursor(ptCursor.x / GetCurrentFontWidth(), ptCursor.y / GetCurrentFontHeight());

如果不移动滚动条,则将光标置于正方形的中心。否则,您必须考虑滚动条偏移。