一 单文档添加托盘

1. 在CMainFrame中定义NOTIFYICONDATA结构m_notify

2.在OnCreate中添加托盘初始化代码

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -)
return -;
m_notify.cbSize = sizeof(NOTIFYICONDATA);//结构体大小
m_notify.hWnd = m_hWnd;//对应窗口
m_notify.uID = IDR_MAINFRAME;//托盘id
m_notify.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));//图标
strcpy(m_notify.szTip, "欢乐斗地主");//鼠标移动到托盘时的提示字符
m_notify.uCallbackMessage = WM_USER_NOTIFYICON;//处理消息
m_notify.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; //有效标志
Shell_NotifyIcon(NIM_ADD, &m_notify);//添加托盘
return ;
}

3.在头文件中添加宏定义#define WM_USER_NOTIFYICON (WM_USER + 1),这是个自定义的消息,用来处理托盘的响应

#define WM_USER_NOTIFYICON WM_USER+1

4.在CMainFrame.h定义消息的处理函数

class CMainFrame : public CFrameWnd
{
protected:
afx_msg LRESULT OnNotifyMsg(WPARAM wparam, LPARAM lparam);
}

5.在CMainFrame.cpp中实现消息函数

添加消息映射:

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_WM_CREATE()
ON_WM_NCHITTEST()
ON_WM_DESTROY()
ON_MESSAGE(WM_USER_NOTIFYICON, OnNotifyMsg)
END_MESSAGE_MAP()

函数实现:

LRESULT  CMainFrame::OnNotifyMsg(WPARAM wparam, LPARAM lparam)
{
//wParam接收的是图标的ID,而lParam接收的是鼠标的行为
if (wparam != IDR_MAINFRAME) return 1;
switch (lparam)
{
case WM_RBUTTONUP://右键起来时弹出快捷菜单,这里只有一个关闭
{
CPoint pos;
CMenu menu;          //代码添加一个响应菜单
::GetCursorPos(&pos);
menu.CreatePopupMenu();//声明一个弹出式菜单
menu.AppendMenu(MF_STRING, WM_USER_EXIT, "关闭");
menu.TrackPopupMenu(TPM_LEFTALIGN, pos.x, pos.y, this);
menu.Detach();
menu.DestroyMenu();
/*
         //从资源文件中添加一个响应菜单
GetCursorPos(&pos);
menu.LoadMenu(IDR_MENU1);
SetForegroundWindow();//放置在前面
CMenu* pmenu; //定义右键菜单指针
pmenu = menu.GetSubMenu(0); //该函数取得被指定菜单激活的下拉式菜单或子菜单的句柄
ASSERT(pmenu != NULL);
pmenu->TrackPopupMenu(TPM_RIGHTBUTTON | TPM_LEFTALIGN, pos.x, pos.y, this); //在指定位置显示右键快捷菜单
pmenu->Detach();
pmenu->DestroyMenu();
*/
}
break;
case WM_LBUTTONDBLCLK://双击左键的处理
{
if (IsWindowVisible())
{
ShowWindow(SW_HIDE);
}
else
{
ShowWindow(SW_SHOW);
}
}
break;
}
return 0;
}

6.如果是代码添加一个响应菜单,需要自己定义一个菜单响应的消息

#define WM_USER_EXIT	WM_USER + 101

可以和上面定义的WM_USER_NOTIFYICON消息放在一起,

然后声明和实现 WM_USER_EXIT 消息的响应函数

class CMainFrame : public CFrameWnd
{
public:
afx_msg void OnMenuExit();
}

消息映射

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_WM_CREATE()
ON_WM_NCHITTEST()
ON_WM_DESTROY()
ON_MESSAGE(WM_USER_NOTIFYICON, OnNotifyMsg)
ON_COMMAND(WM_USER_EXIT, OnMenuExit) //主意这里ON_COMMAND
END_MESSAGE_MAP()

响应函数实现

void CMainFrame::OnMenuExit()
{
OnClose();//程序退出
}

7.如果是从资源文件中添加一个弹出菜单,建立菜单如下

并且右键关闭添加响应函数

最后在onClose中添加关闭的代码

void CMainFrame::OnCloseWindow()
{
//程序退出
OnClose();
}

8.至此,单文档的托盘程序已经完成,其实从资源中加载菜单和代码生成菜单的原理是一样的,随便取一种就可以了,但是代码添加菜单一定要添加菜单的响应消息,不然菜单不可点击.

一 对话框添加托盘

1.代码是一样的,在CDlg.cpp 中的OnInitDialog函数中初始化托盘结构,并添加响应函数

2.值得注意的是右键菜单可以直接发送WM_DESTROY消息,代码如下

			LPPOINT lpoint=new tagPOINT;
::GetCursorPos(lpoint);
CMenu menu;
menu.CreatePopupMenu();//声明一个弹出式菜单
menu.AppendMenu(MF_STRING,WM_DESTROY,L"关闭");
menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);
HMENU hmenu=menu.Detach();
menu.DestroyMenu();
delete lpoint;

  

  

