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

一. PreTranslateMessage结合位置信息法
在类中重写下面函数:

   virtual BOOL PreTranslateMessage(MSG* pMsg) override
      {
        if (pMsg->message == WM_LBUTTONDBLCLK)
        {
          CEdit* ptr = (CEdit*)GetDlgItem(IDC_Edit);
          CRect rect; ptr->GetWindowRect(&rect);
          if (rect.PtInRect(pMsg->pt))
          {
            //具体事务
          }
        }
        return CDialog::PreTranslateMessage(pMsg);
      }

二. 子类继承法
创建CMyEdit类, 并创建一个其变量, 且与使用的编辑框进行DDX关联, 接着写双击事件的代码, 如下:

class CMyEdit : public CEdit
{
public:
  DECLARE_MESSAGE_MAP()
  afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
};
BEGIN_MESSAGE_MAP(CMyEdit, CEdit)
  ON_WM_LBUTTONDBLCLK()
END_MESSAGE_MAP()
void CMyEdit::OnLButtonDblClk(UINT nFlags, CPoint point)
{
  // TODO:  在此添加消息处理程序代码和/或调用默认值
  CEdit::OnLButtonDblClk(nFlags, point);
}

三. 子类发消息法

class CMyEdit : public CEdit
{
protected:
  virtual BOOL PreTranslateMessage(MSG * pMsg) override
  {
    if (pMsg->message == WM_LBUTTONDBLCLK)
    {
    //AfxWndProc接收BN_DOUBLECLICKED函数,并处理
      AfxWndProc(
        GetParent()->GetSafeHwnd(),
        WM_COMMAND,
        (WPARAM)((BN_DOUBLECLICKED << 16) | GetDlgCtrlID()),
        (LPARAM)GetSafeHwnd());
    }
    return __super::PreTranslateMessage(pMsg);
  }
};

或者使用:

//PostMessage发送系统消息BN_DOUBLECLICKED并处理
::PostMessage(
      GetParent()->GetSafeHwnd(),
      WM_COMMAND,
      (BN_DOUBLECLICKED << 16) | GetDlgCtrlID(),
      (LPARAM)GetSafeHwnd());

或者使用:

protected:
  virtual BOOL PreTranslateMessage(MSG * pMsg) override
  {
  //此PostMessage发送控件原生消息BN_DOUBLECLICKED并处理
    if (pMsg->message == WM_LBUTTONDBLCLK)
    {
      if (m_hWnd)
      {
        ::PostMessage(
          ::GetParent(m_hWnd),
          WM_COMMAND,
          (WPARAM)((EM_LBUTTONDBLCLK() << 16) | (WPARAM)::GetDlgCtrlID(m_hWnd)),
          (LPARAM)GetSafeHwnd());
      }
    }
    return __super::PreTranslateMessage(pMsg);
  }

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

protected:
  BOOL On_EM_LBUTTONDBLCLK() { return 0; }

protected:
  DEFINE_MESSAGE_MAP_BGN()    
  {
    WM_COMMAND + WM_REFLECT_BASE, (WORD)CEdit_ResponseLButtonDblClick::EM_LBUTTONDBLCLK(), 0, 0, AfxSigCmd_b, 
      (AFX_PMSG)(static_cast<BOOL(AFX_MSG_CALL CCmdTarget::*)(void)> (&CEdit_ResponseLButtonDblClick::On_EM_LBUTTONDBLCLK))
  },

文章转载自:MFC的编辑框响应双击事件的三种方法 - C/C++技术分享龙马谷

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值