VisualStudio2022 MFC对话框窗体托盘图标设计

article/2025/9/5 9:47:18

目录

    • 效果展示
    • 头文件
      • 1.1 头文件声明
    • CPP文件
      • 2.1 初始化
      • 2.2 功能实现


环境:VisualStudio2022
框架: MFC 对话框窗体
功能:托盘
对话框类:CBLToolsDlg
作者:CDamogu
时间:20220308


效果展示

在这里插入图片描述

头文件

1.1 头文件声明

头文件声明如下:

//最小化图表到托盘
public:#define  WM_SYSTEMTRAY WM_USER+1001				//最小化图表到托盘用到NOTIFYICONDATA m_nid;static DWORD WINAPI NotifyIconProc(LPVOID lpParameter);virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);afx_msg void OnDestroy();

CPP文件

2.1 初始化

	// TODO: Add your message handler code here and/or call defaultHICON m_hicon = ::LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON_M));//[大蘑菇Mark][BEGIN]加载一个托盘图标  m_nid.cbSize = sizeof(NOTIFYICONDATA);m_nid.hWnd = m_hWnd;                              //指定窗口句柄  m_nid.uID = IDI_ICON_M;m_nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;  //指定有效成员  m_nid.uCallbackMessage = WM_SYSTEMTRAY;           //自定义消息  m_nid.hIcon = m_hicon;                            //指定托盘图标  wcscpy_s(m_nid.szTip, _T("[MushroomerV1.00]"));  //添加气泡提示  ::Shell_NotifyIcon(NIM_ADD, &m_nid);              //在托盘区添加图标   //HANDLE hNotifyTherad = CreateThread(NULL, 0, NotifyIconProc, (LPVOID)&m_nid, 0, NULL);//创建一个线程来更新托盘图标  //CloseHandle(hNotifyTherad);														//[大蘑菇Mark][END]//下述功能放在OnClose中可以实现点击X,然后最小化到托盘,并且取消任务栏显示//最小化窗口//ShowWindow(SW_MINIMIZE);//修改风格使得他不在任务栏显示(但是会引起一个问题就说窗体不显示icon)//ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);

2.2 功能实现

