1

我在主窗口中创建了一个窗口。当新窗口显示时,主窗口失去焦点并停用。

所以主窗口的框架没有被激活,如下图所示: 在此处输入图像描述

而激活的主窗口应如下所示: 在此处输入图像描述

问题是我需要在创建和显示类似于系统菜单窗口的新窗口时保持主窗口处于激活状态。

我怎么能这样做?

4

2 回答 2

0

也许像新窗口的 SW_SHOWNA/SWP_NOACTIVATE 之类的东西?

于 2013-04-09T14:41:34.323 回答
0
int HandledWidget::showPopup()
{
    int nRet(-1);

    show(SW_SHOWNOACTIVATE);

    BOOL bMenuDestroyed(FALSE);
    BOOL bMsgQuit(FALSE);
    HWND m_hWndOwner = GetWindow(m_hWnd, GW_OWNER);
    assert(GetForegroundWindow() == m_hWndOwner);

    while(TRUE)
    {
        if(GetProp(m_hWnd, MENU_EXIT_NOTIFY) != 0)
        {
            nRet = (int)GetProp(m_hWnd, MENU_EXIT_COMMAND_ID);
            break;
        }

        if(GetActiveWindow() != m_hWndOwner)
        {
            break;
        }

        m_bIsPopingUp = true;

        MSG msg = {0};
        if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            if(msg.message == WM_KEYDOWN
                || msg.message == WM_SYSKEYDOWN
                || msg.message == WM_KEYUP
                || msg.message == WM_SYSKEYUP
                || msg.message == WM_CHAR
                || msg.message == WM_IME_CHAR
                || msg.message == WM_MOUSEWHEEL
                )
            {
                //transfer the message to menu window
                msg.hwnd = m_hWnd;
            }
            else if(msg.message == WM_LBUTTONDOWN
                || msg.message == WM_RBUTTONDOWN
                || msg.message == WM_NCLBUTTONDOWN
                || msg.message == WM_NCRBUTTONDOWN)
            {
                //click on other window
                if(msg.hwnd != m_hWnd)
                {
                    m_bIsPopingUp = false;
                    DestroyWindow(m_hWnd);
                    bMenuDestroyed = TRUE;
                }
            }
            else if(msg.message == WM_QUIT)
            {
                bMsgQuit = TRUE;
            }

            TranslateMessage (&msg);
            DispatchMessageW (&msg);
        }
        else
        {
            MsgWaitForMultipleObjects (0, 0, 0, 10, QS_ALLINPUT);
        }

        if(bMenuDestroyed) break;

        if(bMsgQuit)
        {
            PostQuitMessage(msg.wParam);
            break;
        }
    }

    m_bIsPopingUp = false;

    if(!bMenuDestroyed) DestroyWindow(m_hWnd);

    return nRet;
}

bool HandledWidget::exitPopup(int nCommandId)
{
    BOOL bRet = SetProp(m_hWnd, MENU_EXIT_NOTIFY, (HANDLE)1);
    SetProp(m_hWnd, MENU_EXIT_COMMAND_ID, (HANDLE)nCommandId);
    return bRet;
}

并处理 wm_mouseactivate:

LRESULT ComboxList::onMouseActivate( WPARAM wParam, LPARAM lParam, bool &bHandled )
{
    bHandled = true;
    return MA_NOACTIVATE;
}

记住不要使用 SetFocus/SetWindowPos(SW_SHOWWINDOW)/ShowWindow(SW_SHOW)/SetActivate/SetForegroundWindow 等激活新窗口。

然后你会得到一个非激活窗口,就像系统菜单一样。

参考:http ://www.cppblog.com/weiym/archive/2013/04/07/199189.html

于 2013-05-07T09:13:55.450 回答