现在的位置: 首页 > 综合 > 正文

MFC中将窗口最小化到系统托盘和还原

2013年12月07日 ⁄ 综合 ⁄ 共 2512字 ⁄ 字号 评论关闭
通过以下步骤可以在MFC程序中将窗口最小化到系统托盘,和还原成窗口,附加代码中如有特殊说明则会用红色标出。

1、添加一个ICON图标,其ID为IDI_ICON_TESTICON,在VS2008坐标的Resource
View(资源视图)中添加,该图标主要用于在托盘区显示;在头文件中定义添加托盘图标的消息号(用户所有对托盘的消息将对应此消息号):
#define WM_ICON_NOTIFY WM_USER +1

2、新添加一个函数_ToTray(void),让其添加一个托盘图标:
void CAirMove_mainDlg::_ToTray(void)
{
m_NotifyIcon.cbSize=sizeof(NOTIFYICONDATA);
m_NotifyIcon.hIcon=AfxGetApp()->LoadIcon(IDI_ICON_TESTICON);
m_NotifyIcon.hWnd=m_hWnd;
m_NotifyIcon.uID = IDI_ICON_AIRMOVE;
lstrcpy(m_NotifyIcon.szTip,_T("Test"));
m_NotifyIcon.uCallbackMessage=WM_ICON_NOTIFY;
m_NotifyIcon.uFlags=NIF_ICON | NIF_MESSAGE | NIF_TIP;
Shell_NotifyIcon(NIM_ADD,&m_NotifyIcon);

m_IsWindowHide = true;
}
说明:
(1)需注意其中的消息号WM_ICON_NOTIFY是托盘区的响应消息,即用户对托盘图标的所有操作都会发送到此消息对应的响应函数中
(2)成员变量m_IsWindowHide 用于标识窗口是否已经最小化到系统托盘,该变量初始化为true
(3)向托盘区发送的消息号为WM_ICON_NOTIFY
2、在窗口初始化函数OnInitDialog()中调用步骤2中添加的函数_ToTray
// TODO: Add extra initialization here
 _ToTray();

3、添加消息WM_ICON_NOTIFY的响应函数_OnIconNotify
(1)在头文件中添加响应函数_OnIconNotify的声明:
afx_msg LRESULT _OnIconNotify(WPARAM wParam,LPARAM lParam);
(2)在cpp文件中的BEGIN_MESSAGE_MAPEND_MESSAGE_MAP之间添加消息与函数的映射宏:
ON_MESSAGE(WM_ICON_NOTIFY,_OnIconNotify)
(3)在cpp文件中实现消息响应函数_OnIconNotify
LRESULT CAirMove_mainDlg::_OnIconNotify(WPARAM wParam,LPARAM lParam)
 { 
 UINT uID;
  UINT uMouseMsg;
  uID = (UINT) wParam; 
  uMouseMsg = (UINT)lParam; 
  switch (uMouseMsg)
 {
  case WM_RBUTTONDOWN:
 {
 CMenu popMenu;
 popMenu.CreatePopupMenu();
 popMenu.AppendMenu(MF_STRING, WM_DESTROY, _T("exit"));
 popMenu.AppendMenu(MF_STRING, WM_START_DEBUGER, _T("启动 Debuger窗口"));         popMenu.AppendMenu(MF_STRING, WM_HIDE_WORKING_WINDOW, _T("隐藏锁定窗口")); 
popMenu.AppendMenu(MF_STRING, WM_DISPLAY_WORKING_WINDOW, _T("打开锁定窗口")); 
 POINT ptMouse;
 ::GetCursorPos(&ptMouse); 
 ::SetForegroundWindow(m_NotifyIcon.hWnd);
 ::TrackPopupMenu(popMenu.m_hMenu, 0, ptMouse.x, ptMouse.y, 0, m_NotifyIcon.hWnd, NULL);
break; 
} 
case WM_LBUTTONDBLCLK:
{
 _OnStartDebuger(0,0);
break;
}
 } 
 return 0;
 }

说明:
(1)上述消息响应函数的实现只是个例子,在开发过程中可以根据自己的需要添加特定的功能。
(2)上述的消息响应函数中只实现了对托盘的鼠标左键双击和右键的响应。其中右键响应消息中实现一个弹出式菜单;左键双击弹出一个对话框
(3)用户对托盘的所有消息都会发送到消息响应函数_OnIconNotify中。
(4)在头文件中添加WM_HIDE_WORKING_WINDOW、WM_START_DEBUGER等消息号的定义,例如:
#define WM_HIDE_WORKING_WINDOW WM_USER +4
4、在窗口的OnWindowPosChanging函数中添加如下代码:
void CTestDlg::OnWindowPosChanging(WINDOWPOS* lpwndpos)
 {
 if(m_IsWindowHide)
 lpwndpos->flags &= ~SWP_SHOWWINDOW; 
 CDialog::OnWindowPosChanging(lpwndpos);
 // TODO: Add your message handler code here 
 }
5、为托盘的右键弹出的菜单项添加响应函数,以“隐藏锁定窗口”菜单项(对应消息号为WM_HIDE_WORKING_WINDOW)为例
(1)在头文件中添加消息响应函数的声明:
afx_msg void OnHideWorkingMenu();
(2)在cpp文件中的BEGIN_MESSAGE_MAPEND_MESSAGE_MAP之间添加消息与函数的映射宏:
ON_COMMAND(WM_HIDE_WORKING_WINDOW,OnHideWorkingMenu)
(3)在cpp文件中添加函数的实现,代码略。

抱歉!评论已关闭.