博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
托盘程序开发
阅读量:4337 次
发布时间:2019-06-07

本文共 3132 字,大约阅读时间需要 10 分钟。

托盘程序

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();}

转载于:https://www.cnblogs.com/17bdw/p/10354679.html

你可能感兴趣的文章
Android 关于悬浮窗权限的问题
查看>>
如何使用mysql
查看>>
linux下wc命令详解
查看>>
敏捷开发中软件测试团队的职责和产出是什么?
查看>>
在mvc3中使用ffmpeg对上传视频进行截图和转换格式
查看>>
python的字符串内建函数
查看>>
Spring - DI
查看>>
微软自己的官网介绍 SSL 参数相关
查看>>
Composite UI Application Block (CAB) 概念和术语
查看>>
ajax跨域,携带cookie
查看>>
阶段3 2.Spring_01.Spring框架简介_03.spring概述
查看>>
阶段3 2.Spring_02.程序间耦合_1 编写jdbc的工程代码用于分析程序的耦合
查看>>
阶段3 2.Spring_01.Spring框架简介_04.spring发展历程
查看>>
阶段3 2.Spring_02.程序间耦合_3 程序的耦合和解耦的思路分析1
查看>>
阶段3 2.Spring_02.程序间耦合_5 编写工厂类和配置文件
查看>>
阶段3 2.Spring_01.Spring框架简介_05.spring的优势
查看>>
阶段3 2.Spring_02.程序间耦合_7 分析工厂模式中的问题并改造
查看>>
阶段3 2.Spring_02.程序间耦合_4 曾经代码中的问题分析
查看>>
阶段3 2.Spring_03.Spring的 IOC 和 DI_2 spring中的Ioc前期准备
查看>>
阶段3 2.Spring_03.Spring的 IOC 和 DI_4 ApplicationContext的三个实现类
查看>>