WinCE识别触摸笔的右键点击

来源:互联网 发布:网络机顶盒免费软件app 编辑:程序博客网 时间:2024/05/17 21:38

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;

}

这样就能完美的实现长按时弹出上下文菜单。

原创粉丝点击