0

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

アプリが起動すると、タスクバーにアイコンが表示されますが、マウスをホバーすると消えます。私は何か間違ったことをした?ありがとう

4

1 に答える 1

3

AfxGetApp()->m_pMainWndビューではなく、メイン フレーム ウィンドウを指します。フレーム ウィンドウがWMU_NOTIFY_TASKBAR_ICONメッセージを受信し、それを処理していないと思われるため、Windows はアイコンを削除します。

次のように、フレーム ウィンドウ クラスでメッセージを処理するか、代わりにビューにハンドルを渡すことができます。

void CMyView::AddTaskbarIcon()
{
     ...
     nid.hWnd = GetSafeHwnd();
     ...
}
于 2013-04-03T20:18:32.657 に答える