【问题标题】:Win32: C++: How do I re-focus on Parent Window after clicking in a child window?Win32:C++:单击子窗口后如何重新关注父窗口?
【发布时间】:2015-10-12 18:07:49
【问题描述】:

在我的 Win32 CPP 程序中,我定义了一些子窗口来显示各种文本字符串,使用如下:

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)可以再次工作?我希望我可以单击主窗口的标题栏,然后它会恢复正常,但这不起作用(因为显然我的程序缺少一些额外的逻辑)。

【问题讨论】:

  • 听起来你的主窗口在点击鼠标时没有调用SetFocus

标签: c++ winapi mouse createwindow


【解决方案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);
}

【讨论】:

  • 这有效,用鼠标点击不再“激活”子窗口。虽然现在我仍然需要弄清楚如何让我选择子窗口文本,然后单击父窗口的其他区域以重新激活它。 WM_KILLFOCUS 在失去焦点之前被发送到父窗口(当我在其中一个子窗口中单击时)。和 SetFocus(hWnd);马上回来。
  • @a1s2d3f4 如果您只想在单击时重新激活主窗口,只需处理WM_LBUTTONDOWN 消息设置焦点。
  • @a1s2d3f4 我将评论编辑到我的答案中,请接受。
【解决方案2】:
case WM_KEYDOWN:
    SetFocus(Parent_Hwnd);
    return SendMessage(Parent_Hwnd,WM_KEYDOWN,wParam,lParam);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多