EVC长按鼠标左键的消息处理解决办法

今天在弄EVC(我的环境是EVC4.0 SP4)下编写应用程序,其中需要用到长按鼠标左键弹出菜单的消息处理(因为对于智能手机来说没有鼠标,该事件对应触笔长点屏幕),在网上找了一些资料,都说用WM_RBUTTONDOWN这个消息来做,但是这样做后只相应鼠标右键的消息,不响应长按鼠标左键的消息。同事说重载CDialog的PreTranslateMessage()函数来捕获WM_CONTEXTMENU消息来处理,通过EVC的ClassWizard重载了PreTranslateMessage(),函数测试实现部分如下:

BOOL CMediaFileList::PreTranslateMessage(MSG* pMsg)
{
      if ( pMsg->message==WM_CONTEXTMENU)
      {
           CRect rect;
           this->GetWindowRect( &rect );

           m_m3uMenu->TrackPopupMenu( TPM_CENTERALIGN,
                        rect.right-100,
                        rect.bottom-200,
                        this);

      }

      return CDialog::PreTranslateMessage(pMsg);
}

        编译链接都通过了,在模拟器上一运行,长按鼠标左键,终于看到弹出的菜单了,但是很快我就发现这样处理后每次长按鼠标左键后会连续弹出四次该菜单,通过将弹出菜单用AfxMessageBox()弹出提示信息可更加直观。

        后来想想既然有WM_CONTEXTMENU消息,为什么不直接用呢,于是去看Dialog已经定义的消息队列是否有WM_CONTEXTMENU,找到后看了帮助看这个消息的使用。通过EVC的ClassWizard给你需要添加该消息处理的类添加WM_CONTEXTMENU消息的Function,在该类的.cpp文件中就会生成函数OnContextMenu,但是编译时候就有错误:提示的是说OnContextMenu()没有定义,感到很纳闷,EVC的MFC既然已经定义了该消息,而且我也已经链接好了MFC的库了,为什么这里会报没有定义消息处理函数的错误,后来想到自己自定义消息的时候在消息映射声明中的声明方法,于是做出如下处理:

     1、在该类的.cpp文件中的消息映射声明中将ON_WM_CONTEXTMENU()删除
     2、在消息映射声明中添加:ON_MESSAGE( WM_CONTEXTMENU, OnContextMenu)
     3、在OnContesMenu()中添加弹出菜单的处理代码

        再次编译没有错误,链接也很顺利的通过了,在模拟器上运行该应用程序,长按鼠标左键终于实现了预期的结果,不会想重载PreTranslateMessage()函数时会一次弹出四次的现象了,重载PreTranslateMessage()会弹出四次的原因我想是因为MFC本来已经预处理了这个消息,我又重新处理了一次在其中可以就会重复的调用相关的函数,具体的原因还在深究中。

 

你可能感兴趣的:(WinCE)