/********************************************************************************************************/
/* 功能:WindowProc()				//托盘
/********************************************************************************************************/
LRESULT CBLToolsDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{// TODO:在此添加专用代码和/或调用基类switch (message){case WM_SYSCOMMAND:if (wParam == SC_MINIMIZE){CBLToolsDlg* dlg = (CBLToolsDlg*)AfxGetApp()->GetMainWnd();//获取窗口CWnd指针  HWND hwnd = dlg->m_hWnd;//获取h_hWnd指针  ::ShowWindow(hwnd, 0);//隐藏界面  return TRUE;}if (wParam == SC_RESTORE){}break;case WM_CLOSE:Shell_NotifyIcon(NIM_DELETE, &m_nid);//关闭软件时卸载托盘图标  break;case WM_SYSTEMTRAY:{if (wParam != IDI_ICON_M)return 1;switch (lParam){case WM_RBUTTONUP://右键起来时弹出快捷菜单,这里只有一个"关闭"   {CMenu menu;LPPOINT lpoint = new tagPOINT;::GetCursorPos(lpoint);     // 得到鼠标位置menu.CreatePopupMenu(); // 声明一个弹出式菜单SetForegroundWindow();//如果点击弹出菜单的时候,菜单失去焦点让菜单自动关闭menu.AppendMenu(MF_STRING, WM_DESTROY, _T("设置"));// 增加菜单项"关闭",点击则发送消息WM_DESTROY 给主窗口(已隐藏),将程序结束menu.AppendMenu(MF_STRING, WM_DESTROY, _T("关于"));// 增加菜单项"关闭",点击则发送消息WM_DESTROY 给主窗口(已隐藏),将程序结束menu.AppendMenu(MF_STRING, WM_DESTROY, _T("退出"));// 增加菜单项"关闭",点击则发送消息WM_DESTROY 给主窗口(已隐藏),将程序结束//此类型的菜单需要自定义消息,做消息映射和相关的消息响应函数menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x, lpoint->y, this);// 确定弹出式菜单的位置HMENU hmenu = menu.Detach();menu.DestroyMenu();// 资源回收delete lpoint;// 资源回收break;}case WM_LBUTTONDBLCLK://双击左键的处理   {//修改风格使得他取消不在任务栏显示的模式至正常模式,可以显示iconModifyStyleEx(WS_EX_TOOLWINDOW, WS_EX_APPWINDOW);this->ShowWindow(SW_NORMAL);//简单的显示主窗口完事儿  break;}case WM_LBUTTONDOWN://单击左键的处理{this->ShowWindow(SW_SHOW);//简单的显示主窗口完事儿 break;}}}break;}return CDialogEx::WindowProc(message, wParam, lParam);
}
/********************************************************************************************************/
/* 功能:NotifyIconProc()	托盘图表
/********************************************************************************************************/
DWORD WINAPI CBLToolsDlg::NotifyIconProc(LPVOID lpParameter)
{NOTIFYICONDATA* pnotifyicon = (NOTIFYICONDATA*)lpParameter;//把传递进来的指针转换  /先在工程里面调入几个图标  HICON m_hstateicon_1 = ::LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));//加载4个图标  HICON m_hstateicon_2 = ::LoadIcon(AfxGetInstanceHandle(), NULL);//空图标HICON m_hstateicon_3 = ::LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));HICON m_hstateicon_4 = ::LoadIcon(AfxGetInstanceHandle(), NULL);不断的切换托盘图标  /*初始化线程关闭了图标切换,这边也关闭掉while (true){pnotifyicon->uFlags = NIF_ICON;pnotifyicon->hIcon = m_hstateicon_1;::Shell_NotifyIcon(NIM_MODIFY, pnotifyicon);Sleep(400);//400ms切换一次pnotifyicon->uFlags = NIF_ICON;pnotifyicon->hIcon = m_hstateicon_2;::Shell_NotifyIcon(NIM_MODIFY, pnotifyicon);Sleep(400);//400ms切换一次pnotifyicon->uFlags = NIF_ICON;pnotifyicon->hIcon = m_hstateicon_3;::Shell_NotifyIcon(NIM_MODIFY, pnotifyicon);Sleep(400);//400ms切换一次pnotifyicon->uFlags = NIF_ICON;pnotifyicon->hIcon = m_hstateicon_4;::Shell_NotifyIcon(NIM_MODIFY, pnotifyicon);Sleep(400);//400ms切换一次}*/return 0;
}
/********************************************************************************************************/
/* 功能:OnDestroy()
/********************************************************************************************************/
void CBLToolsDlg::OnDestroy()
{CDialogEx::OnDestroy();// TODO: Add your message handler code hereShell_NotifyIcon(NIM_DELETE, &m_nid);//关闭软件时卸载托盘图标
}

http://chatgpt.dhexx.cn/article/KvH7g78T.shtml

相关文章

MFC界面美化---自绘标题栏

做MFC项目的时候,会经常遇到需要美化界面的时候。mfc的原始界面比较丑,今天主要记录一下对MFC标题栏重绘的过程,最终效果是这样的。 1.因为要对标题栏进行重绘,我们要把MFC的原生标题栏给去掉,在MFC对话框的属性那里&a…

Windows界面编程:MFC

前言 大家之前在学C/C语言时,基本都是通过控制台实现“人机交流”的。但大家每次在写控制台程序时,看到黑框框应该都会有些许不爽吧:“输入输出为什么不能基于图形用户界面而非要使用文本用户界面呢?”事实上,在各个环…

MFC-登录界面(可修改密码)

登录界面的博客有很多,参考了这一篇文章,下面给出链接。 MFC做一个登录界面(用户名,密码以及密码的明文密文切换)_umarutyan的博客-CSDN博客 但这里无法修改密码,下面做出一些补充。 由于用不到数据库&a…

MFC界面工具BCGControlBar入门:如何使用工具栏编辑器

BCGControlBar ("Business Components Gallery ControlBar")是MFC扩展库,使您可以创建具有完全自定义选项(功能区、可自定义工具栏、菜单等)以及一组专业设计的丰富Microsoft Office和Microsoft Visual Studio的应用程序 GUI控件&a…

MFC程序中使用QT开发界面

如果你有一个现成的MFC项目在做维护,但是你厌倦了使用MFC繁琐的操作来做界面美化,或者你需要在这个项目中用到QT里面好用的某些功能;亦或者是你需要使用某些只能在MFC中使用的组件,但是界面这部分已经用QT做好了。那么这篇文章可能…

一、MFC登陆界面

一、新建项目 打开VS2022——>创建新项目——>选择MFC应用,点击下一步——>修改项目名称和位置,点击创建——>修改应用程序类型、项目样式经典菜单选项 二、添加预处理指令 VS建议采用带_s的函数,如scanf_s、strcpy_s&#xff0…

