MFC添加托盘图标,实现点击显示_隐藏窗口,添加托盘右键菜单

⌚Time: 2022-10-01 11:42:55

👨‍💻Author: Jack Ge

窗口类中定义结构体


NOTIFYICONDATA  m_stNotifyIcon;

在窗体类的OnInitDialog函数中加入


    m_stNotifyIcon.cbSize = sizeof(NOTIFYICONDATA);

    m_stNotifyIcon.hWnd = this->m_hWnd;//接收托盘消息的窗口句柄 this是当前dialog

    //m_stNotifyIcon.uID = 100;//托盘图标的资源ID

    m_stNotifyIcon.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;

    lstrcpyn(m_stNotifyIcon.szTip, L"单击右键显示菜单", sizeof(L"单击右键显示菜单"));//图标上的提示字符串

    //m_stNotifyIcon.uCallbackMessage = WM_ONTRAY;//自定义的消息

    m_stNotifyIcon.hIcon = ::LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));//设置托盘图标

    Shell_NotifyIcon(NIM_ADD, &m_stNotifyIcon);// 向任务栏的状态栏发送添加托盘图标的消息


对于IDR_MAINFRAME,在资源视图中可以找到

退出时删除图标


void CTRAYTESTDlg::OnDestroy()

{

    // TODO: 在此处添加消息处理程序代码

    CDialog::OnDestroy();

    Shell_NotifyIcon(NIM_DELETE, &m_stNotifyIcon);// 向任务栏的状态栏发送删除托盘图标的消息

}

可以看到系统产生了托盘图标

如果为托盘图标添加点击事件?使点击 托盘图标能够显示/隐藏窗口?

在头文件中加入自定义消息


#define WM_ONTRAY (WM_USER + 100)

定义和实现自定义消息处理函数


protected:

    afx_msg LRESULT OnTray(WPARAM wParam, LPARAM lParam);



LRESULT CTRAYTESTDlg::OnTray(WPARAM wParam, LPARAM lParam) {

    UINT uMouseMsg = (UINT)lParam;

    switch (uMouseMsg)

    {

    case WM_LBUTTONDOWN:

        if (this->IsWindowVisible())

        {

            this->ShowWindow(false);

        }else{

            this->ShowWindow(true);

        }

        break;

    }

    return 0;

}

建立消息映射


BEGIN_MESSAGE_MAP(CTRAYTESTDlg, CDialog)

    ON_WM_SYSCOMMAND()

    ON_WM_PAINT()

    ON_WM_QUERYDRAGICON()

    ON_MESSAGE(WM_ONTRAY, OnTray)//自定义消息映射

    //}}AFX_MSG_MAP

    ON_WM_CLOSE()

END_MESSAGE_MAP()

设置托盘图标回调消息


m_stNotifyIcon.uCallbackMessage = WM_ONTRAY;//自定义的消息

效果

如何向托盘添加右键菜单?首先在资源视图中新建菜单资源

定义菜单


CMenu m_menu;

在oninitdialog中加载菜单


m_menu.LoadMenu(IDR_MENU1);

在托盘点击响应函数中弹出菜单




LRESULT CTRAYTESTDlg::OnTray(WPARAM wParam, LPARAM lParam) {

    UINT uMouseMsg = (UINT)lParam;

    switch (uMouseMsg)

    {

    ...

    case WM_RBUTTONDOWN:

        CMenu* pPopup = m_menu.GetSubMenu(0);

        CPoint point;

        GetCursorPos(&point);

        pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_VERTICAL,point.x, point.y, AfxGetApp()->m_pMainWnd, TPM_LEFTALIGN);

        break;

    }

    return 0;

}

为菜单添加点击事件处理程序


protected:

    afx_msg void show_about_dlg();

    afx_msg void to_close();

void CTRAYTESTDlg::show_about_dlg(){

    CAboutDlg about;

    about.DoModal();

}

void CTRAYTESTDlg::to_close(){

    SendMessage(WM_CLOSE,0,0);

}

建立消息映射


BEGIN_MESSAGE_MAP(CTRAYTESTDlg, CDialog)

    ...

    ON_COMMAND(ID__32771, show_about_dlg)

    ON_COMMAND(ID__32772, to_close)

    //}}AFX_MSG_MAP

    ON_WM_CLOSE()

END_MESSAGE_MAP()

效果