托盘程序开发

托盘程序

OninitDialog()

在主界面的OninitDialog()函数里添加代码


BOOL CMFC07trayiconDlg::OnInitDialog()
{

    // TODO: 在此添加额外的初始化代码
    NOTIFYICONDATA m_tnid;

    m_tnid.cbSize = sizeof(NOTIFYICONDATA);//设置结构大小// 
    m_tnid.hWnd = this->m_hWnd;//设置图标对应的窗口 
    m_tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;//图标属性 
    m_tnid.uCallbackMessage = WM_ICON_NOTIFY;//应用程序定义的回调消息ID

    CString szToolTip;
    szToolTip = _T("INeed 客户端程序");
    _tcscpy_s(m_tnid.szTip, szToolTip);//帮助信息 
    m_tnid.uID = IDR_MAINFRAME;//应用程序图标  
    m_tnid.hIcon = m_hIcon;//图标句柄 
    PNOTIFYICONDATA m_ptnid = &m_tnid;
    ::Shell_NotifyIcon(NIM_ADD, m_ptnid);//增加图标到系统盘


}

定义一个自定义的消息。代码放在主界面【.CPP】文件顶部。

#define     WM_ICON_NOTIFY  WM_USER+100

关闭程序后自动关闭托盘

在主界面对话框中的【属性】-【消息】选项卡里的【WM_CLOSE】添加一OnClose()函数,在程序关闭后,关闭托盘。


void CMFC07trayiconDlg::OnClose()
{

    // TODO: Add your message handler code here and/or call default

    NOTIFYICONDATA   nd = { 0 };
    nd.cbSize = sizeof(NOTIFYICONDATA);
    nd.hWnd = m_hWnd;
    nd.uID = IDR_MAINFRAME;
    nd.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
    nd.uCallbackMessage = WM_ICON_NOTIFY;
    nd.hIcon = m_hIcon;
    Shell_NotifyIcon(NIM_DELETE, &nd);
    
    CDialogEx::OnClose();
}

托盘最小化支持

在【属性】-【Minimize Box】设置为【True】。设置为支持最小化按钮。

在OnSyscommand()函数里,在最后的位置加入

    if(nID == SC_MINIMIZE)
    {
        ShowWindow(FALSE); //隐藏窗口
    }

OnSysCommand()代码。

void CMFC07trayiconDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {
        CDialogEx::OnSysCommand(nID, lParam);
    }
    if (nID == SC_MINIMIZE)
    {
        ShowWindow(FALSE); //隐藏窗口
    }
}

定义消息,托盘菜单实现

在MFC主界面的CPP文件代码里找到【BEGIN_MESSAGE_MAP(CMFC07trayiconDlg, CDialogEx)】这个宏,往里面添加【ON_MESSAGE(WM_ICON_NOTIFY, OnTrayNotification)】,实现之前自定义消息的宏。

BEGIN_MESSAGE_MAP(CMFC07trayiconDlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_WM_CLOSE()
    ON_MESSAGE(WM_ICON_NOTIFY, OnTrayNotification)  // 添加的代码
END_MESSAGE_MAP()

在主界面的【.h】文件里声明函数OnTrayNotification()

LRESULT OnTrayNotification(WPARAM wParam, LPARAM lParam);

定义代码:

响应鼠标的左键和右键消息。

LRESULT CMFC07trayiconDlg::OnTrayNotification(WPARAM wParam, LPARAM lParam)
{
    switch (lParam)
    {
    case WM_LBUTTONDOWN:
    {
        AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOWNORMAL);
        SetForegroundWindow();
        break;
    }
    case WM_RBUTTONUP:
    {
        POINT point;
        HMENU hMenu, hSubMenu;
        GetCursorPos(&point); //鼠标位置
        hMenu = LoadMenu(NULL,
            MAKEINTRESOURCE(IDR_MENU_TRAY)); // 加载菜单
        hSubMenu = GetSubMenu(hMenu, 0);//得到子菜单(因为弹出式菜单是子菜单)
        SetForegroundWindow(); // 激活窗口并置前

        TrackPopupMenu(hSubMenu, 0,
            point.x, point.y, 0, m_hWnd, NULL);

    }
    }
    return LRESULT();
}

IDR_MENU_TRAY是加载了一个菜单,所以要自己自定义【恢复 ID_TRAY_RESTORE】、【退出 ID_TRAY_EXIT】

【恢复 ID_TRAY_RESTORE】,OnTrayRestore()

void CmyfirstmfcDlg::OnTrayRestore()
{
    AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOWNORMAL);
    SetForegroundWindow();
}

【退出 ID_TRAY_EXIT】,OnTrayExit()


void CMFC07trayiconDlg::OnTrayExit()
{
    // TODO: 在此添加命令处理程序代码
    OnClose();
}
上一篇:java 计算两个 日期时间 相间隔多少天小时分钟 等


下一篇:PAT Advanced 1043 Is It a Binary Search Tree (25) [⼆叉查找树BST]