Цикл сообщений MFC в диалоговом окне

Я создал диалоговое приложение 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); 
   } 
}

Я еще новичок в МФЦ.


person Laokoon    schedule 17.01.2013    source источник
comment
Не беспокойтесь о цикле сообщений (за кадром). Найдите и узнайте, как создавать записи на карте сообщений и обрабатывать сообщения, отправленные значком на панели задач...   -  person Sivaraman    schedule 17.01.2013


Ответы (1)


После установки значка на панель задач с помощью Shell_NotifyIcon этот значок становится расширением вашего диалогового интерфейса. Когда пользователь взаимодействует с этим значком, сообщения пользовательского интерфейса будут автоматически перенаправляться ОС в ваш диалог.

Чтобы обслуживать эти пользовательские сообщения, вам необходимо выполнить несколько шагов:

(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) Добавьте определение прототипа этого обработчика сообщений (afx_msg void OnTrayNotify(UINT nID, LPARAM lEvent);) внутри файла (.h). Должен находиться внутри блока 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, измените его на свое имя диалога.
  • Идентификатор сообщения обратного вызова пользователя (uCallbackMessage), используемый для настройки Shell_NotifyIcon, — WM_TRAY_NOTIFY.
  • Идентификатор значка в трее (uID), переданный для настройки Shell_NotifyIcon, равен TRAYICON_ID1.
person mfc    schedule 17.01.2013