MFC实现NotifyIcon托盘应用程序

/*参考别人的做了细微修改*/

类似于QQ的托盘程序编写

1.首先我们新建一个MFC程序,在对话框Dlg类中添加一个NOTIFYICONDATA类型对象

NOTIFYICONDATA m_nid;  

2.在stdafx.h头文件中定义一个自定义消息

#define WM_SYSTEMTRAY WM_USER+1001  

3.在Dlg类中中定义一个线程函数

static DWORD WINAPI NotifyIconProc(LPVOID lpParameter);//呵呵,有人会问了这里的线程函数为什么是静态的呢??大家先思考一下!

4.在Dlg的OnInitDialog()代码中输入以下代码:

HICON m_hicon = ::LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));//加载一个托盘图标
	m_nid.cbSize = sizeof(NOTIFYICONDATA);
	m_nid.hWnd = m_hWnd;                          //指定窗口句柄
	m_nid.uID = IDR_MAINFRAME;
	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("我的托盘"));           //添加气泡提示
	::Shell_NotifyIcon(NIM_ADD, &m_nid);          //在托盘区添加图标
	HANDLE hNotifyTherad = CreateThread(NULL, 0, NotifyIconProc, (LPVOID)&m_nid, 0, NULL);//创建一个线程来更新托盘图标
	CloseHandle(hNotifyTherad);

5.在线程里面处理托盘图标切换

DWORD WINAPI CMFCApplication1Dlg::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;
}

6.处理自定义消息和实现托盘菜单(托盘的产生一般是在最小化的时候,有的程序一启动也产生托盘图标,看程序的需要)

首先我们重写一下WindowProc函数,然后在WindowProc函数里面处理我们的托盘消息:

LRESULT CMFCApplication1Dlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	// TODO:  在此添加专用代码和/或调用基类
	switch (message)
	{
	case WM_SYSCOMMAND:
		if (wParam == SC_MINIMIZE)
		{
			CMFCApplication1Dlg *dlg = (CMFCApplication1Dlg*)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 != IDR_MAINFRAME)
		    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.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x, lpoint->y, this);// 确定弹出式菜单的位置

				HMENU hmenu = menu.Detach();
				menu.DestroyMenu();// 资源回收
				delete lpoint;// 资源回收

				Shell_NotifyIcon(NIM_DELETE, &m_nid);//关闭软件时卸载托盘图标
				break;
		    }
		    case WM_LBUTTONDBLCLK://双击左键的处理
		    {
				this->ShowWindow(SW_SHOW);//简单的显示主窗口完事儿
				break;
		    }
	    	case WM_LBUTTONDOWN://单击左键的处理
		    {
			    this->ShowWindow(SW_SHOW);//简单的显示主窗口完事儿
			    break;
			}
		}
	}
		break;
	}
	return CDialogEx::WindowProc(message, wParam, lParam);
}

*****************************************欢迎提出BUG**********************************************

时间: 2024-10-29 21:37:14

MFC实现NotifyIcon托盘应用程序的相关文章

API、Win32 SDK、Win32项目、MFC、Windows窗体应用程序的区别

[原]API.Win32 SDK.Win32项目.MFC.Windows窗体应用程序的区别 首先来看一下每一个术语的定义: API:Application Programming Interface.Windows操作系统提供给应用程序编程的接口, 简称 为API函数. Win32 SDK:SDK(Software Development Kit)中文是软件开发包.则Win32 SDK是Windows 32位平台下的软件开发包,包括了API函数.帮助文档.微软 提供的一些辅助开发工具. Win3

MFC发布 release 版应用程序

问题:VS2010 c++编写的程序在别人的机子运行不了,缺少mfc100u.dll xxx100d.dll等的解决方法 解决方法: 将这些dll打包,和应用程序一起发布; 采用MFC静态编译; 附1:VS2010中静态编译设置方法 使用VS2010编译的程序在windows xp中运行时 经常会出现找不到 相关的DLL文件,我们可以使用静态编译的方法把这些运行依赖文件打包到*.exe中来,以减少对环境的依赖. 一般可以配置一下两项: 项目 -> 配置属性->常规->MFC的使用 :在静

