Определите символ на консоли при включенном MouseCursor - PullRequest
0 голосов
/ 17 мая 2018

Как мы все знаем, размер буфера консоли составляется как двумерный массив. Я пытаюсь реализовать 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))
                 );

1 Ответ

0 голосов
/ 17 мая 2018

Вы можете изменить GetCursPosRelWin на:

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

    ScreenToClient(hWindow, &ptCursor);

    return ptCursor;
}

И MoveConsoleCursor Звоните:

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

Это помещает курсор в центр квадрата, если полосы прокрутки не перемещены. В противном случае вы должны учитывать смещения полосы прокрутки.

...