今天想弄个就想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;
}