【问题标题】:C++ MFC EditBox Handling Double ClickC++ MFC EditBox 处理双击
【发布时间】:2018-10-05 05:01:14
【问题描述】:

我的场景如下:

  1. 我有一个 CDialog 类,其中包含两个 EditBox 控件,假设它是 IDC_EB1 和 IDC_EB2。
  2. 我希望能够在 IDC_EB1 和 IDC_EB2 上监听双击事件以打开 FileDialog 并在 IDC_EB1 和 IDC_EB1 上显示选定的文件位置。
  3. IDC_EB1 和IDC_EB2 是通过DDX Control 机制做的,并存储到各自的成员变量中。
  4. 为了处理双击事件,成员变量类型是 CMyEdit(派生自 CEdit)。

对话框运行,当我双击 IDC_EB1 或 IDC_EB2 进行浏览时,我能够打开一个 FileDialog。问题出在 CMyEdit 内部,我不再知道哪个 EditBox 触发了双击事件以显示从 FileDialog 中选择的文件路径。

解决这个问题的好方法是什么?我正在运行 Visual Studio 2010 SP1。

PS:有一个 MfcEditBrowse 控件可以很好地解决上述问题,但它不符合我的需要,因为计划是在我的程序的各个阶段重用这个 CDialog 窗口,显然你不能多次调用 DoModal具有 MfcEditBrowse 控件的对话框。该对话框中的 MfcEditBrowse 控件将引发断言失败(显然根据我在 Microsoft 文档中找到的已知问题)。

【问题讨论】:

  • “显然你不能多次调用 DoModal” 这不是真的。模态对话框暂时禁用父对话框,直到它关闭,你可以一次又一次地调用它。
  • “显然根据我在 Microsoft 文档中找到的已知问题” - 请提供链接作为参考。

标签: c++ mfc


【解决方案1】:

我不再知道是哪个 EditBox 触发了双击事件以显示从 FileDialog 中选择的文件路径。

您可以使用 CWnd::ChildWindowFromPoint(point),它将在 OnLButtonDblClk() 的主体内返回单击的子控件。

【讨论】:

  • 你必须从CEdit 派生一个类来捕捉WM_LBUTTONDBLCLK 消息的编辑控件。 ChildWindowFromPoint 将是多余的。
  • 不,您不需要从 CEdit 派生类,而是从 CDialog 派生类的 OnLButtonDblClk 派生。如果您从 CEdit 派生了一个类,那么您将对两个子控件进行单独的事件处理。
  • 在这种情况下父窗口不会收到子窗口的鼠标消息。您的解决方案不清楚。
  • @BarmakShemirani 很明显,他将在 CDialog 或 CEdit 派生类中实现,通过提供 OnLButtonDblClk 实现来执行双击操作。在那里,他可以调用 CWnd::ChildWindowFromPoint(point) 以获取单击了哪个按钮并启动相应的对话框。正如他提到的 CMyEdit 派生自 CEdit 所以 OnLButtonDblClk 的 CMyEdit 类。
【解决方案2】:
  1. 您知道双击处理程序中的 ID。只需从消息处理程序中调用 GetDlgCtrlID
  2. 您可以轻松地向 CMyEdit 添加一些数据,以便轻松识别双击动作的控件
  3. 您可以在双击时从 CMyEdit 向父级发送 WM_COMMAND 消息,其余的由父级处理。父级通过其 Id 知道控件,并且应该知道该做什么。

【讨论】:

  • “您知道双击处理程序中的 ID...” - 这是不正确的。 CWnd::OnLButtonDblClk 消息处理程序具有以下签名:afx_msg void OnLButtonDblClk( UINT nFlags, CPoint point)。控件 ID 不会立即在此处可用。
  • 为 GetDlgCtrlID 添加提示
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多