Окно C ++ теряет фокус при нажатии дочерней кнопки - PullRequest
0 голосов
/ 15 декабря 2011

Я пытаюсь запустить графический интерфейс для приложения C ++, но у меня проблема с событиями нажатия клавиш.В принципе, все работает нормально, пока я не нажимаю на какие-либо кнопки (главное окно регистрирует ключевые события), но как только я нажимаю на кнопку, главное окно теряет фокус и больше не фиксирует ключевые события.Это может быть глупый вопрос, но я очень плохо знаком с C ++.Вот часть кода, который я использую:

Создание главного окна:

hwnd = CreateWindowEx (
               0,                   /* Extended possibilites for variation */
               szClassName,         /* Classname */
               "Application Name",  /* Title Text */
               WS_OVERLAPPEDWINDOW, /* default window */
               CW_USEDEFAULT,       /* Windows decides the position */
               CW_USEDEFAULT,       /* where the window ends up on the screen */
               540,                 /* The programs width */
               250,                 /* and height in pixels */
               HWND_DESKTOP,        /* The window is a child-window to desktop */
               NULL,                /* No menu */
               hThisInstance,       /* Program Instance handler */
               NULL                 /* No Window Creation data */
           );

Создание одной из кнопок:

CreateWindow(TEXT("button"), TEXT("Start"),
                 WS_VISIBLE | WS_CHILD,
                 x, y, width, height,
                 hwnd, (HMENU) 6, NULL, NULL);

У меня также естьзаметил, что всякий раз, когда я нажимаю на кнопку, происходит событие WM_KILLFOCUS, поэтому я считаю, что это главный вопрос.Я также попытался захватить событие WM_KILLFOCUS, а затем снова установить фокус с помощью SetActiveWindow, но это привело к сбою моей программы.

Любая помощь будет принята:)

Ответы [ 2 ]

2 голосов
/ 15 декабря 2011

Оказалось, что я использовал неправильную функцию (SetWindowActive). Ответ Ассафа Леви показался мне сложным, и я подумал, что может быть другой путь к этому. Мне удалось найти функцию SetFocus, которая дает фокус любому окну, предоставляя ему дескриптор.

Чтобы заставить его работать, мне нужно было, чтобы после того, как необходимый код был выполнен внутри блока WM_COMMAND, я вызвал функцию SetFocus с дескриптором главного окна. Это вернуло фокус к главному окну и позволило ему получать события.

Обратите внимание, что установка SetFocus в блок WM_KILLFOCUS приведет к тому, что кнопки и любой другой компонент в нем не будут реагировать на события.

2 голосов
/ 15 декабря 2011

Это по замыслу.Главное окно - window, но кнопка - window, и только один может иметь фокус в любой момент времени.Если вы не хотите, чтобы кнопка «крала» фокус, добавьте обработчик OnFocus (или перехватите WM_SETFOCUS) и немедленно верните фокус в предыдущее окно (я полагаю, оно находится в WPARAM из WM_SETFOCUS).

Простым взломом будет:

  1. hMyButton = CreateWindow ("button", ...).
  2. Определение MyButtonProc (HWND, UINT, WPARAM,Функция LPARAM).
  3. Вызов SetWindowLong (hMyButton, GWL_WNDPROC, (LONG) MyButtonProc).Сохраните значение, возвращаемое этой функцией, в g_OldButtonProc.
  4. Внутри MyButtonProc () перехватите WM_SETFOCUS и вызовите SetFocus (hMyMainWindow).Всегда возвращайте CallWindowProc (h_OldButtonProc, hwnd, msg, ...) в конце вашей функции MyButtonProc (), если только сообщение не было WM_SETFOCUS.

Это поможет (проверено).

...