2013-04-09 71 views
1

我在主窗口中創建了一個窗口。當新窗口顯示時,主窗口失去焦點並停用。創建一個類似系統默認菜單的窗口?

所以在主窗口的框架沒有被激活,如下所示的畫面: enter image description here

而激活的主窗口應該是這樣的: enter image description here

的問題是我需要保持主窗口在我創建並顯示類似系統菜單窗口的新窗口時激活。

我該怎麼做?

回答

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

0

對於新窗口可能類似SW_SHOWNA/SWP_NOACTIVATE?

+1

不留神:-(閱讀「FakeMenu」由R.Chen(在SDK) – kero 2013-04-09 14:49:18

+0

煤油,THX您的回覆,我覺得fakemenu確實有幫助,但你可以用更多的擴展你的答案。細節。 – Jichao 2013-04-11 15:56:44

相關問題