MFC基础知识与课程设计思路

引言 本文致力于提供MFC的相关知识,以方便大家更好地认识MFC的使用方法。介绍将会分为以下几个部分:MFC初始文件的理解、MFC我们所使用的框架理解、MFC的进阶用法、MFC我在使用过程中遇到的问题及解决方法。 MFC初始文件的理解 MFC的初始文件中有两项文…

MFC添加程序关闭时时的提示界面

文章目录 MFC一.简介二.方法 MFC 一.简介 在应用程序退出的时候,不能点击叉直接退出,我们想添加一个退出提示。在点击叉后,弹出是否确定退出的界面,如下面的界面,具体操作往下看 二.方法 找到我们需要操作的主界面…

【MFC】模拟采集系统——界面设计(17)

功能介绍 启动界面 开始采集: PS:不涉及 数据保存,重现等功能 界面设计 界面分为三块:顶部黑条带关闭按钮、左边对话框,右边的主界面 资源: 顶部黑条 top.bmp 2* 29 (宽 * 高 像素点&…

MFC界面设计入门篇

点击C里的MFC再点击MFCApplication,到下面改名字和路径,然后OK 然后点击Next, 选择single document,MFCstandard,简体中文,然后Finish 这时候可以先直接运行,看看工程的样子&#x…

最最简单的几个Mac终端命令

几个简单的Mac终端命令 目录切换相关 cd空格/ 回到根目录cd空格… (或者 cd空格…/) 回到上一级目录cd空格. 回到当前目录pwd 显示从根目录到当前目录的完整目录 vi操作相关 注意:vi操作的文件如果不存在,则先自动创建一个该名字…

Mac 终端基本命令

基本命令 1、列出文件 ls 参数 目录名 例: 看看驱动目录下有什么:ls /System/Library/Extensions 参数 -w 显示中文,-l 详细信息, -a 包括隐藏文件 2、转换目录 cd 例:想到驱动目录下溜达一圈 cd /System/Library/Extension…

10需要知道Mac终端命令

如果你想进入web开发领域,知道什么是终端,如何使用终端是非常有益的。在今天的文章中,我们将介绍Mac终端命令的10个必要知识! 🙂 什么是终端(Terminal) 终端最基本的用途是可以浏览计算机的文…

Mac终端命令

Mac电脑安装程序,打开允许任何来源的方法,在终端执行命令行即可。 打开命令:sudo spctl --master-disable 关闭命令:sudo spctl --master-enable Mac终端打开文件 1.打开文件夹的命令很简单,使用 open 文件夹…

Mac终端命令失效( command not found)/

ls vi vim 输入完来一句command not found xx 心哇凉哇凉的,心态都崩了。 guolianggldeMacBook-Pro ~ % cat zsh: command not found: cat guolianggldeMacBook-Pro ~ % ls zsh: command not found: ls guolianggldeMacBook-Pro ~ % mdfind zsh: command not fo…

MacOS系统终端常用命令大全

MacOS系统终端是使用mac电脑的小伙伴需要或多或少了解的一个应用。熟悉并掌握一些基本的常用命令可以帮助我们快速的解决一些日常问题,提高工作效率,下面让小编带大家了解一下吧! 基本概念 命令的构成:Command Name、Options、Ar…

Mac终端 常用命令

OSX 的文件系统 OSX 采用的Unix文件系统,所有文件都挂在跟目录 / 下面,所以不在要有Windows 下的盘符概念。 你在桌面上看到的硬盘都挂在 /Volumes 下。 比如接上个叫做 USBHD的移动硬盘,桌面上会显示出一个硬盘图标,它实际在哪…

mac 终端 常用命令

文件目录 首先要清楚几个文件目录: " / " :根目录 " ~ " :用户主目录的缩写。例如当前用户为hello,那么" ~ "展开来就是:/Users/hello " . " :当前目录 "…

RANSAC原理及直线拟合(python动态图解)

一、简介 随机采样一致性(Random Sample Consensus,RANSAC)由斯坦福国际研究院的Fischler和Bolles于1981年首次提出[1]。RANSAC算法是一种随机参数估计迭代算法;从一组包含异常数据的样本数据集中,通过迭代的方式&…

RANSAC初识

RANSAC算法:随机抽样一致算法(random sample consensus,RANSAC) 一个简单的例子是从一组观测数据中找出合适的二维直线。假设观测数据中包含局内点和局外点,其中局内点近似的被直线所通过,而局外点远离于直线。简单的…