在VS6.0工程中创建系统状态栏图标显示?
第一步:创建自定义消息
a、在CMainFrame类的 .cpp文件中定义消息名称
#define WM_TRAY WM_USER + 103
b、在CMainFrame类的 .cpp 文件中声明消息映射
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code !
ON_WM_CREATE()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_TRAY, OnTrayNotification)
END_MESSAGE_MAP()
c、在CmainFrmae类中手动添加 OnTrayNotification 函数的定义及实现
头文件中做函数定义
protected:
//{{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
LONG OnTrayNotification(WPARAM wparam, LPARAM lparam);
};
.cpp文件中做实现代码
//系统状态栏显示程序图标
LONG CMainFrame::OnTrayNotification(WPARAM wparam, LPARAM lparam)
{
switch ( lparam )
{
case WM_RBUTTONDOWN:
{
// 用户在托盘图标上单击鼠标右键,弹出上下文菜单隐藏/显示对话框。
CMenu oMenu;
if (oMenu.LoadMenu(IDR_MENU_TRAY))
{
CMenu* pPopup = oMenu.GetSubMenu(0);
ASSERT(pPopup != NULL);
CPoint oPoint;
GetCursorPos( &oPoint );
SetForegroundWindow();
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,oPoint.x, oPoint.y, this);
}
}
break;
case WM_LBUTTONDBLCLK: // 单击/双击鼠标左键均显示出对话框
case WM_LBUTTONDOWN:
Show();
break;
}
return 0;
}
第二步:此时编译工程会提示:
D:/工作室/PDT3000系统/PDT30001/DCMS3000Main/MainFrm.cpp(125) : error C2065: 'IDR_MENU_TRAY' : undeclared identifier
D:/工作室/PDT3000系统/PDT30001/DCMS3000Main/MainFrm.cpp(138) : error C2065: 'Show' : undeclared identifier
a、IDR_MENU_TRAY 是菜单资源,在ResourceView中添加新Menu,属性设置为 IDR_MENU_TRAY,可以创建相应的菜单项,如果用户右击会弹出菜单,注:如果在ID_MENU_TRAY菜单中,创建的子项ID与主菜单ID一致,便可执行同样的操作
b、Show函数主要用来控制主程序的显示与隐藏,添加函数即可,实现代码如下:
void CMainFrame::Show()
{
if ( !IsWindowVisible() )
{
ShowWindow(SW_SHOW);
}
else
{
ShowWindow(SW_HIDE);
}
}
第三步:在CMainFrame的OnCreate中加入下述代码,实现图标显示
//实现系统图标的系统状态栏显示.......................................
//
NOTIFYICONDATA IconData;
IconData.cbSize = sizeof(NOTIFYICONDATA);
IconData.hWnd = this->m_hWnd;
IconData.uID = IDR_MAINFRAME;
IconData.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
IconData.uCallbackMessage = WM_TRAY;
IconData.hIcon
= LoadIcon(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(IconData.szTip, "数据采集映射子系统 3.3/n版权归 (C) 优化佳");
::Shell_NotifyIcon(NIM_ADD, &IconData);
//
第四步:在适当位置中加入下述代码,实现图标删除,我是在CMainFrame的WM_CLOSE消息中添加的下述代码
//在系统状态栏中删除系统托盘图标
NOTIFYICONDATA IconData;
IconData.cbSize = sizeof(NOTIFYICONDATA);
IconData.hWnd = this->m_hWnd;
IconData.uID = IDR_MAINFRAME;
::Shell_NotifyIcon(NIM_DELETE, &IconData);