圖1 變化的背景圖
給托盤添加右擊菜單
一般的商業程序都有托盤圖標和在托盤上彈出右擊菜單的功能,那麼如何給自已的程序添加這樣的功能呢?本文通過改變背景圖的實例,介紹一種實現托盤上彈出右擊菜單的方法。
一、添加托盤圖標
給程序添加托盤圖標的方法在很多VC書中都有實例,通常在程序中按下面的步驟就可以實現:
1、在XXDlg.CPP文件頭部加入
#define WM_NOTIFYICONWM_USER+5
NOTIFYICONDATA nd;
2、在程序的初始化中加入下面代碼
nd.cbSize= sizeof (NOTIFYICONDATA);
nd.hWnd= m_hWnd;
nd.uID= IDR_MAINFRAME;
nd.uFlags= NIF_ICON|NIF_MESSAGE|NIF_TIP;
nd.uCallbackMessage= WM_NOTIFYICON;
nd.hIcon= m_hIcon;
strcpy(nd.szTip, "我的托盤");
Shell_NotifyIcon(NIM_ADD, &nd);
3、在程序的退了函數中加入刪除托盤圖標語句
Shell_NotifyIcon(NIM_DELETE, &nd);
二、在資源中添加菜單
1、建立菜單
圖2 菜單
2、建立菜單對應的函數
void CbackdropDlg::OnShow()
{
ShowWindow( SW_SHOWNORMAL);//恢復正常顯示
}
void CbackdropDlg::OnExit()
{
::PostQuitMessage(0); //退出
}
void CbackdropDlg::OnHide()
{
ShowWindow(SW_HIDE);//隱藏
}
void CbackdropDlg::OnMin()
{
ShowWindow(SW_SHOWMINIMIZED);//最小化
}
三、添加響應函數
1、在類中加入托盤消息響應函數
LONG CbackdropDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)
2、手中添加消息映射
//}}AFX_MSG_MAP
ON_MESSAGE(WM_NOTIFYICON, OnNotifyIcon)//手工添加消息映射
END_MESSAGE_MAP()
3、在托盤消息響應函數中添加代碼
LONG CbackdropDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)
{
// 響應在托盤圖標上的單擊
//wParam中是響應消息的圖標ID,lParam中則是Windows的消息
// The backdrop icon sent us a message. Let''s see what it is
switch ( lParam )
{
case WM_RBUTTONDOWN:
{
// 用戶在托盤圖標上單擊鼠標右鍵,彈出菜單
CMenu pMenu;
if (pMenu.LoadMenu(IDR_MENU1))
{
CMenu* pPopup = pMenu.GetSubMenu(0);
ASSERT(pPopup != NULL);
CPoint Point;
if(IsIconic()) pPopup->EnableMenuItem(IDC_MIN,MF_BYCOMMAND |
MF_DISABLED | MF_GRAYED);
if (IsWindowVisible())// 根據對話框窗口的狀態對相關菜單項使能
{
if(!IsIconic())
pPopup->EnableMenuItem(IDC_SHOW,MF_BYCOMMAND |
MF_DISABLED | MF_GRAYED);
}
else
pPopup->EnableMenuItem(IDC_HIDE,MF_BYCOMMAND |
MF_DISABLED | MF_GRAYED);
if (bkbmp)// 根據對話框背景圖狀態改變菜單名稱
pMenu.ModifyMenu(IDC_FIX,MF_STRING,IDC_FIX,"變化背景");
else
pMenu.ModifyMenu(IDC_FIX,MF_STRING,IDC_FIX,"固定背景)");
// 確定鼠標位置以便在該位置附近顯示菜單
GetCursorPos( &Point );
SetForegroundWindow();
pPopup->TrackPopupMenu(
TPM_LEFTALIGN | TPM_RIGHTBUTTON,
Point.x, Point.y, this);?
}
}
break;
case WM_LBUTTONDBLCLK:
case WM_LBUTTONDOWN:
// OnShow();
break;
}
return 0;
}
結束語
自本人有幸找到VCKBASE以來的大半年裡得到了論壇中的眾多高手指點,收益匪淺,所以想為VCKBASE論壇做點什麼,因本人水平較低,故只能將在VCKBASE論壇中現學會的關於托盤右擊菜單的方法結合變化背景圖實例向大家匯報一下。要進一步了解背景圖的內容請參考背景圖實例中代碼,如想了解更多的托盤資料請參考本站有關文章和實例。由於時間、水平限制,缺點和不足之處在所難免,敬請各位高手多多批評指正.。在此再一次對本論壇和在論壇中對我提供幫助的眾多高手深深表示感謝!