MFC C ++托盘应用程序问题

时间:2013-04-03 11:40:55

标签: c++ visual-studio mfc

我正在创建一个mfc应用程序的任务栏图标,并且在MyView.cpp文件中我写了

    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();
            //...
    }

应用程序启动后,图标会显示在任务栏上,但鼠标悬停时它会消失。 我做错了什么吗?感谢名单

1 个答案:

答案 0 :(得分:3)

AfxGetApp()->m_pMainWnd指向主框架窗口,而不是视图。我怀疑框架窗口正在接收WMU_NOTIFY_TASKBAR_ICON消息而不处理它,因此Windows会删除该图标。

您可以在框架窗口类中处理消息,也可以将句柄传递给视图,如下所示:

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