VC单文档对话框添加托盘图标

一 单文档添加托盘

1. 在CMainFrame中定义NOTIFYICONDATA结构m_notify

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

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;
    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 0;
}

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;

  

  

时间: 2024-08-22 22:21:48

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

VC 单文档视图分割

http://blog.csdn.net/smartwhitehorse/article/details/6707183 主要使用类:CSplitterWnd 问题:分割线的固定,需要重写CSplitterWnd CSplitterWnd参数详解 http://www.cnblogs.com/LaplaceDemon/archive/2009/11/18/1605411.html

MFC学习(七) 单文档程序

1 MFC单文档程序的主要类 (1)文档类(Document) 即应用程序处理的数据对象,文档一般从 MFC 中 CDocument 中派生.CDocument 类用于相应数据文件的读取以及存储 Cview 类所需要观察和处理的信息. (2)视类(View) 视相当于文档在应用程序中的观察窗口,它确定了用户对文档的观察方式和用户编辑文档的方式.对于图形来说视就好比我们进行绘图工作的画布,对图形的操作都是在视上进行的.另外,视类中有一个重要的成员函数 OnDraw() 函数.重载的 OnDraw(

【VC编程技巧】窗体?3.5对单文档或者多文档程序制作启动画面

(一)概要: 文章描述了怎样通过Visual C++ 2012或者Visual C++ .NET,为单文档或者多文档程序制作启动画面.在Microsoft Visual Studio 6.0中对于单文档程序(SDI)我们可以很方便利用微软提供的组件Visual C++ Component (Splash Screen).因为在Microsoft Visual Studio 6.0以后的版本或者Visual C++ .NET没有提供这个组件,我们可以通过自定义对话框来实现Splash Screen

在单文档中显示我的第一个对话框

在单文档中显示我的第一个对话框 (2010-04-19 21:19:50) 转载▼ 标签: it   今天编写了在单文档中创建对话框以及调用对话框的代码,收获很多: 1:OnInitDialog函数的加载问题尤其是在VS上的加载:(这一点花了很长时间才查到资料) OnInitDialog()函数是个virtual(虚函数),在它的类中用添加虚 函数的方法,会发现添加的虚函数里面没有这个函数,而这个 OnInitDialog函数是很有用的,在一般的添加进去的对话框的类中 是不会有这个函数的,必须手

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

用VC++MFC做文本编辑器(单文档模式) 原来做过一个用对话框实现的文本编辑器,其实用MFC模板里面的单文档模板也可以做,甚至更加方便,适合入门级的爱好者试试,现介绍方法如下: < xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" /> 1,首先新建一个工程,选择MFC AppWizard(exe),定名字为:textview_1,程序类型选择单个文档,其他均默

VC项目开发之单文档多视图实现-非分割窗口[转]

k_eckel:http://www.mscenter.edu.cn/blog/k_eckel 多视图是VC开发中经常要用到的技术之一,一般地实现单文档多视图有两种方式 1)通过视图分割的技术(使用CSplitterWnd实现),将窗口分割为多个部分,每个部分显示各自显示不同的视图,这种技术实现起来比较简单,并且相关的资料也很多. 2)通过一个文档关联多个视图,窗口显示整个视图. 第二种实现较第一种复杂,这里给出详细的实现方法. Step 1:使用VC 6.0新建一个Project,命名为:Mu

MFC单文档下使用非模态对话框

由于自己写的程序是自动获取桌面实时图像,所以用模态对话框导致程序出错,目前粗鄙的理解是模态对话框会让对话框所在线程暂停,当关闭对话框后才能继续操作,而非模态对话框可以不必让程序暂停. 下面记录非模态对话框的创建过程: 1 在单文档中新建一个对话框资源并生成对话框类 CRadiusDlg 2 在视图类C**view.cpp中添加对话框的头文件,并添加一个对话框类的指针变量CRadiusDlg *pModalessDlg; 3 在菜单栏添加一个用于显示对话框的菜单项,并在响应事件处,添加事件处理代码

MFC程序如何区分是单文档、多文档、对话框程序

在InitInstance函数里: pDocTemplate = new CSingleDocTemplate,则是单文档: pDocTemplate = new CMultiDocTemplate,则是多文档: 如果都没有,则是对话框的

基于MFC的单文档,多文档,对话框应用程序

从类的角度区分: 基于对话框(3个类): CAboutDlg 程序名App 程序名Dlg 单文档(5个类): CAboutDlg CMainFrame 程序名App 程序名Doc 程序名View 多文档(6个类): CAboutDlg CMainFrame 程序名App 程序名Doc 程序名View CChildFrame ------------------------------------------------------------------------------- 多文档 CAb