У меня есть главное окно с ListView и кнопками, а также дочернее окно, содержащее элемент управления Edit и кнопку.
Вот как выглядит приложение.
Элемент управления Edit в дочернем окне:
- Не получает фокус, когда при нажатии
- Не показывает текстовый курсор при нажатии
- Не позволяет выбирать текст с помощью мыши
- Однако: элемент управления «Редактирование» работает отлично, если я помещаю его в главное окно, а не в дочернее окно.
- Кнопка в дочернем окне работает нормально и реагирует на щелчки.
- Вызов SetFocus() на элемент управления редактированием работает
Создание главного окна
Код: Выделить всё
Window::Window(int WIDTH, int HEIGHT) {
// ... window class registration
hwnd = CreateWindowEx(/* ... main window params */);
// Edit control in main window (THIS WORKS FINE)
// But I need it in the child window
}
Код: Выделить всё
ChildWindow::ChildWindow(HWND parentHwnd) {
// ... child window class registration
hwnd = CreateWindowExW(
0,
CHILD_CLASS_NAME,
L"Child Window",
WS_CAPTION | WS_SYSMENU | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
LV_WIDTH, 0, windowWidth, windowHeight,
parentHwnd, // parent is main window
NULL, hInstance, NULL
);
// Problematic Edit control in child window
passEditHwnd = CreateWindowW(
L"EDIT", L"",
WS_BORDER | WS_VISIBLE | WS_CHILD | WS_TABSTOP | ES_AUTOHSCROLL,
(windowWidth / 2) - (buttonWidth / 2),
(windowHeight / 4) * 3,
buttonWidth, buttonHeight,
hwnd, // parent is child window
(HMENU)CHILD_EDIT_ID, hInstance, NULL
);
// This button in the same child window works fine
testHwnd = CreateWindowW(
L"BUTTON", L"test",
WS_BORDER | WS_TABSTOP | WS_VISIBLE | WS_CHILD,
// ... same parameters
hwnd, (HMENU)CHILD_TEST_BTN_ID, hInstance, NULL
);
}
Код: Выделить всё
bool Window::ProcessMessages() {
MSG msg = {};
while (PeekMessageW(&msg, nullptr, 0, 0, PM_REMOVE) > 0) {
if (msg.message == WM_QUIT || msg.message == WM_DESTROY) {
return false;
}
TranslateMessage(&msg); // This is present
DispatchMessage(&msg);
}
return true;
}
- Различные стили управления редактированием: WS_TABSTOP, ES_AUTOHSCROLL, ES_CLIENTEDGE
- Явная настройка фокуса: SetFocus(passEditHwnd) работает при вызове при нажатии кнопки
- EnableWindow(): пробовал включение/отключение — без эффекта
- TranslateMessage(): уже присутствует в цикле сообщений
- Z-порядок окон: пробовал BringWindowToTop(), SetWindowPos(), не работает
- Различные родительские отношения: та же проблема
Подробнее здесь: https://stackoverflow.com/questions/797 ... ild-window