Xpnctoc Ответов: 5

Win32: почему WS_CHILD не получает фокуса?


Выполнение прямого программирования Win32 API... прежде чем я опубликую кучу кода, я просто задам вопрос и посмотрю, есть ли у кого-нибудь быстрые идеи:

Я создаю свое главное окно WS_OVERLAPPED. Во время сообщения WM_CREATE я создаю окно WS_CHILD. Чтобы различать их, я сделал цвет фона главного окна цветом APPWORKSPACE, а дочернее окно просто белым. Все отображается правильно. Однако все сообщения WM_KEYUP и WM_KEYDOWN поступают вместе с дескриптором главного окна.

Эта проблема сразу же исчезнет, если я изменю WM_CHILD на WM_POPUP. Конечно, это не очень помогает, так как я специально хочу иметь дочернее окно. Но я думаю, что это, по крайней мере, показывает, что общая настройка обработки моих сообщений в порядке. Я подумал, что, возможно, это как-то связано с созданием ребенка во время родительского процесса WM_CREATE, но я не уверен, что именно. Я попытался щелкнуть в дочерней области, чтобы заставить фокус, но ключевые сообщения по-прежнему отправляются родителю.

Может ли кто-нибудь придумать причину, по которой WS_CHILD не будет получать сообщения WM_KEY*?

5 Ответов

Рейтинг:
37

Xpnctoc

Johny10151981: Интересно. Мне придется попробовать.

Mbue: WM_ACTIVATE не имел никакого эффекта, но установка дочернего фокуса из родительского сообщения WM_SETFOCUS, похоже, работает для меня:

HWND child = GetFirstChild( mHwnd );
if( child )
{
    SetFocus( child );
}

Спасибо за ответы.


mbue

Я сказал:

LRESULT WndProc(HWND h,int m,WPARAM w,LPARAM l)
{
switch(m)
{
case WM_ACTIVATE:
if(w) SetFocus(GetWindow(h,GW_HWNDCHILD));
return 0;
}
return DefWindowProc(h,m,w,l);
}

С уважением.

Рейтинг:
2

mbue

Вызов SetFocus(hChild); на WM_ACTIVATE или / и WM_MOUSEACTIVATE родительского окна.
С уважением.


Рейтинг:
2

Mohibur Rashid

если вы ищете фокус на нажатии tab необходимо сделать две вещи
1. Установите стиль WM_TABSTOP
2. Используйте функцию IsDialogMessage для работы tabstop. вот пример:

while(GetMessage(&msg,0,0,0))
{
 if(!IsDialogMessage(hwnd,&msg))
 {
  ..
  ..
  
 }
}


Рейтинг:
1

Richard MacCutchan

Потому что главное окно автоматически фокусируется на создании. Затем ваше приложение должно установить фокус на любые дочерние окна, которые оно выберет. В случае всплывающего окна или диалогового окна это рассматривается так же, как и главное окно.


Рейтинг:
1

Member 12901989

Если вы используете WM_MOUSEMOVE, проверьте текущий hWnd = = старый hWnd,
когда текущий дескриптор был изменен, установите Setfources () с текущим hWnd.

-----

статические _CurHWnd его hwnd = и nullptr, _ZenHWnd = и nullptr;

дело WM_MOUSEMOVE:
_CurHWnd = hwnd элемента;
если (_CurHWnd != _ZenHWnd) {
::Метода Setfocus(_CurHWnd);
_ZenHWnd = _CurHWnd;
}


Richard MacCutchan

Этот вопрос был открыт и на него был дан ответ 5 лет назад! Почему ты пишешь здесь?