MFC窗口實現最小化到托盤 右鍵菜單和還原


//.h文件
void toTray();//最小化到托盤
void DeleteTray();//刪除托盤圖標

afx_msg LRESULT OnShowTask(WPARAM wParam,LPARAM lParam) ;//圖標恢復


//.cpp文件

#define WM_SHOWTASK (WM_USER +1)
#define IDR_SHOW 11
#define IDR_OTHER 12
#define IDR_EXIT 13

BEGIN_MESSAGE_MAP()
...
ON_MESSAGE(WM_SHOWTASK,OnShowTask)//消息映射
END_MESSAGE_MAP()

 

void ScheduleDlg::toTray()//最小化到托盤
{
    NOTIFYICONDATA nid;  
    nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);  
    nid.hWnd=this->m_hWnd;  
    nid.uID=IDR_MAINFRAME;  
    nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;  
    nid.uCallbackMessage=WM_SHOWTASK;//自定義的消息名稱  
    nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));  
    strcpy(nid.szTip,"OA");//信息提示條為“OA”  
    Shell_NotifyIcon(NIM_ADD,&nid);//在托盤區添加圖標  
    ShowWindow(SW_HIDE);//隱藏主窗口 
}

LRESULT ScheduleDlg::OnShowTask(WPARAM wParam, LPARAM lParam)
{//wParam接收的是圖標的ID,而lParam接收的是鼠標的行為 
    if(wParam != IDR_MAINFRAME) return 1;
    switch (lParam)
    {
    case WM_LBUTTONUP://左鍵單擊顯示主界面
        {
            this->ShowWindow(SW_SHOW);
            SetForegroundWindow();
            DeleteTray();
        }break;
    case WM_RBUTTONUP://右擊彈出菜單
        {
            LPPOINT lpoint = new tagPOINT;
            ::GetCursorPos(lpoint);//得到鼠標位置
            CMenu menu;
            menu.CreatePopupMenu();
            menu.AppendMenu(MFT_STRING, IDR_SHOW, "打開主界面");
            menu.AppendMenu(MFT_STRING, IDR_OTHER, "其他");
            menu.AppendMenu(MFT_STRING, IDR_EXIT, "退出");
            SetForegroundWindow();
            EnableMenuItem(menu,IDR_OTHER,MF_GRAYED);//"其他"菜單變灰
            //menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x,lpoint->y,this);//顯示菜單
            int xx=TrackPopupMenu(menu,TPM_RETURNCMD,lpoint->x,lpoint->y,NULL,this->m_hWnd,NULL);//顯示菜單並獲取選項ID
            if(xx==IDR_SHOW) 
            {
                this->ShowWindow(SW_SHOW);
                SetForegroundWindow();
                DeleteTray();
            }
            else if(xx==IDR_OTHER) {MessageBox("你點擊了“其他”菜單","提示",MB_OK);}
            else if(xx==IDR_EXIT) {OnBnClickedCancel();}
            HMENU hmenu = menu.Detach();
            menu.DestroyMenu();
            delete lpoint;
        }break;
    case WM_LBUTTONDBLCLK:
        {
            //雙擊不處理
        }break;
    }
    return 0;
}

void ScheduleDlg::DeleteTray()//銷毀托盤圖標
{
    NOTIFYICONDATA nid;
    nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA);
    nid.hWnd = this->m_hWnd;
    nid.uID = IDR_MAINFRAME;
    nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
    nid.uCallbackMessage = WM_SHOWTASK;
    nid.hIcon = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
    strcpy(nid.szTip,"OA");
    Shell_NotifyIcon(NIM_DELETE, &nid);
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM