C++ 最小化到托盤

define WM_SHOWTASK (WM_USER + 1)

void CTestDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {
        //增長關閉時最小化到托盤的函數
        if (nID == SC_CLOSE) //SC_MINIMIZE
        {
            ToTray();
            return;
        }
        CDialog::OnSysCommand(nID, lParam);
    }
}
BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
    ON_MESSAGE(WM_SHOWTASK, OnShowTask)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()
//在托盤區添加圖標 最小化到托盤函數
void ToTray(void);
void CTestDlg::ToTray(void)
{
    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));
    wcscpy_s(nid.szTip, _T("***程序"));//信息提示條
    Shell_NotifyIcon(NIM_ADD, &nid);//在托盤區添加圖標
    ShowWindow(SW_HIDE);//隱藏主窗口
}
//恢復界面函數
afx_msg LRESULT OnShowTask(WPARAM wParam, LPARAM lParam);
//托盤事件
LRESULT CTestDlg::OnShowTask(WPARAM wParam, LPARAM lParam)
{
    if (wParam != IDR_MAINFRAME)
    {
        return 1;
    }
    switch(lParam)
    {
    case WM_RBUTTONUP://右鍵起來時彈出快捷菜單,這裏只有一個關閉
    {
        LPPOINT lpoint = new tagPOINT;
        ::GetCursorPos(lpoint);//獲得鼠標位置
        CMenu menu;
        menu.CreatePopupMenu();//聲明一個彈出式菜單
        //增長菜單項「關閉」,點擊則發送消息WM_DESTROY給主窗口(已
        //隱藏),將程序結束。
        menu.AppendMenu(MF_STRING, WM_DESTROY, _T("退出"));
        //肯定彈出式菜單的位置
        menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x, lpoint->y, this);
        //資源回收
        HMENU hmenu = menu.Detach();
        menu.DestroyMenu();
        delete lpoint;
    }
    break;
    case WM_LBUTTONDBLCLK://雙擊左鍵的處理
    {
        this->ShowWindow(SW_SHOW);//簡單的顯示主窗口
        this->ShowWindow(SW_RESTORE);
        DeleteTray();
    }
    break;
    default:
        break;
    }
    return 0;
}
//刪除托盤中圖標
void DeleteTray();
void CTestlDlg::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));
    wcscpy_s(nid.szTip, _T("***程序"));//信息提示條爲「按計劃任務提醒」
    Shell_NotifyIcon(NIM_DELETE, &nid);//在托盤中刪除圖標
}
//退出程序需時須要DeleteTray();
void CTestDlg::OnDestroy()
{
    CDialog::OnDestroy();
    // TODO: 在此處添加消息處理程序代碼
    DeleteTray();
}
//修改風格使得他不在任務欄顯示
int CTestDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CDialog::OnCreate(lpCreateStruct) == -1)
        return -1;
    // TODO:  在此添加您專用的建立代碼
    //修改風格使得他不在任務欄顯示
    ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);
    return 0;
}

DeleteTray改成:函數

void CTestDlg::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));
    //wcscpy_s(nid.szTip, _T("***程序"));//信息提示條爲「按計劃任務提醒」
    Shell_NotifyIcon(NIM_DELETE, &nid);//在托盤中刪除圖標
}

不然會出現程序退出後,托盤圖標還在的狀況,鼠標移動到圖標上後,圖標一閃而後消失的問題。this

相關文章
相關標籤/搜索