任务栏和状态栏快速开发
1. MFC下托盘图标的实现和托盘菜单
对话框头文件XXXDlg.h:
1.添加成员变量NOTIFYICONDATA m_nid;
2.添加tray消息响应函数的声明
//响应在托盘图标上的单击
LONGOnNotifyIcon(WPARAM wParam,LPARAM lParam);
----------------------------------------------------------------------
对话框实现文件XXXDlg.cpp:
1.定义tray消息#defineWM_NOTIFYICON WM_USER+5
2.CXXXDlg的构造函数添加
//InitializeNOTIFYICONDATA struct
memset(&m_nid,0, sizeof(m_nid));
m_nid.cbSize = sizeof(m_nid);
m_nid.uFlags = NIF_ICON |NIF_TIP | NIF_MESSAGE;
3.CXXXDlg的析构函数添加
m_nid.hIcon = NULL;
Shell_NotifyIcon(NIM_DELETE,&m_nid);
4.添加消息映射:
BEGIN_MESSAGE_MAP(CXXXDlg, CDialog)
//...
ON_MESSAGE(WM_NOTIFYICON,OnNotifyIcon)//手工添加消息映射
//...
END_MESSAGE_MAP()
5.OnInitDialog函数添加:
//添加系统托盘
m_nid.cbSize = sizeof(NOTIFYICONDATA);
m_nid.hWnd = m_hWnd;
m_nid.uID = IDR_MAINFRAME;
m_nid.uFlags = NIF_ICON |NIF_MESSAGE | NIF_TIP;
m_nid.uCallbackMessage= WM_NOTIFYICON;
m_nid.hIcon =m_hIcon;
strcpy(m_nid.szTip,_T("XXX系统"));
Shell_NotifyIcon(NIM_ADD,&m_nid);
6. OnNotifyIcon函数的实现:
//响应在托盘图标上的单击
LONG CMainDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)
{
//wParam中是响应消息的图标ID,lParam中则是Windows的消息
switch (lParam)// The backdrop icon sent us a message. Let's see what it is
{
case WM_RBUTTONDOWN:
{// 用户在托盘图标上单击鼠标右键,弹出菜单
CMenupMenu;
if(pMenu.LoadMenu(IDR_NOTIFY_MENU))
{
CMenu*pPopup = pMenu.GetSubMenu(0);
int id;
ASSERT(pPopup!=NULL);
CPointPoint;
if(IsIconic()) pPopup->EnableMenuItem(ID_MINSIZE,MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
// 根据对话框窗口的显示/隐藏状态修改菜单名称
if(IsWindowVisible())
{
if(!IsIconic())
pPopup->EnableMenuItem(ID_MAINDLG,MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
}
else
pPopup->EnableMenuItem(ID_HIDE,MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
//确定鼠标位置以便在该位置附近显示菜单
GetCursorPos(&Point);
SetForegroundWindow();
//根据菜单项操作
id = pPopup->TrackPopupMenu(TPM_RETURNCMD |TPM_LEFTALIGN | TPM_RIGHTBUTTON,Point.x,Point.y, this);
CWnd*pWnd = AfxGetMainWnd();
switch(id)
{
case ID_MAINDLG:
//窗口前端显示
SetForegroundWindow();
ShowWindow(SW_SHOWNORMAL);
break;
case ID_HIDE:
pWnd->ShowWindow(SW_HIDE);
break;
case ID_MINSIZE:
pWnd->ShowWindow(SW_SHOWMINIMIZED);
break;
case ID_EXIT:
::PostQuitMessage(0);
break;
default:
break;
}
}
}
break;
case WM_LBUTTONDBLCLK:
case WM_LBUTTONDOWN:
//窗口前端显示
SetForegroundWindow();
ShowWindow(SW_SHOWNORMAL);
break;
}
return 0;
}
1. MFC状态栏显示系统时间
1. 头文件中声明:
private:
CStatusBar m_StatusBar; //状态栏对象
2. OnInitDialog函数添加
//创建状态栏
m_StatusBar.CreateEx(this, SBARS_SIZEGRIP);
UINT panels[5];
m_StatusBar.SetIndicators(panels, 32);
CRect rect;
GetClientRect(rect);
int width = rect.Width()/5;
for (int i = 0; i<5; i++)
{
m_StatusBar.SetPaneInfo(i, 1000 + i, 0,width);
}
m_StatusBar.SetPaneText(0, _T("当前登录用户:"));
m_StatusBar.SetPaneText(1,theApp.m_strCurUser + _T("(")+theApp.m_strUserType +_T(")"));
m_StatusBar.SetPaneText(2, _T("当前系统时间:"));
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
//启动ID为1的定时器,定时时间为1秒,刷新系统时间
SetTimer(1,1000, NULL);
3. Timer消息
//定时器
void CMainDlg::OnTimer(UINT_PTR nIDEvent)
{
CString str; //获取系统时间
CTime tm = CTime::GetCurrentTime();
str =tm.Format(_T("%Y-%m-%d %H:%M:%S"));
m_StatusBar.SetPaneText(3, str);
CDialogEx::OnTimer(nIDEvent);
}
4. OnSize消息
void CMainDlg::OnSize(UINT nType, int cx,int cy)
{
CDialogEx::OnSize(nType,cx, cy);
//判断状态栏是否被创建
if (IsWindow(m_StatusBar.m_hWnd))
{
CRectrect;
GetClientRect(rect);
intwidth = rect.Width() / 5;
for (int i =0; i<5; i++)
{
m_StatusBar.SetPaneInfo(i, 1000 + i,0, width);
}
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
}
}