window系統托盤及托盤菜單 下面是一個MFC寫的wifi助手程式用于實作系統托盤的代碼片段
void CWiFiAssistantDlg::OnClose()
{
// TODO: 在此添加消息處理程式代碼和/或調用預設值
ExitPtDlg exitPtDlg;
int varReturn = exitPtDlg.DoModal();
if(varReturn == IDOK)
{
preExit();
CDialogEx::OnClose();
}
else //在通盤顯示程式圖示
{
NOTIFYICONDATA tnd;
tnd.cbSize=sizeof(NOTIFYICONDATA);
tnd.hWnd=this->m_hWnd; // 要顯示托盤圖示的視窗句柄
tnd.uID=IDR_MAINFRAME; //程式圖示資源ID
tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
tnd.uCallbackMessage=WM_MYMESSAGE_CLICK; //自定義消息,當圖示發送事件時會向視窗發送此消息,會在視窗過程函數接收到此消息,接收到消息時進行你的處理
tnd.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
lstrcpy(tnd.szTip, L"WiFi助手");//圖示提示為”WiFi助手”
Shell_NotifyIcon(NIM_ADD,&tnd);//向工作列添加圖示
ShowWindow(SW_HIDE);
}
}
LRESULT CWiFiAssistantDlg::OnMyMessageClick(WPARAM wParam, LPARAM lParam) //MFC裡的自定義消息處理函數
{
UINT uID;//發出該消息的圖示的ID
UINT uMouseMsg;//滑鼠動作
POINT pt;
uID=(UINT) wParam;
uMouseMsg=(UINT) lParam;
if(uMouseMsg == WM_LBUTTONDBLCLK)//如果是輕按兩下左鍵
{
switch(uID)
{
case IDR_MAINFRAME://如果是我們的圖示
GetCursorPos(&pt);//取得滑鼠位置
ShowWindow(SW_SHOWNORMAL);
SetForegroundWindow();
break;
}
}
else if(uMouseMsg == WM_RBUTTONDOWN)//如果是單擊右鍵
{
CMenu menuTray, *pPopup;
CPoint point;
GetCursorPos(&point);
menuTray.LoadMenuW(IDR_MENU1); //從資源載入菜單
pPopup=menuTray.GetSubMenu(0); //獲得子菜單指針
pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y,this); //設定菜單顯示位置并顯示
pPopup->Detach();
menuTray.DestroyMenu();
}
return 0;
}
void CWiFiAssistantDlg::preExit() //程式退出時調用
{
NOTIFYICONDATA tnid;
tnid.cbSize=sizeof(NOTIFYICONDATA);
tnid.hWnd=GetSafeHwnd();
tnid.uID=IDR_MAINFRAME; //保證删除的是我們的圖示
Shell_NotifyIcon(NIM_DELETE, &tnid);
}
//菜單項對應處理函數
void CWiFiAssistantDlg::OnMenuShow()
{
SetForegroundWindow();
ShowWindow(SW_SHOWNORMAL);
// TODO: 在此添加指令處理程式代碼
}
//菜單項對應處理函數
void CWiFiAssistantDlg::OnMenuExit()
{
// TODO: 在此添加指令處理程式代碼
preExit();
OnOK();
}