2015-07-22 8 views
0

В моей программе Win32 CPP я определил некоторые дочерние окна, чтобы отобразить различные текстовые строки, используя что-то вроде:Win32: C++: Как переориентироваться на родительское окно после нажатия дочернего окна?

hnd_to_this_ch_window = CreateWindow( 
         L"EDIT",L"Some initial text", WS_VISIBLE | WS_CHILD | ES_LEFT, 
         position_of_this_window_X,    
         position_of_this_window_Y, 
         TEXTOUT_DEFAULT_WIDTH,   
         TEXTOUT_DEFAULT_HEIGHT, 
         handle_to_my_parent_window, NULL,       
         hinstance_variable_used_by_create_window, 
         NULL) 

Моя проблема заключается в том, что если я нажимаю с моей мыши, чтобы выбрать текст в одной из таких дочерних окон (скажем, скопируйте его где-нибудь), фокус приложения переходит в это дочернее окно, и поэтому любые нажатия клавиш, которые раньше обрабатывались через мои главные окна CALLBACK (в случае WM_KEYDOWN :) теперь записываются в дочернее окно, где они отображаются как введенные символы. Какую магическую функцию я вызываю, чтобы фокус возвращался к родительскому объекту (так что мой WM_KEYDOWN) может работать снова? Я надеялся, что могу просто нажать на заголовок главного окна, и это вернет его к нормальной работе, но это не работает (потому что, очевидно, в моей программе не хватает дополнительной логики).

+0

Это звучит как главное окно не называет 'SetFocus', когда он получает щелчок мыши. –

ответ

1

Обращайтесь к сообщению WM_KILLFOCUS в окне процедуры окна, которое вы хотите сфокусировать, и восстановите фокус с помощью функции SetFocus. Если вы хотите сфокусировать окно, тогда его щелкнули, обработав сообщение WM_LBUTTONDOWN.

LRESULT CALLBACK MyWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) 
{ 
    // Restore the focus when it was lost. 
    if (Msg == WM_KILLFOCUS) { 
     SetFocus(hWnd); 
     // Msg was handled, return zero. 
     return 0; 
    } 
    // Or when the window is clicked. 
    if (Msg == WM_LBUTTONDOWN) { 
     SetFocus(hWnd); 
     // Msg was handled, return zero. 
     return 0; 
    } 
    return DefWindowProc(hWnd, Msg, wParam, lParam); 
} 
+0

Это работает, нажатие мышью больше не «активирует» дочернее окно. Хотя теперь мне еще нужно выяснить, как разрешить мне выбрать текст дочернего окна, а затем щелкнуть в какой-либо другой области родительского окна, чтобы его повторно активировать. WM_KILLFOCUS отправляется в родительское окно непосредственно перед тем, как он теряет фокус (когда я нажимаю внутри одного из дочерних окон). И SetFocus (hWnd); получает его обратно. – a1s2d3f4

+0

@ a1s2d3f4 Если вы хотите повторно активировать основное окно только при нажатии на него, просто обработайте [WM_LBUTTONDOWN] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms645607%28v=vs .85% 29.aspx), чтобы установить фокус. –

+0

Да, это то, что мне нужно. Благодарю. – a1s2d3f4

-1
case WM_KEYDOWN: 
    SetFocus(Parent_Hwnd); 
    return SendMessage(Parent_Hwnd,WM_KEYDOWN,wParam,lParam);