c++ - 确定鼠标光标所在的控制台上的字符

标签 c++ winapi console mouse

众所周知,控制台缓冲区大小是像二维数组一样组成的。我正在尝试实现 on click buttons (绘制的按钮不是子窗口)但我有一个准确性问题。

因为 Console Window是可移动和可调整大小的,我必须采取 Mouse Cursor相对于 Console Window 的位置左上角(我找到了一种以像素为单位准确做到这一点的方法)。但现在问题来了。当我试图找出哪个 character square Mouse Cursor打开时,它会变得不准确(大约 3 ~ 5 个像素的错误),这是实现 on click buttons 时的问题。

这些是我使用的功能。另请记住,我们之前需要有 GetCurrentConsoleFont()宣布。 (找到它here)

为了便于测试,我在主程序中实现了一个“画我的东西”小游戏(see full code)。

/** 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;
}

那么,有没有办法让这个方法更加准确呢?

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

/** 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))
                 );

最佳答案

您可以将 GetCursPosRelWin 更改为:

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

    ScreenToClient(hWindow, &ptCursor);

    return ptCursor;
}

MoveConsoleCursor 调用:

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

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

关于c++ - 确定鼠标光标所在的控制台上的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50381934/

相关文章:

c++ - 使用 SetWindowSubclass 在自定义类中子类化按钮

c - 如何使控制台输出固定到位

javascript - 将 javascript 表导出到 Excel 或控制台表

c++ - 从 Windows 上的文件中删除前 N 个字节的最有效方法是什么?

java - Java 中的关键字突出显示问题(使用 System.out)

c++ - 如何专门针对多个整数值范围的 C++ 模板?

c++ - 我怎样才能避免把这个变量放在堆栈上?

c++ - 从文件中读取类对象c++

c++ - WinAPI 鼠标单击无法正常工作

c++ - 如何以编程方式为添加到 FILE 端口的打印机提供目标文件路径?