VC++ MFC中如何将应用程序的配置信息保存到注册表中(一)

注册表(Registry,繁体中文版Windows称之为登录档)是Microsoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息.比如我们打开一个记事本,调整其窗口大小,使用完毕后关闭记事本,下次打开时大小和上次关闭前的大小和在屏幕上的位置是相同.这些位置和大小信息就是在记事本关闭时保存到注册表中,下次打开时我们从注册表中取出这些数据,并按照这些数据显示记事本程序的大小和位置信息. 下面教你如何使用GetProfileInt,WriteProfileInt,GetPro

MFC CButtonST 在你的程序中如何使用CButtonST类

http://www.vckbase.com/module/articleContent.php?id=1135 首先在你的工程中加入如下文件: 1 2 BtnST.h BtnST.cpp 从v3.5版本开始,CButtonST支持使用BCMenu类创建菜单.为了能够使用BCMenu,你必须在 BtnST.h中加入下面二行: 1 2 #define BTNST_USE_BCMENU #include "BCMenu.h" 当然,你也必须在你的工程文件中加入下面的头文件: 1 2 BCM

MFC多文档应用程序常用知识点

1.修改左上角圆形按图标.可以将要显示的图标放在资源中加载,也可以将图标文件放在程序目录下加载. CRect rt1; m_wndRibbonBar.GetClientRect(&rt1); CMFCRibbonApplicationButton * pAppButton = m_wndRibbonBar.GetApplicationButton(); HBITMAP hBitmap = (HBITMAP)::LoadImage(NULL, CScale3DCGlobal::GetAppllic

C# NotifyIcon添加系统托盘

要求: 1 程序启动时,无系统托盘 2 程序最小化时,显示托盘,且程序隐藏 3 双击系统托盘,显示主界面,托盘隐藏 4 系统托盘右键,点击显示和退出按钮,主程序显示和退出 代码; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; usin

玩转VC++系统托盘程序(WIN8)

 WINDOWS系统托盘是一个特殊区域,通常在桌面的右下角,也就是任务栏的右边.系统常驻在托盘的程序有时钟,音量控制,输入法,网络状态等.第三方应用如QQ程序也是一个典型的托盘程序,当最小化时企鹅会乖乖的待在屏幕右下角等待主人的呼唤. 系统托盘的方便之处在于,程序在暂时不用时,将它放到托盘里,随用随叫,不必将其关闭.而QQ在接收到消息后,也会在托盘中闪动提示,十分人性化. 那么如何用VC++来开发托盘程序呢?下面会用一个例子来玩转WINDOWS托盘程序. 首先,定义一下需要的功能.(需求确定

如何看MFC程序

一直以来  我都一个疑惑 如果看懂别人的MFC 程序. 今日忽然略有小悟. Q:MFC是啥? A:MFC是类库.. ************* Q :MFC 啥玩意类库? A;MFC 是封装API的类库 ×××××××× Q:MFC的导火索是啥? A:TheAPP ××××××××××××××××××××××× 以上是背景信息. 所以看懂程序第一步: 熟悉MFC类的架构  MFC家族的七大姑八大姨 要门清,谁是谁的儿子  ? 谁的谁的孙子? 谁是谁的远方表哥?这都要清楚. MFC就像一个大家庭,

MFC小程序------01 代码管理器

1.代码入库: 2.代码查找: 3.查看所有代码: 4.程序设置: 自己学习MFC写的一个小程序,其中还有许多功能还待完善,比如数据库的导入功能还没有写,但导出功能是可以用的,查找算法也不是很好,还是代码编辑框中的语言关键字应该是高亮显示的,但也还没有解决.明天考完就放假了,先记到这里,之后再继续完善该程序. 下面是程序的免费下载地址:只有.exe文件和.db数据库,不包含源码,其中数据库中含有大部分的源码可供参考: http://download.csdn.net/detail/lp31001