如何做托盘,高人帮忙,急 我做了一个基于对话框的mfc程序,现在想加一个托盘的实现,具体怎么做,在哪个函数中加,请大家帮帮我,谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在MSDN中查System Tray Balloon Tips and Freeing Resources Quickly in .NET 1.CTMyDlg::CTMyDlg(CWnd* pParent /*=NULL*/) : CDialog(CTMyDlg::IDD, pParent){ //{{AFX_DATA_INIT(CTshutDlg) .... //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 //加载托盘区图标,IDR_MAINFRAME是某一位图 m_nWinVersion = WIN_UNKNOWN; m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}2.处理void CTMyDlg::OnSysCommand(UINT nID, LPARAM lParam){ if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { if(nID == SC_MINIMIZE)//最小化到托盘的函数 OnButtonMinmize();//你自己定义的一个最小化窗体的函数 else if(nID == SC_CLOSE)//单击 X 后退出程序 OnButtonQuit();//自定义的退出程序的函数 else CDialog::OnSysCommand(nID, lParam); }}3.用ClassWizard,添加消息响应:BEGIN_MESSAGE_MAP(CTMyDlg, CDialog)//{{AFX_MSG_MAP(CTMyDlg) ..... ON_MESSAGE(WM_NOTIFYICON,OnWM_NOTIFYICON) //}}AFX_MSG_MAPEND_MESSAGE_MAP()添加函数void CTMyDlg::OnWM_NOTIFYICON(WPARAM wParam,LPARAM lParam){//wParam接收的是图标的ID,而lParam接收的是鼠标的行为 UINT nID = (UINT)wParam; UINT uMouseMsg = (UINT)lParam; switch(uMouseMsg) { case WM_LBUTTONDBLCLK://当双击的时候 ShowWindow(SW_SHOW); BringWindowToTop(); CenterWindow(); break; }}就按以上步骤作一定可以的,祝你好运! 补充:void CTMyDlg::OnButtonMinmize() //用于加载托盘图{ NOTIFYICONDATA nc; nc.cbSize = sizeof(NOTIFYICONDATA); nc.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); nc.hWnd = m_hWnd; //接收托盘消息是主程序窗口 lstrcpy(nc.szTip,"我的程序"); //鼠标停留在托盘图标上时显示的信息 nc.uCallbackMessage = WM_NOTIFYICON; //自定义的消息名称 nc.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; nc.uID = IDC_NOTIFYICON; Shell_NotifyIcon(NIM_ADD, &nc); //在托盘区添加图标 m_bNotifyIconShow = TRUE; ShowWindow(SW_HIDE);}对应退出时void CTMyDlg::OnButtonQuit() { CDialog::OnOK(); //程序退出,从托盘区删除图标 NOTIFYICONDATA nc; nc.cbSize = sizeof(NOTIFYICONDATA); nc.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); nc.hWnd = m_hWnd; nc.uCallbackMessage = WM_NOTIFYICON; nc.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; nc.uID = IDC_NOTIFYICON; Shell_NotifyIcon(NIM_DELETE, &nc);} 我的一个程序里封装的托盘操作类,直接用就行了。[code=c++]// TrayMan.h: interface for the CTrayMan class.////////////////////////////////////////////////////////////////////////#if !defined(AFX_TRAYMAN_H__85DA35DF_B355_471E_B8DB_86E433470EC1__INCLUDED_)#define AFX_TRAYMAN_H__85DA35DF_B355_471E_B8DB_86E433470EC1__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000class CTrayMan {public: CTrayMan(); virtual ~CTrayMan(); CWnd *m_pWnd; void SetWindow(CWnd *pWnd) { ASSERT(pWnd); m_pWnd = pWnd; }; BOOL RegisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage, LPCTSTR lpszTip=NULL); BOOL UnregisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage); BOOL ReregisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage, LPCTSTR lpszTip=NULL); BOOL ModifyIcon(UINT uID, HICON hIcon); BOOL ModifyMessage(UINT uID, UINT uMessage); BOOL ModifyTip(UINT uID, LPCTSTR lpszTip);};#endif // !defined(AFX_TRAYMAN_H__85DA35DF_B355_471E_B8DB_86E433470EC1__INCLUDED_)// TrayMan.cpp: implementation of the CTrayMan class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "StickyNote.h"#include "TrayMan.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CTrayMan::CTrayMan(){}CTrayMan::~CTrayMan(){}BOOL CTrayMan::RegisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage, LPCTSTR lpszTip){ ASSERT(m_pWnd->m_hWnd); NOTIFYICONDATA nfd; nfd.cbSize = sizeof(NOTIFYICONDATA); nfd.hWnd = m_pWnd->m_hWnd; nfd.uID = uID; nfd.uCallbackMessage = uMessage; nfd.hIcon = hIcon; nfd.uFlags = NIF_ICON | NIF_MESSAGE; if (lpszTip) { lstrcpyn(nfd.szTip, lpszTip, 64); nfd.uFlags |= NIF_TIP; } return Shell_NotifyIcon(NIM_ADD, &nfd);}BOOL CTrayMan::UnregisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage){ ASSERT(m_pWnd->m_hWnd); NOTIFYICONDATA nfd; nfd.cbSize = sizeof(NOTIFYICONDATA); nfd.hWnd = m_pWnd->m_hWnd; nfd.uID = uID; nfd.uCallbackMessage = uMessage; nfd.hIcon = hIcon; nfd.uFlags = NIF_ICON | NIF_MESSAGE; return Shell_NotifyIcon(NIM_DELETE, &nfd);}BOOL CTrayMan::ReregisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage, LPCTSTR lpszTip){ UnregisterNotifyIcon(uID, hIcon, uMessage); return RegisterNotifyIcon(uID, hIcon, uMessage, lpszTip);}BOOL CTrayMan::ModifyIcon(UINT uID, HICON hIcon){ ASSERT(m_pWnd->m_hWnd); NOTIFYICONDATA nfd; nfd.cbSize = sizeof(NOTIFYICONDATA); nfd.hWnd = m_pWnd->m_hWnd; nfd.uID = uID; nfd.hIcon = hIcon; nfd.uFlags = NIF_ICON; return Shell_NotifyIcon(NIM_MODIFY, &nfd);}BOOL CTrayMan::ModifyMessage(UINT uID, UINT uMessage){ ASSERT(m_pWnd->m_hWnd); NOTIFYICONDATA nfd; nfd.cbSize = sizeof(NOTIFYICONDATA); nfd.hWnd = m_pWnd->m_hWnd; nfd.uID = uID; nfd.uCallbackMessage = uMessage; nfd.uFlags = NIF_MESSAGE; return Shell_NotifyIcon(NIM_MODIFY, &nfd);}BOOL CTrayMan::ModifyTip(UINT uID, LPCTSTR lpszTip){ ASSERT(m_pWnd->m_hWnd); NOTIFYICONDATA nfd; nfd.cbSize = sizeof(NOTIFYICONDATA); nfd.hWnd = m_pWnd->m_hWnd; nfd.uID = uID; nfd.uFlags = NIF_ICON | NIF_MESSAGE; nfd.szTip[0] = '\0'; if (lpszTip) { lstrcpyn(nfd.szTip, lpszTip, 64); } nfd.uFlags = NIF_TIP; return Shell_NotifyIcon(NIM_MODIFY, &nfd);}[/code] 盖个楼,上个回复代码太难看了。btw: csdn的ubb太不友好了。// TrayMan.h: interface for the CTrayMan class.////////////////////////////////////////////////////////////////////////#if !defined(AFX_TRAYMAN_H__85DA35DF_B355_471E_B8DB_86E433470EC1__INCLUDED_)#define AFX_TRAYMAN_H__85DA35DF_B355_471E_B8DB_86E433470EC1__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000class CTrayMan{public: CTrayMan(); virtual ~CTrayMan(); CWnd *m_pWnd; void SetWindow(CWnd *pWnd) { ASSERT(pWnd); m_pWnd = pWnd; }; BOOL RegisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage, LPCTSTR lpszTip=NULL); BOOL UnregisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage); BOOL ReregisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage, LPCTSTR lpszTip=NULL); BOOL ModifyIcon(UINT uID, HICON hIcon); BOOL ModifyMessage(UINT uID, UINT uMessage); BOOL ModifyTip(UINT uID, LPCTSTR lpszTip);};#endif // !defined(AFX_TRAYMAN_H__85DA35DF_B355_471E_B8DB_86E433470EC1__INCLUDED_)// TrayMan.cpp: implementation of the CTrayMan class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "StickyNote.h"#include "TrayMan.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CTrayMan::CTrayMan(){}CTrayMan::~CTrayMan(){}BOOL CTrayMan::RegisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage, LPCTSTR lpszTip){ ASSERT(m_pWnd->m_hWnd); NOTIFYICONDATA nfd; nfd.cbSize = sizeof(NOTIFYICONDATA); nfd.hWnd = m_pWnd->m_hWnd; nfd.uID = uID; nfd.uCallbackMessage = uMessage; nfd.hIcon = hIcon; nfd.uFlags = NIF_ICON | NIF_MESSAGE; if (lpszTip) { lstrcpyn(nfd.szTip, lpszTip, 64); nfd.uFlags |= NIF_TIP; } return Shell_NotifyIcon(NIM_ADD, &nfd);}BOOL CTrayMan::UnregisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage){ ASSERT(m_pWnd->m_hWnd); NOTIFYICONDATA nfd; nfd.cbSize = sizeof(NOTIFYICONDATA); nfd.hWnd = m_pWnd->m_hWnd; nfd.uID = uID; nfd.uCallbackMessage = uMessage; nfd.hIcon = hIcon; nfd.uFlags = NIF_ICON | NIF_MESSAGE; return Shell_NotifyIcon(NIM_DELETE, &nfd);}BOOL CTrayMan::ReregisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage, LPCTSTR lpszTip){ UnregisterNotifyIcon(uID, hIcon, uMessage); return RegisterNotifyIcon(uID, hIcon, uMessage, lpszTip);}BOOL CTrayMan::ModifyIcon(UINT uID, HICON hIcon){ ASSERT(m_pWnd->m_hWnd); NOTIFYICONDATA nfd; nfd.cbSize = sizeof(NOTIFYICONDATA); nfd.hWnd = m_pWnd->m_hWnd; nfd.uID = uID; nfd.hIcon = hIcon; nfd.uFlags = NIF_ICON; return Shell_NotifyIcon(NIM_MODIFY, &nfd);}BOOL CTrayMan::ModifyMessage(UINT uID, UINT uMessage){ ASSERT(m_pWnd->m_hWnd); NOTIFYICONDATA nfd; nfd.cbSize = sizeof(NOTIFYICONDATA); nfd.hWnd = m_pWnd->m_hWnd; nfd.uID = uID; nfd.uCallbackMessage = uMessage; nfd.uFlags = NIF_MESSAGE; return Shell_NotifyIcon(NIM_MODIFY, &nfd);}BOOL CTrayMan::ModifyTip(UINT uID, LPCTSTR lpszTip){ ASSERT(m_pWnd->m_hWnd); NOTIFYICONDATA nfd; nfd.cbSize = sizeof(NOTIFYICONDATA); nfd.hWnd = m_pWnd->m_hWnd; nfd.uID = uID; nfd.uFlags = NIF_ICON | NIF_MESSAGE; nfd.szTip[0] = '\0'; if (lpszTip) { lstrcpyn(nfd.szTip, lpszTip, 64); } nfd.uFlags = NIF_TIP; return Shell_NotifyIcon(NIM_MODIFY, &nfd);} 使用方法简述,很简,应该能看懂吧?// 窗口类定义中定义常量#define ID_TRAYICON 10001#define WM_TRAYNOTIFY (WM_USER+300)// 窗口类定义总加以下定义CTrayMan m_tray;CMenu m_menu;afx_msg LRESULT OnTrayNotify(WPARAM wParam, LPARAM lParam);// 窗口消息映射里加如下映射ON_MESSAGE(WM_TRAYNOTIFY, OnTrayNotify)// 窗口初始化时执行如下代码m_menu.LoadMenu(IDR_TRAYMENU);m_tray.SetWindow(this);m_tray.RegisterNotifyIcon(ID_TRAYICON, m_hiconTray, WM_TRAYNOTIFY, "StickyNote");// 实现方法:当在托盘图标上点右键时弹出菜单LRESULT CStickyNoteDlg::OnTrayNotify(WPARAM wParam, LPARAM lParam){ UINT uID = (UINT)wParam; UINT uMouseAction = (UINT)lParam; if (uID == ID_TRAYICON) { if (uMouseAction == WM_RBUTTONUP) { CPoint pt; GetCursorPos(&pt); CMenu *pmenu = m_menu.GetSubMenu(0); SetForegroundWindow(); pmenu->TrackPopupMenu(TPM_RIGHTALIGN, pt.x, pt.y, this, NULL); PostMessage(WM_NULL); } } return NULL;} 用Shell_NotifyIcon函数。响应WM_CLOSE消息,隐藏对话框,不要真正关闭。 我是这么写的:LRESULT CAccess_to_opsrvDlg::onShowTask(WPARAM wParam,LPARAM lParam) //wParam接收的是图标的ID,而lParam接收的是鼠标的行为 { if(wParam!=IDR_MAINFRAME) return 1; switch(lParam) { case WM_RBUTTONUP://右键起来时弹出快捷菜单,这里只有一个“关闭” { LPPOINT lpoint = new tagPOINT; ::GetCursorPos(lpoint);//得到鼠标位置 CMenu menu; menu.CreatePopupMenu();//声明一个弹出式菜单 //增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已 //隐藏),将程序结束。 menu.AppendMenu(MF_STRING,WM_DESTROY, "关闭"); //确定弹出式菜单的位置 menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y, this); //资源回收 HMENU hmenu=menu.Detach(); menu.DestroyMenu(); delete lpoint; } break; case WM_LBUTTONDBLCLK://双击左键的处理 { this->ShowWindow(SW_SHOW);//简单的显示主窗口完事儿 } break; } return 0;}怎么改成接受WM_CLOSE消息,这个消息响应函数的参数确定吗 LRESULT CAccess_to_opsrvDlg::onShowTask(WPARAM wParam,LPARAM lParam) 这个消息响应函数的参数确定吗 主要是Shell_NotifyIcon()方法搭配NOTIFYICONDATA 结构和标志位: NIM_DELETE,NIM_ADD,NIM_MODIFY. 学了VC++会忘记VB吗? . CListBox控件中鼠标移上时项的状态问题 vc操作ini文件 vc6中如何将CComBSTR 转换成char*? 请高人给推荐两本vc数据库的好书, 如何让应用程序在Windows启动时自启动? Visual Assiant 下载地址 深入浅出MFC中第一章有个问题? 请教,一个网络与数据库程序? 如何track LVN_BEGINSCROLL and LVN_ENDSCROLL 求VC图像处理程序(有关于特征点运动的跟踪方向的)
System Tray Balloon Tips and Freeing Resources Quickly in .NET
: CDialog(CTMyDlg::IDD, pParent)
{ //{{AFX_DATA_INIT(CTshutDlg)
....
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
//加载托盘区图标,IDR_MAINFRAME是某一位图
m_nWinVersion = WIN_UNKNOWN;
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}2.处理
void CTMyDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
if(nID == SC_MINIMIZE)//最小化到托盘的函数
OnButtonMinmize();//你自己定义的一个最小化窗体的函数
else if(nID == SC_CLOSE)//单击 X 后退出程序
OnButtonQuit();//自定义的退出程序的函数
else
CDialog::OnSysCommand(nID, lParam);
}
}3.用ClassWizard,添加消息响应:
BEGIN_MESSAGE_MAP(CTMyDlg, CDialog)
//{{AFX_MSG_MAP(CTMyDlg)
.....
ON_MESSAGE(WM_NOTIFYICON,OnWM_NOTIFYICON)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()添加函数
void CTMyDlg::OnWM_NOTIFYICON(WPARAM wParam,LPARAM lParam)
{//wParam接收的是图标的ID,而lParam接收的是鼠标的行为
UINT nID = (UINT)wParam;
UINT uMouseMsg = (UINT)lParam;
switch(uMouseMsg)
{
case WM_LBUTTONDBLCLK://当双击的时候
ShowWindow(SW_SHOW);
BringWindowToTop();
CenterWindow();
break;
}
}
就按以上步骤作一定可以的,祝你好运!
void CTMyDlg::OnButtonMinmize() //用于加载托盘图
{
NOTIFYICONDATA nc;
nc.cbSize = sizeof(NOTIFYICONDATA);
nc.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
nc.hWnd = m_hWnd; //接收托盘消息是主程序窗口
lstrcpy(nc.szTip,"我的程序"); //鼠标停留在托盘图标上时显示的信息
nc.uCallbackMessage = WM_NOTIFYICON; //自定义的消息名称
nc.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
nc.uID = IDC_NOTIFYICON;
Shell_NotifyIcon(NIM_ADD, &nc); //在托盘区添加图标
m_bNotifyIconShow = TRUE; ShowWindow(SW_HIDE);
}对应退出时
void CTMyDlg::OnButtonQuit()
{
CDialog::OnOK(); //程序退出,从托盘区删除图标
NOTIFYICONDATA nc;
nc.cbSize = sizeof(NOTIFYICONDATA);
nc.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
nc.hWnd = m_hWnd;
nc.uCallbackMessage = WM_NOTIFYICON;
nc.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
nc.uID = IDC_NOTIFYICON;
Shell_NotifyIcon(NIM_DELETE, &nc);}
// TrayMan.h: interface for the CTrayMan class.
//
//////////////////////////////////////////////////////////////////////#if !defined(AFX_TRAYMAN_H__85DA35DF_B355_471E_B8DB_86E433470EC1__INCLUDED_)
#define AFX_TRAYMAN_H__85DA35DF_B355_471E_B8DB_86E433470EC1__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CTrayMan
{
public:
CTrayMan();
virtual ~CTrayMan(); CWnd *m_pWnd;
void SetWindow(CWnd *pWnd)
{
ASSERT(pWnd);
m_pWnd = pWnd;
}; BOOL RegisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage, LPCTSTR lpszTip=NULL);
BOOL UnregisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage);
BOOL ReregisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage, LPCTSTR lpszTip=NULL); BOOL ModifyIcon(UINT uID, HICON hIcon);
BOOL ModifyMessage(UINT uID, UINT uMessage);
BOOL ModifyTip(UINT uID, LPCTSTR lpszTip);
};#endif // !defined(AFX_TRAYMAN_H__85DA35DF_B355_471E_B8DB_86E433470EC1__INCLUDED_)// TrayMan.cpp: implementation of the CTrayMan class.
//
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
#include "StickyNote.h"
#include "TrayMan.h"#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////CTrayMan::CTrayMan()
{
}CTrayMan::~CTrayMan()
{
}BOOL CTrayMan::RegisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage, LPCTSTR lpszTip)
{
ASSERT(m_pWnd->m_hWnd); NOTIFYICONDATA nfd;
nfd.cbSize = sizeof(NOTIFYICONDATA);
nfd.hWnd = m_pWnd->m_hWnd;
nfd.uID = uID;
nfd.uCallbackMessage = uMessage;
nfd.hIcon = hIcon;
nfd.uFlags = NIF_ICON | NIF_MESSAGE;
if (lpszTip)
{
lstrcpyn(nfd.szTip, lpszTip, 64);
nfd.uFlags |= NIF_TIP;
}
return Shell_NotifyIcon(NIM_ADD, &nfd);
}BOOL CTrayMan::UnregisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage)
{
ASSERT(m_pWnd->m_hWnd); NOTIFYICONDATA nfd;
nfd.cbSize = sizeof(NOTIFYICONDATA);
nfd.hWnd = m_pWnd->m_hWnd;
nfd.uID = uID;
nfd.uCallbackMessage = uMessage;
nfd.hIcon = hIcon;
nfd.uFlags = NIF_ICON | NIF_MESSAGE;
return Shell_NotifyIcon(NIM_DELETE, &nfd);
}BOOL CTrayMan::ReregisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage, LPCTSTR lpszTip)
{
UnregisterNotifyIcon(uID, hIcon, uMessage);
return RegisterNotifyIcon(uID, hIcon, uMessage, lpszTip);
}BOOL CTrayMan::ModifyIcon(UINT uID, HICON hIcon)
{
ASSERT(m_pWnd->m_hWnd); NOTIFYICONDATA nfd;
nfd.cbSize = sizeof(NOTIFYICONDATA);
nfd.hWnd = m_pWnd->m_hWnd;
nfd.uID = uID;
nfd.hIcon = hIcon;
nfd.uFlags = NIF_ICON;
return Shell_NotifyIcon(NIM_MODIFY, &nfd);
}BOOL CTrayMan::ModifyMessage(UINT uID, UINT uMessage)
{
ASSERT(m_pWnd->m_hWnd); NOTIFYICONDATA nfd;
nfd.cbSize = sizeof(NOTIFYICONDATA);
nfd.hWnd = m_pWnd->m_hWnd;
nfd.uID = uID;
nfd.uCallbackMessage = uMessage;
nfd.uFlags = NIF_MESSAGE;
return Shell_NotifyIcon(NIM_MODIFY, &nfd);
}BOOL CTrayMan::ModifyTip(UINT uID, LPCTSTR lpszTip)
{
ASSERT(m_pWnd->m_hWnd); NOTIFYICONDATA nfd;
nfd.cbSize = sizeof(NOTIFYICONDATA);
nfd.hWnd = m_pWnd->m_hWnd;
nfd.uID = uID;
nfd.uFlags = NIF_ICON | NIF_MESSAGE;
nfd.szTip[0] = '\0';
if (lpszTip)
{
lstrcpyn(nfd.szTip, lpszTip, 64);
}
nfd.uFlags = NIF_TIP;
return Shell_NotifyIcon(NIM_MODIFY, &nfd);
}
[/code]
// TrayMan.h: interface for the CTrayMan class.
//
//////////////////////////////////////////////////////////////////////#if !defined(AFX_TRAYMAN_H__85DA35DF_B355_471E_B8DB_86E433470EC1__INCLUDED_)
#define AFX_TRAYMAN_H__85DA35DF_B355_471E_B8DB_86E433470EC1__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CTrayMan
{
public:
CTrayMan();
virtual ~CTrayMan(); CWnd *m_pWnd;
void SetWindow(CWnd *pWnd)
{
ASSERT(pWnd);
m_pWnd = pWnd;
}; BOOL RegisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage, LPCTSTR lpszTip=NULL);
BOOL UnregisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage);
BOOL ReregisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage, LPCTSTR lpszTip=NULL); BOOL ModifyIcon(UINT uID, HICON hIcon);
BOOL ModifyMessage(UINT uID, UINT uMessage);
BOOL ModifyTip(UINT uID, LPCTSTR lpszTip);
};#endif // !defined(AFX_TRAYMAN_H__85DA35DF_B355_471E_B8DB_86E433470EC1__INCLUDED_)// TrayMan.cpp: implementation of the CTrayMan class.
//
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
#include "StickyNote.h"
#include "TrayMan.h"#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////CTrayMan::CTrayMan()
{
}CTrayMan::~CTrayMan()
{
}BOOL CTrayMan::RegisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage, LPCTSTR lpszTip)
{
ASSERT(m_pWnd->m_hWnd); NOTIFYICONDATA nfd;
nfd.cbSize = sizeof(NOTIFYICONDATA);
nfd.hWnd = m_pWnd->m_hWnd;
nfd.uID = uID;
nfd.uCallbackMessage = uMessage;
nfd.hIcon = hIcon;
nfd.uFlags = NIF_ICON | NIF_MESSAGE;
if (lpszTip)
{
lstrcpyn(nfd.szTip, lpszTip, 64);
nfd.uFlags |= NIF_TIP;
}
return Shell_NotifyIcon(NIM_ADD, &nfd);
}BOOL CTrayMan::UnregisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage)
{
ASSERT(m_pWnd->m_hWnd); NOTIFYICONDATA nfd;
nfd.cbSize = sizeof(NOTIFYICONDATA);
nfd.hWnd = m_pWnd->m_hWnd;
nfd.uID = uID;
nfd.uCallbackMessage = uMessage;
nfd.hIcon = hIcon;
nfd.uFlags = NIF_ICON | NIF_MESSAGE;
return Shell_NotifyIcon(NIM_DELETE, &nfd);
}BOOL CTrayMan::ReregisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage, LPCTSTR lpszTip)
{
UnregisterNotifyIcon(uID, hIcon, uMessage);
return RegisterNotifyIcon(uID, hIcon, uMessage, lpszTip);
}BOOL CTrayMan::ModifyIcon(UINT uID, HICON hIcon)
{
ASSERT(m_pWnd->m_hWnd); NOTIFYICONDATA nfd;
nfd.cbSize = sizeof(NOTIFYICONDATA);
nfd.hWnd = m_pWnd->m_hWnd;
nfd.uID = uID;
nfd.hIcon = hIcon;
nfd.uFlags = NIF_ICON;
return Shell_NotifyIcon(NIM_MODIFY, &nfd);
}BOOL CTrayMan::ModifyMessage(UINT uID, UINT uMessage)
{
ASSERT(m_pWnd->m_hWnd); NOTIFYICONDATA nfd;
nfd.cbSize = sizeof(NOTIFYICONDATA);
nfd.hWnd = m_pWnd->m_hWnd;
nfd.uID = uID;
nfd.uCallbackMessage = uMessage;
nfd.uFlags = NIF_MESSAGE;
return Shell_NotifyIcon(NIM_MODIFY, &nfd);
}BOOL CTrayMan::ModifyTip(UINT uID, LPCTSTR lpszTip)
{
ASSERT(m_pWnd->m_hWnd); NOTIFYICONDATA nfd;
nfd.cbSize = sizeof(NOTIFYICONDATA);
nfd.hWnd = m_pWnd->m_hWnd;
nfd.uID = uID;
nfd.uFlags = NIF_ICON | NIF_MESSAGE;
nfd.szTip[0] = '\0';
if (lpszTip)
{
lstrcpyn(nfd.szTip, lpszTip, 64);
}
nfd.uFlags = NIF_TIP;
return Shell_NotifyIcon(NIM_MODIFY, &nfd);
}
// 窗口类定义中定义常量
#define ID_TRAYICON 10001
#define WM_TRAYNOTIFY (WM_USER+300)// 窗口类定义总加以下定义
CTrayMan m_tray;
CMenu m_menu;
afx_msg LRESULT OnTrayNotify(WPARAM wParam, LPARAM lParam);// 窗口消息映射里加如下映射
ON_MESSAGE(WM_TRAYNOTIFY, OnTrayNotify)// 窗口初始化时执行如下代码
m_menu.LoadMenu(IDR_TRAYMENU);
m_tray.SetWindow(this);
m_tray.RegisterNotifyIcon(ID_TRAYICON, m_hiconTray, WM_TRAYNOTIFY, "StickyNote");
// 实现方法:当在托盘图标上点右键时弹出菜单
LRESULT CStickyNoteDlg::OnTrayNotify(WPARAM wParam, LPARAM lParam)
{
UINT uID = (UINT)wParam;
UINT uMouseAction = (UINT)lParam; if (uID == ID_TRAYICON)
{
if (uMouseAction == WM_RBUTTONUP)
{
CPoint pt;
GetCursorPos(&pt);
CMenu *pmenu = m_menu.GetSubMenu(0);
SetForegroundWindow();
pmenu->TrackPopupMenu(TPM_RIGHTALIGN, pt.x, pt.y, this, NULL);
PostMessage(WM_NULL);
}
}
return NULL;
}
LRESULT CAccess_to_opsrvDlg::onShowTask(WPARAM wParam,LPARAM lParam)
//wParam接收的是图标的ID,而lParam接收的是鼠标的行为
{
if(wParam!=IDR_MAINFRAME)
return 1;
switch(lParam)
{
case WM_RBUTTONUP://右键起来时弹出快捷菜单,这里只有一个“关闭”
{ LPPOINT lpoint = new tagPOINT;
::GetCursorPos(lpoint);//得到鼠标位置
CMenu menu;
menu.CreatePopupMenu();//声明一个弹出式菜单
//增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已
//隐藏),将程序结束。
menu.AppendMenu(MF_STRING,WM_DESTROY, "关闭");
//确定弹出式菜单的位置
menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y, this);
//资源回收
HMENU hmenu=menu.Detach();
menu.DestroyMenu();
delete lpoint;
}
break;
case WM_LBUTTONDBLCLK://双击左键的处理
{
this->ShowWindow(SW_SHOW);//简单的显示主窗口完事儿
}
break;
}
return 0;
}
怎么改成接受WM_CLOSE消息,这个消息响应函数的参数确定吗
这个消息响应函数的参数确定吗
搭配NOTIFYICONDATA 结构和标志位: NIM_DELETE,NIM_ADD,NIM_MODIFY.