2013-01-17 53 views
0

我創建了一個MFC對話框應用程序。MFC dialogloop在對話框窗口

現在我想使用一個messageloop,但我找不到它。我讀過mfc會爲我創建它,但它會隱藏起來。所以我如何操作messageloop?

我需要messageloop從我的托盤圖標接收事件,我爲該應用程序創建的。

,這樣我可以使用類似的東西:

long CALLBACK WndProc(HWND hWnd, UINT nMsg, UINT wParam, LONG lParam) 
{ 
    switch(nMsg) 
    { 
    case (WM_USER + 1): 
     { 
     switch(lParam) 
     { 
     case WM_RBUTTONUP: 
      { 
       /**/ 
      } 
     } 
     return 0; 
     } 

    default: 
     return DefWindowProc(hWnd, nMsg, wParam, lParam); 
    } 
} 

我還是一個初學者在MFC。

+0

不用擔心消息循環(後面的場景的東西)。搜索並學習如何製作消息映射條目並處理由托盤圖標發送的消息... – Sivaraman

回答

2

通過Shell_NotifyIcon將圖標安裝到系統托盤後,此圖標將成爲對話框UI的擴展。當用戶與此圖標交互時,操作系統會自動將UI消息重定向到您的對話框。

爲您服務,需要執行幾個步驟,這些用戶消息:

(1)添加消息處理程序定義(ON_MESSAGE(WM_TRAY_NOTIFY,OnTrayNotify))的(的.cpp)文件中。必須是BEGIN_MESSAGE_MAP/END_MESSAGE_MAP塊內:

BEGIN_MESSAGE_MAP(CTestDlg, CDialog) 
    //{{AFX_MSG_MAP(CTestDlg) 
    ON_WM_PAINT() 
    ON_WM_QUERYDRAGICON() 
    ... 
    //}}AFX_MSG_MAP 
    ON_MESSAGE(WM_TRAY_NOTIFY, OnTrayNotify) 
END_MESSAGE_MAP() 

(2)添加消息處理程序實現在(的.cpp)文件,來執行實際工作

void CTestDlg::OnTrayNotify(UINT nID, LPARAM lEvent) 
{ 
    if (nID==TRAYICON_ID1) 
    { 
     // handle messages here 
     if (lEvent==WM_LBUTTONDBLCLK) 
     { // do left button double click, usually restore application 
     } 
     if (lEvent==WM_RBUTTONUP) 
     { // do right button up, usually popup a menu at clicked location 
     } 
    } 
} 

(3)添加的原型(.h)文件中的此消息處理函數的定義(afx_msg void OnTrayNotify(UINT nID,LPARAM lEvent);)。必須是BEGIN_MESSAGE_MAP/END_MESSAGE_MAP塊內:

// Generated message map functions 
//{{AFX_MSG(CTestDlg) 
virtual BOOL OnInitDialog(); 
afx_msg void OnPaint(); 
afx_msg HCURSOR OnQueryDragIcon(); 
... 
//}}AFX_MSG 
afx_msg void OnTrayNotify(UINT nID, LPARAM lEvent); 
DECLARE_MESSAGE_MAP() 

(4)添加定義內(.h)文件中

#define WM_TRAY_NOTIFY WM_USER+567 
#define TRAYICON_ID1 0x1234 

上述代碼是假設:

  • 對話框名稱是CTestDlg,將其更改爲您的對話框名稱
  • 用於設置Shell_NotifyIcon的用戶回調消息標識符(uCallbackMessage)是WM_TRAY_NOTIFY
  • sed的設置Shell_NotifyIcon托盤圖標(UID)的標識符是TRAYICON_ID1