今天想弄個就想XP裡的點擊右鍵出現菜單的樣式,當然在PDA上是只能點擊了,我選擇點擊時出現快顯功能表,同時給予響應。
首先建個基於對話方塊的MFC的智慧型裝置程式,從VS2005的表單訊息裡選擇WM_LBYTTONDOWN這個訊息
選擇好後就是要引入快顯功能表啦。代碼如下:
void CTestMenuDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
int x = point.x;
int y = point.y;
HMENU hMainMenu;
hMenu = CreatePopupMenu ();
AppendMenu (hMenu, MF_STRING | MF_ENABLED, ID_NEW, TEXT ("&New"));
AppendMenu (hMenu, MF_STRING | MF_ENABLED, ID_OPEN, TEXT ("&Open"));
AppendMenu (hMenu, MF_STRING | MF_ENABLED, ID_SAVE, TEXT ("&Save"));
AppendMenu (hMenu, MF_STRING | MF_ENABLED, ID_EXIT, TEXT ("E&xit"));
TrackPopupMenuEx(hMenu,TPM_LEFTALIGN,x,y,m_hWnd,NULL);//彈出的菜單跟隨點擊的地方移動
CDialog::OnLButtonDown(nFlags, point);
}
我將ID_NEW、ID_OPEN、 ID_SAVE、ID_EXIT這四個控制項的ID寫到了Resourceppc.h這個源檔案中了,形式為
#define ID_NEW 100
#define ID_OPEN 101
#define ID_SAVE 102
#define ID_EXIT 103
當然這四個ID你可以隨便取,記住申明的數字要連續。
添加現在就完成了,下一步就要實現點擊這個快顯功能表的時候可以實現一些操作了,這個東西我找了半天沒辦法解決,我就想到了暴力解決的方法,學著菜單通過類嚮導自動產生的方法來解決:
1.在所在的對話方塊的標頭檔裡寫afx_msg void On100();學系統自動產生的那種定義
2.在以下這段代碼中添加你的菜單的訊息,具體我也說不上來,反正我感覺就這樣做
BEGIN_MESSAGE_MAP(CTestMenuDlg, CDialog)
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
ON_WM_SIZE()
#endif
//}}AFX_MSG_MAP
ON_WM_LBUTTONDOWN()
ON_COMMAND(ID_NEW, &CTestMenuDlg::On100)//就是這個
END_MESSAGE_MAP()
3.在CPP檔案裡寫這個方法,這樣你的快顯功能表就有用了,你可以在下面這個方法裡寫你想要的操作了。
void CTestMenuDlg::On100()
{
MessageBox(L"100", L"Popup Menu Alert",MB_OK);
}
4.如果你想在CListrctrl裡點擊某一列的時候出現菜單時,可以在LIST控制項的單擊事件裡這麼寫:
void CTestMenuDlg::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if(pNMListView->iItem != -1)
{
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
HWND hwnd;
hMainMenu = CreateMenu ();
hMenu = CreatePopupMenu ();
AppendMenu (hMenu, MF_STRING | MF_ENABLED, ID_NEW, TEXT ("&New"));
AppendMenu (hMenu, MF_STRING | MF_ENABLED, ID_OPEN, TEXT ("&Open"));
AppendMenu (hMenu, MF_STRING | MF_ENABLED, ID_SAVE, TEXT ("&Save"));
AppendMenu (hMenu, MF_STRING | MF_ENABLED, ID_EXIT, TEXT ("E&xit"));;
TrackPopupMenuEx(hMenu,TPM_LEFTALIGN,point.x,point.y,m_hWnd,NULL);
}
*pResult = 0;
}