Как мы все знаем, размер буфера консоли составляется как двумерный массив. Я пытаюсь реализовать on click buttons
(нарисованные кнопки НЕ дочерние окна), но у меня проблема с точностью.
Поскольку Console Window
является подвижным и изменяемого размера, я должен занять позицию Mouse Cursor
относительно угла Console Window
TopLeft (я нашел способ точно сделать это в пикселях). Но теперь проблема приходит. Когда я пытаюсь выяснить, на каком character square
включен Mouse Cursor
, он становится неточным (ошибки около 3 ~ 5 пикселей), и это является проблемой при реализации on click buttons
.
Это функции, которые я использую. Также имейте в виду, что нам нужно предварительно объявить 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;
}
Итак, есть ли способ сделать этот метод более точным?
РЕДАКТИРОВАТЬ: Это самый точный способ, который мне удалось найти, хотя он все еще не очень точный.
/** 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))
);