托盘程序 右击菜单中“关闭”不响应

来源:百度知道 编辑:UC知道 时间:2024/06/13 23:36:45
托盘编程例子

1、将程序最小化到系统托盘区的函数toTray()。

void CTimeWakeDlg::toTray()
{
NOTIFYICONDATA nid;
nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);
nid.hWnd=this->m_hWnd;
nid.uID=IDR_MAINFRAME;
nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;
nid.uCallbackMessage=WM_SHOWTASK;//自定义的消息名称
nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(nid.szTip,"计划任务提醒"); //信息提示条为“计划任务提醒”
Shell_NotifyIcon(NIM_ADD,&nid); //在托盘区添加图标
ShowWindow(SW_HIDE); //隐藏主窗口
}

这是个很简单的函数,里面首先给NOTIFYICONDATA赋值,然后调用shell_NotifyIcon, 头一个参数是NIM_ADD,表示添加。然后用函数ShowWindow 隐藏主窗口,这样,就实现了将程序最小化到系统托盘区的任务了。

2、程序已经最小化到托盘区了,但是对托盘图标的操作如何进行呢?这就体现了结构NOTIFYICONDATA的成员uCallbackMessage 的作用了。它所提供的作用就是,当用户用鼠标点击托盘区的图标的时候(无论是左键还是右键),会向hWnd所代表的窗口传送消息.
如上例,我们自定义了消息WM_SHOWTASK。根据VC的消息机制,对自定义消息增加消息响应函数.

在*Dlg.cpp文件上面定义一个用户消息:
#define WM_SHOWTASK (WM_USER + 1986)

在头文件的//{{AFX_MS

没有声明OnDlgDestroy函数,

1、你自定义一个ID,比如0x40000,然后做映射。
menu.AppendMenu(MF_STRING,0x40000,"关闭");

在消息映射部分做ON_COMMAND(0x40000,OnDlgDestroy)

...

void CYourdlg::OnDlgDestroy()
{
PostMessage(WM_CLOSE);
}

2、设断点调试一下,是否到了OnDestroy处。