Win32 api Edit Control не реагирует на щелчки мыши в дочернем окнеC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Win32 api Edit Control не реагирует на щелчки мыши в дочернем окне

Сообщение Anonymous »

У меня возникла проблема с элементами управления WinAPI Edit в дочернем окне — они не реагируют на щелчки мыши, но работают нормально, если их разместить в главном окне. Другие элементы управления, такие как кнопки, работают нормально в обоих окнах.
У меня есть главное окно с ListView и кнопками, а также дочернее окно, содержащее элемент управления Edit и кнопку.
Вот как выглядит приложение.
Элемент управления Edit в дочернем окне:
  • Не получает фокус, когда при нажатии
  • Не показывает текстовый курсор при нажатии
  • Не позволяет выбирать текст с помощью мыши
  • Однако: элемент управления «Редактирование» работает отлично, если я помещаю его в главное окно, а не в дочернее окно.
  • Кнопка в дочернем окне работает нормально и реагирует на щелчки.
  • Вызов SetFocus() на элемент управления редактированием работает
Вот код: Pastebin
Создание главного окна

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»