Я новичок в программировании Windows и постоянно сталкиваюсь с различными проблемами, большинство из которых мне удалось решить самостоятельно.
Моя проблема под рукой — курсор (или курсор), показанный в текстовых областях. То, что указывает, где вы печатаете свой текст? Ну, это показано, по крайней мере, но оно не мигает так, как должно.
У меня есть поле EDIT, созданное в WM_CREATE, вот так:
case WM_CREATE:
{
if(!logged) {
HWND userField = CreateWindow(
"EDIT", // Predefined class; Unicode assumed
NULL, // Button text
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT, // Styles
C_WIDTH/2 - 80, // x position
C_HEIGHT - 240, // y position
160, // Button width
25, // Button height
hwnd, // Parent window
NULL, // No menu.
(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
NULL); // Pointer not needed.
// initialize NONCLIENTMETRICS structure
NONCLIENTMETRICS ncm;
ncm.cbSize = sizeof(ncm);
// obtain non-client metrics
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0);
// create the new font
HFONT hNewFont = CreateFontIndirect(&ncm.lfMessageFont);
// set the new font
SendMessage(userField, WM_SETFONT, (WPARAM)hNewFont, 0);
}
}
break;
Вот и весь код, относящийся к окну редактирования. Извините, если я не достаточно ясен, или у меня не хватает кода; Я не уверен, какие части кода здесь важны, а какие нет. Я не думаю, что я должен вставить весь свой код здесь, либо.
Проблема, опять же, заключается в том, что курсор в текстовом поле (userField) не мигает.
Пожалуйста, попросите более подробную информацию, если они вам нужны.
Используя ваш код, я не получил мигающую карету. Но потом я добавил:
SetFocus( userField );
и вуаля, мигающая карета 🙂
Возможно, это не та проблема, с которой столкнулся ОП, но у меня был тот же симптом, и я публикую здесь свое решение на случай, если кто-то еще столкнется с этой проблемой …
Короче говоря, если вы создаете подкласс для элемента управления edit и обрабатываете событие WM_SETFOCUS, вам нужно вызвать DefSubclassProc (), иначе ваша каретка не будет отображаться. Предположительно, вы можете вызвать ShowCaret () самостоятельно, но вам, вероятно, безопаснее просто вызвать DefSubclassProc () на случай, если потребуется другая обработка.
После игры — делая мой код немного более аккуратным и прочим — я случайно решил это самостоятельно
Я изменился
HWND userField = CreateWindow(
"EDIT", // Predefined class; Unicode assumed
NULL, // Button text
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT, // Styles
C_WIDTH/2 - 80, // x position
C_HEIGHT - 240, // y position
160, // Button width
25, // Button height
hwnd, // Parent window
NULL, // No menu.
(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
NULL); // Pointer not needed.
В
HWND userField = CreateWindow("EDIT", NULL, WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,
C_WIDTH/2 - 80, C_HEIGHT - 240, 160, 25, hwnd, NULL, g_hInstance, NULL);
Единственное отличие — это hInstance: в первом коде это было явно неправильно. Я изменил это в свою глобальную ссылку hInstance.