一 单文档添加托盘
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;