本文主要是介绍Windows编程入门(5)MFC程序最小托盘化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
转载自http://blog.csdn.net/csf111/article/details/6980508
为了使MFC程序(SDI,MDI,DLG)均能最小化到系统托盘,这里运用消息机制来实现系统托盘效果。
那么什么是托盘呢?所谓的“托盘”,在Windows系统界面中,指的就是下面任务条右侧,有系统时间等等的标志的那一部分。在程序最小化或挂起时,但有不希望占据任务栏的时候,就可以把程序放到托盘区。
怎么实现呢?这里需要运用到的Windows API函数:
BOOL Shell_NotifyIcon(DWORD dwMessage, PNOTIFYICONDATA lpdata
);
函数了里面的参数对于实现不同的效果尤其重要,包括托盘图标、托盘菜单等等。那么我们来了解一下两个参数吧:
dwMessage可以取以下值:
NIM_ADD 向托盘中加入一个图标
NIM_MODIFY 修改托盘中的图标
NIM_DELETE 从托盘中删除一个图标
参数pnid是NOTIFYICONDATA结构的一个引用。该结构的原型如下:
- typedef struct _NOTIFYICONDATA {
- DWORD cbSize;
- HWND hWnd;
- UINT uID;
- UINT uFlags;
- UINT uCallbackMessage;
- HICON hIcon;
- #if (_WIN32_IE < 0x0500)
- TCHAR szTip[64;
- #else
- TCHAR szTip[128];
- #endif
- #if (_WIN32_IE >= 0x0500)
- DWORD dwState;
- DWORD dwStateMask;
- TCHAR szInfo[256];
- union {
- UINT uTimeout;
- UINT uVersion;
- } DUMMYUNIONNAME;
- TCHAR szInfoTitle[64];
- DWORD dwInfoFlags;
- #endif
- #if (_WIN32_IE >= 0x600)
- GUID guidItem;
- #endif
- } NOTIFYICONDATA, *PNOTIFYICONDATA;
- typedef struct _NOTIFYICONDATA {
- DWORD cbSize;
- HWND hWnd;
- UINT uID;
- UINT uFlags;
- UINT uCallbackMessage;
- HICON hIcon;
- #if (_WIN32_IE < 0x0500)
- TCHAR szTip[64;
- #else
- TCHAR szTip[128];
- #endif
- #if (_WIN32_IE >= 0x0500)
- DWORD dwState;
- DWORD dwStateMask;
- TCHAR szInfo[256];
- union {
- UINT uTimeout;
- UINT uVersion;
- } DUMMYUNIONNAME;
- TCHAR szInfoTitle[64];
- DWORD dwInfoFlags;
- #endif
- #if (_WIN32_IE >= 0x600)
- GUID guidItem;
- #endif
- } NOTIFYICONDATA, *PNOTIFYICONDATA;
具体步骤如下:
1.在程序中增加一个私有的NOTIFYICONDAT对象
- private:
- NOTIFYICONDATA m_tnid;
- private:
- NOTIFYICONDATA m_tnid;
2.在初始化窗口时对NOTIFYICONDAT对象初始化 用Shell_NotifyIcon函数进行注册
- m_notify.cbSize=sizeof NOTIFYICONDATA;
- m_notify.hWnd=this->m_hWnd;
- m_notify.uID=IDR_MAINFRAME;
- m_notify.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
- strcpy(m_notify.szTip,"Michael_Chen is a good man");
- m_notify.uCallbackMessage=WM_USER_NOTIFYICON;
- m_notify.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP;
- Shell_NotifyIcon(NIM_ADD,&m_notify);
- m_notify.cbSize=sizeof NOTIFYICONDATA;
- m_notify.hWnd=this->m_hWnd;
- m_notify.uID=IDR_MAINFRAME;
- m_notify.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
- strcpy(m_notify.szTip,"Michael_Chen is a good man");
- m_notify.uCallbackMessage=WM_USER_NOTIFYICON;
- m_notify.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP;
- Shell_NotifyIcon(NIM_ADD,&m_notify);
3.增加自定义的消息处理函数或者重载WindowProc函数,在消息处理函数或WindowProc函数中对自定义的消息进行处理
1)运用自定义消息
i,WM_USER_NOTIFYICON是自定义的消息 在头文件中进行声明;
- #define WM_USER_NOTIFYICON WM_USER+1
- #define WM_USER_NOTIFYICON WM_USER+1
ii,在.h文件中声明消息函数原型
- afx_msg LRESULT OnNotifyMsg(WPARAM wparam,LPARAM lparam);
- afx_msg LRESULT OnNotifyMsg(WPARAM wparam,LPARAM lparam);
iii,在.cpp文件中进行消息映射
- BEGIN_MESSAGE_MAP(CNotifyiconDlg, CDialog)
-
- ...
- ON_MESSAGE(WM_USER_NOTIFYICON,OnNotifyMsg)
-
- END_MESSAGE_MAP()
- BEGIN_MESSAGE_MAP(CNotifyiconDlg, CDialog)
-
- ...
- ON_MESSAGE(WM_USER_NOTIFYICON,OnNotifyMsg)
-
- END_MESSAGE_MAP()
iiii,在.cpp文件中添加自定义的消息响应代码,左键双击弹出应用程序主窗口,右键单击弹出菜单。
- LRESULT CNotifyiconDlg::OnNotifyMsg(WPARAM wparam,LPARAM lparam)
-
- {
- if(wparam!=IDR_MAINFRAME)
- return 1;
- switch(lparam)
- {
- case WM_RBUTTONUP:
- {
- LPPOINT lpoint=new tagPOINT;
- ::GetCursorPos(lpoint);
- CMenu menu;
- menu.CreatePopupMenu();
-
-
- 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;
- }
- LRESULT CNotifyiconDlg::OnNotifyMsg(WPARAM wparam,LPARAM lparam)
-
- {
- if(wparam!=IDR_MAINFRAME)
- return 1;
- switch(lparam)
- {
- case WM_RBUTTONUP:
- {
- LPPOINT lpoint=new tagPOINT;
- ::GetCursorPos(lpoint);
- CMenu menu;
- menu.CreatePopupMenu();
-
-
- 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;
- }
2)重载WindowProc函数
i,重载WindowProc函数(方法略)
ii,在WindowProc中增加的消息相应代码
-
- LRESULT CNotifyiconDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
- {
-
- switch(message)
- {
- case WM_USER_NOTIFYICON:
-
- if(lParam==WM_LBUTTONDBLCLK)
-
- {
-
- if(AfxGetApp()->m_pMainWnd->IsWindowVisible())
- {
- AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE);
- }
- else
- {
- AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW);
- }
-
- }
- else if(lParam==WM_RBUTTONDOWN)
- {
- CMenu menu;
- menu.LoadMenu(IDR_MENU1);
- CMenu *pMenu=menu.GetSubMenu(0);
- CPoint pos;
- GetCursorPos(&pos);
- pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,AfxGetMainWnd());
- }
- break;
- case WM_SYSCOMMAND:
-
- if(wParam==SC_MINIMIZE)
- {
-
- AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE);
- return 0;
- }
- if(wParam==SC_CLOSE)
- {
- ::Shell_NotifyIcon(NIM_DELETE,&m_notify);
- }
- break;
- }
- return CDialog::WindowProc(message, wParam, lParam);
- }
-
- LRESULT CNotifyiconDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
- {
-
- switch(message)
- {
- case WM_USER_NOTIFYICON:
-
- if(lParam==WM_LBUTTONDBLCLK)
-
- {
-
- if(AfxGetApp()->m_pMainWnd->IsWindowVisible())
- {
- AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE);
- }
- else
- {
- AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW);
- }
-
- }
- else if(lParam==WM_RBUTTONDOWN)
- {
- CMenu menu;
- menu.LoadMenu(IDR_MENU1);
- CMenu *pMenu=menu.GetSubMenu(0);
- CPoint pos;
- GetCursorPos(&pos);
- pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,AfxGetMainWnd());
- }
- break;
- case WM_SYSCOMMAND:
-
- if(wParam==SC_MINIMIZE)
- {
-
- AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE);
- return 0;
- }
- if(wParam==SC_CLOSE)
- {
- ::Shell_NotifyIcon(NIM_DELETE,&m_notify);
- }
- break;
- }
- return CDialog::WindowProc(message, wParam, lParam);
- }
经过以上的步骤,就编写出了一个简单的可以最小化到托盘的程序。该程序在一启动时,在托盘创立应用程序的图标,最小化程序时隐藏主窗口,双击托盘区的图标时,显示主窗口,右键点击托盘区窗口时,弹出菜单。
这篇关于Windows编程入门(5)MFC程序最小托盘化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!