【问题标题】:MFC messageloop in dialog window对话框窗口中的 MFC 消息循环
【发布时间】:2013-01-17 10:55:28
【问题描述】:

我创建了一个 MFC 对话框应用程序。

现在我想使用消息循环,但我找不到它。我读到 mfc 会为我创建它,但它会被隐藏。那么我该如何操作消息循环呢?

我需要消息循环从我为该应用程序创建的托盘图标接收事件。

这样我就可以使用类似的东西:

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 的初学者。

【问题讨论】:

  • 不要担心消息循环(幕后的东西)。搜索并了解如何制作消息映射条目并处理托盘图标发送的消息...

标签: c++ mfc tray message-loop


【解决方案1】:

通过 Shell_NotifyIcon 将图标安装到系统托盘后,该图标成为对话 UI 的扩展。当用户与此图标交互时,UI 消息将由操作系统自动重定向到您的对话框。

要提供这些用户消息,您需要执行几个步骤:

(1) 在 (.cpp) 文件中添加消息处理程序定义 (ON_MESSAGE(WM_TRAY_NOTIFY, OnTrayNotify))。必须在 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
  • 用于设置 Shell_NotifyIcon 的托盘图标 (uID) 的标识符是 TRAYICON_ID1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多