WinCE系统中,触摸笔长按事件相当于是鼠标右键弹出上下文菜单,在网上大约能找到两段相似的代码,一是用timer事件实现,另一个是捕获WM_LBUTTON_DOWN消息,再调用SHRecognizeGesture实现,大致代码如下:
在桌面上按住左键不放 弹出右键菜单。 case WM_LBUTTONDOWN:
{
SHRGINFO shrg;
HMENU hmenu;
shrg.cbSize = sizeof(shrg);
shrg.hwndClient = hWnd;
shrg.ptDown.x = LOWORD(lParam);
shrg.ptDown.y = HIWORD(lParam);
shrg.dwFlags = SHRG_RETURNCMD | SHRG_NOANIMATION;
if (SHRecognizeGesture(&shrg) == GN_CONTEXTMENU) {
hmenu = GetSubMenu(g_hMainMenu, 0);
TrackPopupMenuEx(hmenu,
TPM_LEFTALIGN,
LOWORD(lParam),
HIWORD(lParam),
hWnd,
NULL);
}
break;
}
说明:
OS Versions: Windows CE .NET 4.2 and later.
Header: Aygshell.h.
Link Library: Aygshell.lib.
经过试验,两种方式都工作的不好,以上这种方式偶尔能弹出一下,多数时候并不能正常工作。经验长按并截获消息发现,长按时会发送一个WM_CONTEXTMENU消息,这就是长按后发送的消息。所以,处理方法如下:例如要在CListCtrl列表上选中一行,并长按触摸笔并弹出上下文菜单,重载窗口的PreTranslateMessage函数,将收到的上下文菜单发到自定消息处理函数处理。
//定议消息
#define ID_MSG_CONTEXT_MENU WM_USER + 101
//消息处理函数
LRESULT MyDialog::OnCListCtrlContextMenu(WPARAM wParam, LPARAM lParam)
//消息映射
BEGIN_MESSAGE_MAP(MyDialog, CDialog)
ON_MESSAGE(ID_MSG_CONTEXT_MENU, OnCListCtrlContextMenu)
END_MESSAGE_MAP()
重载PreTranslateMessage函数
BOOL MyDialog::PreTranslateMessage(MSG* pMsg)
{
//处理鼠标长按
if(pMsg->message == WM_CONTEXTMENU)
{
CWnd* pCur = WindowFromPoint(pMsg->pt);
if (pCur == &m_listView)
{
PostMessage(ID_MSG_CONTEXT_MENU,NULL,NULL);
}
}
return CDialog::PreTranslateMessage(pMsg);
}
//弹出上下文菜单
LRESULT MyDialog::OnCListCtrlContextMenu(WPARAM wParam, LPARAM lParam)
{
POSITION pos = m_listView.GetFirstSelectedItemPosition();
if (pos != NULL)
{
int item = m_ listView.GetNextSelectedItem(pos);
POINT point;
GetCursorPos(&point);
//自定义上下文化菜单
CMenuActive Menu(point, this);
Menu.InitMenu(MENU_ADD|MENU_EDIT|MENU_DELETE);
}
return 0;
}
这样就能完美的实现长按时弹出上下文菜单。