VC单文档对话框添加托盘图标的更多相关文章

  1. MFC单文档程序添加HTML帮助支持

    1.在App类 构造函数中添加 EnableHtmlHelp(); 2.在Frame类中,添加消息影射: ON_COMMAND(ID_HELP_FINDER, CFrameWnd::OnHelpFin ...

  2. VC 单文档视图分割

    http://blog.csdn.net/smartwhitehorse/article/details/6707183 主要使用类:CSplitterWnd 问题:分割线的固定,需要重写CSplit ...

  3. VC++单文档程序固定菜单栏和工具栏

    MainFrm.cpp框架类下,找到OnCreate方法 m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY); m_wndToolBar.EnableDocking( ...

  4. MFC学习(七) 单文档程序

    1 MFC单文档程序的主要类 (1)文档类(Document) 即应用程序处理的数据对象,文档一般从 MFC 中 CDocument 中派生.CDocument 类用于相应数据文件的读取以及存储 Cv ...

  5. 多线程串口编程工具CserialPort类(附VC基于MFC单文档协议通讯源程序及详细编程步骤)

    老有人觉得MSComm通讯控件很土,更有人大声疾呼:忘了它吧.确实当我们对串口编程有了一定的了解后,应该用API函数写一个属于自己的串口程序,由于编程者对程序了解,对程序修改自如.但我一直没有停止过用 ...

  6. 用VC++MFC做文本编辑器(单文档模式)

    用VC++MFC做文本编辑器(单文档模式) 原来做过一个用对话框实现的文本编辑器,其实用MFC模板里面的单文档模板也可以做,甚至更加方便,适合入门级的爱好者试试,现介绍方法如下: < xmlna ...

  7. MFC单文档自定义扩展名及添加图标报Assertion错误

    忽然无聊的想给自己写的程序保存的文件使用自己的名字简写作为后缀,于是有了下文. IDR_MAINFRAME格式介绍 IDR_MAINFRAME字符串资源中包含7个子串,分别以/n结束,即如下格式: & ...

  8. VC++ MFC单文档应用程序SDI下调用glGenBuffersARB(1, &pbo)方法编译通过但执行时出错原因分析及解决办法:glewInit()初始化的错误

    1.问题症状 在VC++环境下,利用MFC单文档应用程序SDI下开发OpenGL程序,当调用glGenBuffersARB(1, &pbo)方法编译通过但执行时出错,出错代码如下: OpenG ...

  9. VC基于单文档OpenGL框架

    本文是在VC6.0的环境下,运用MFC实现的OpenGL最基本框架,需要简单了解MFC编程(会在VC6.0里创建MFC单文档应用程序就行),甚至不必了解OpenGL的知识.以下是具体的步骤. 1.创建 ...

随机推荐

  1. D3.js 选择元素和绑定数据/使用数据

    选择元素和绑定数据是 D3 最基础的内容,本文将对其进行一个简单的介绍. 一.如何选择元素 在 D3 中,用于选择元素的函数有两个: d3.select():是选择所有指定元素的第一个 d3.sele ...

  2. 使用RestTemplate Spring安全认证

    使用RestTemplate Spring安全认证 java spring 认证authentication 安全spring-security 我有提供2个独立的一整套服务2 Spring的web应 ...

  3. 理解 Linux shell 中的一个方言:2>&1

    理解 Linux shell 中的一个方言:2>&1  2016-11-14 杜亦舒 前言 在使用 linux 命令或者 shell 编程时,这个用法常会遇到 2>&1 如 ...

  4. kafka常用操作命令

    1.启动Kafka,其中">>/dev/null"表示将日志信息输出到"黑洞",其中"2>&1"表示将错误信息和前 ...

  5. 栈 - 从零开始实现by C++

    参考链接:数据结构探险-栈篇 学了队列之后,栈就很简单了,换汤不换药.   栈 栈的模型 后进先出(电梯,进制转换,括号的匹配检测)   栈的基本元素 栈顶,栈底(一般很少用到),栈容量,栈长度 注意 ...

  6. 第三章 Python容器:列表、元组、字典与集合

      数据结构的分类依据?基本的"数组"在python中是列表, 数据结构的作用?容器,盛放数据,是由原子组成的分子.可以将一群数据进行整合.拆分.重排. 3.2 列表 列表是啥?顺 ...

  7. iOS蓝牙4.0开发(BLE)

    智能设备 和 app 通过 BLE通讯的两种模型 模型一:设备提供数据,app 展示数据: 比如小米手环 模型二:app提供数据,设备接收: 模型与corebluetooth的对应关系: 模型一:智能 ...

  8. 开源HTML5 Canvas游戏Runtime发布

    Cantk-Runtime是通用的HTML5 Canvas 2D游戏引擎运行库,让HTML5游戏的性能飞起来.Cantk-Runtime以PhoneGap插件的方式提供,从此结束PhoneGap低性能 ...

  9. 例题:超市买东西的程序。输入商品信息,计算价格,价格满多少元打折。这道题用到结构体,集合,for循环,if else语句

    知识要点: 集合和数组的区别:数组是连续的,同一类型的一块区域,而集合可以是不连续的,多种数据类型的. 集合属性:.count 方法:.Add()  将对象添加到ArrayList中实际包含的元素数 ...

  10. linux笔记:用户管理命令和用户组管理命令

    用户管理命令 命令名称:useradd功能:添加用户(添加完后不能立即使用,必须用passwd修改用户密码后才能使用)用法:useradd [选项] 用户名选项参数:-u 手工指定用户的UID-d 手 ...