龙马谷

 找回密码
 立即注册

QQ登录

只需一步,快速开始

龙马谷VIP会员办理客服QQ:82926983(如果临时会话没有收到回复,请先加QQ好友再发。)
1 [已完结] GG修改器新手入门与实战教程 31课 2 [已完结] GG修改器美化修改教程 6课 3 [已完结] GG修改器Lua脚本新手入门教程 12课
4 [已完结] 触动精灵脚本新手入门必学教程 22课 5 [已完结] 手游自动化脚本入门实战教程 9课 6 [已完结] C++射击游戏方框骨骼透视与自瞄教程 27课
7 [已完结] C++零基础UE4逆向开发FPS透视自瞄教程 29课 8 [已完结] C++零基础大漠模拟器手游自动化辅助教程 22课 9 [已完结] C++零基础开发DXF内存脚本辅助教程 32课
以下是天马阁VIP教程,本站与天马阁合作,赞助VIP可以获得天马阁对应VIP会员,名额有限! 点击进入天马阁论坛
1 [已完结] x64CE与x64dbg入门基础教程 7课 2 [已完结] x64汇编语言基础教程 16课 3 [已完结] x64辅助入门基础教程 9课
4 [已完结] C++x64内存辅助实战技术教程 149课 5 [已完结] C++x64内存检测与过检测技术教程 10课 6 [已完结] C+x64二叉树分析遍历与LUA自动登陆教程 19课
7 [已完结] C++BT功能原理与x64实战教程 29课 8 [已完结] C+FPS框透视与自瞄x64实现原理及防护思路
查看: 5716|回复: 0

MFC的编辑框响应双击事件的三种方法

[复制链接]

11

主题

11

回帖

24

积分

编程入门

Rank: 1

龙马币
22

一. PreTranslateMessage结合位置信息法
在类中重写下面函数:
  1.           virtual BOOL PreTranslateMessage(MSG* pMsg) override
  2.       {
  3.         if (pMsg->message == WM_LBUTTONDBLCLK)
  4.         {
  5.           CEdit* ptr = (CEdit*)GetDlgItem(IDC_Edit);
  6.           CRect rect; ptr->GetWindowRect(&rect);
  7.           if (rect.PtInRect(pMsg->pt))
  8.           {
  9.             //具体事务
  10.           }
  11.         }
  12.         return CDialog::PreTranslateMessage(pMsg);
  13.       }
复制代码


二. 子类继承法
创建CMyEdit类, 并创建一个其变量, 且与使用的编辑框进行DDX关联, 接着写双击事件的代码, 如下:
  1. class CMyEdit : public CEdit
  2. {
  3. public:
  4.   DECLARE_MESSAGE_MAP()
  5.   afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
  6. };
  7. BEGIN_MESSAGE_MAP(CMyEdit, CEdit)
  8.   ON_WM_LBUTTONDBLCLK()
  9. END_MESSAGE_MAP()
  10. void CMyEdit::OnLButtonDblClk(UINT nFlags, CPoint point)
  11. {
  12.   // TODO:  在此添加消息处理程序代码和/或调用默认值
  13.   CEdit::OnLButtonDblClk(nFlags, point);
  14. }
复制代码


三. 子类发消息法
  1. class CMyEdit : public CEdit
  2. {
  3. protected:
  4.   virtual BOOL PreTranslateMessage(MSG * pMsg) override
  5.   {
  6.     if (pMsg->message == WM_LBUTTONDBLCLK)
  7.     {
  8.     //AfxWndProc接收BN_DOUBLECLICKED函数,并处理
  9.       AfxWndProc(
  10.         GetParent()->GetSafeHwnd(),
  11.         WM_COMMAND,
  12.         (WPARAM)((BN_DOUBLECLICKED << 16) | GetDlgCtrlID()),
  13.         (LPARAM)GetSafeHwnd());
  14.     }
  15.     return __super::PreTranslateMessage(pMsg);
  16.   }
  17. };
复制代码
或者使用:
  1. //PostMessage发送系统消息BN_DOUBLECLICKED并处理
  2. ::PostMessage(
  3.       GetParent()->GetSafeHwnd(),
  4.       WM_COMMAND,
  5.       (BN_DOUBLECLICKED << 16) | GetDlgCtrlID(),
  6.       (LPARAM)GetSafeHwnd());
复制代码

或者使用:
  1. protected:
  2.   virtual BOOL PreTranslateMessage(MSG * pMsg) override
  3.   {
  4.   //此PostMessage发送控件原生消息BN_DOUBLECLICKED并处理
  5.     if (pMsg->message == WM_LBUTTONDBLCLK)
  6.     {
  7.       if (m_hWnd)
  8.       {
  9.         ::PostMessage(
  10.           ::GetParent(m_hWnd),
  11.           WM_COMMAND,
  12.           (WPARAM)((EM_LBUTTONDBLCLK() << 16) | (WPARAM)::GetDlgCtrlID(m_hWnd)),
  13.           (LPARAM)GetSafeHwnd());
  14.       }
  15.     }
  16.     return __super::PreTranslateMessage(pMsg);
  17.   }
复制代码

可以使用下面的反射进行验证: 反射消息将先被编辑框捕获, 然后再传到其父类中去;

  1. protected:
  2.   BOOL On_EM_LBUTTONDBLCLK() { return 0; }

  3. protected:
  4.   DEFINE_MESSAGE_MAP_BGN()   
  5.   {
  6.     WM_COMMAND + WM_REFLECT_BASE, (WORD)CEdit_ResponseLButtonDblClick::EM_LBUTTONDBLCLK(), 0, 0, AfxSigCmd_b,
  7.       (AFX_PMSG)(static_cast<BOOL(AFX_MSG_CALL CCmdTarget::*)(void)> (&CEdit_ResponseLButtonDblClick::On_EM_LBUTTONDBLCLK))
  8.   },
复制代码

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

龙马谷| C/C++辅助教程| 安卓逆向安全| 论坛导航| 免责申明|Archiver|
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表龙马谷立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2018-2021 All Right Reserved.
在线客服
快速回复 返回顶部 返回列表