2013-04-03 72 views
0

我創建一個MFC應用程序MyView.cpp文件,並在任務欄圖標我寫MFC C++托盤中的應用問題

static const UINT WMU_NOTIFY_TASKBAR_ICON = ::RegisterWindowMessage(_T("NOTIFY_TASKBAR_ICON")); 

    IMPLEMENT_DYNCREATE(CMyView, CView) 

    BEGIN_MESSAGE_MAP(CMyView, CView) 
     // Standard printing commands 
     ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint) 
     ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint) 
     ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview) 
     // added messages by the developer 
     ON_REGISTERED_MESSAGE(WMU_NOTIFY_TASKBAR_ICON, OnNotifyTaskbarIcon) 
    END_MESSAGE_MAP() 
    //... 

    void CMyView::AddTaskbarIcon() 
    { 
     DWORD dwMessage = NIM_ADD; 
     NOTIFYICONDATA nid; 

     nid.cbSize = sizeof(NOTIFYICONDATA); 
     nid.hWnd = HWND(AfxGetApp()->m_pMainWnd); 
     nid.uID = 0; 
     nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; 
     nid.uCallbackMessage = WMU_NOTIFY_TASKBAR_ICON; 
     nid.hIcon = LoadIcon(GetModuleHandle(0), MAKEINTRESOURCE(IDI_SS_ICON)); 
     nid.dwInfoFlags = NIIF_INFO; 
     ::Shell_NotifyIconW(dwMessage, &nid); 
    } 

    LRESULT CMyView::OnNotifyTaskbarIcon(WPARAM wParam, LPARAM lParam) 
    { 
     UINT uID = (UINT)wParam; 
     UINT uMouseMsg = (UINT)lParam; 

     switch(uMouseMsg) 
     { 
     case WM_LBUTTONDOWN: 
      break; 

     case WM_LBUTTONDBLCLK: 
      //if(IsIconic()) 
      { 
       break; 
      } 

     case WM_RBUTTONDOWN: 
      { 
       // must be implemented: 
       // app popup menu will be showed 
       CMenu* pMenu = GetMenu(); 
       if(pMenu) 
       { 
        CMenu *pSubMenu = NULL; 
        pSubMenu = pMenu->GetSubMenu(0); 
        { 
         SetForegroundWindow(); // *** little patch here ***    
         POINT pointCursor;    
         ::GetCursorPos(&pointCursor);    
         pSubMenu->TrackPopupMenu(TPM_RIGHTALIGN, 
          pointCursor.x, pointCursor.y, 
          this); 
        } 
       } 
      } 
      break; 

     case WM_RBUTTONDBLCLK: 
      break; 

     case WM_MOUSEMOVE: 
      break; 
     } 

     return 0L; 
    } 

和My.cpp

BOOL CMyApp::InitInstance() 
    { 
      //... 
      myViewPtr->AddTaskbarIcon(); 
      //... 
    } 

應用程序啓動,圖標出現在任務欄上,但在鼠標懸停時消失。 我做錯了什麼? Thanx

回答

3

AfxGetApp()->m_pMainWnd指向主框架窗口,而不是視圖。我懷疑框架窗口正在接收WMU_NOTIFY_TASKBAR_ICON消息,並沒有對其進行處理,因此Windows刪除了該圖標。

你既可以處理在幀窗口類的消息,或通過句柄視圖代替,這樣的:

void CMyView::AddTaskbarIcon() 
{ 
    ... 
    nid.hWnd = GetSafeHwnd(); 
    ... 
}