【问题标题】:How to implement the event handler for a MFC CEdit ON_EN_SETFOCUS?如何实现 MFC CEdit ON_EN_SETFOCUS 的事件处理程序?
【发布时间】:2013-04-09 16:25:33
【问题描述】:

我只是在维护一些 MFC C++ 代码,并且我有一个包含许多 CEdit 对象的屏幕。

我想为那时的所有人实现OnFocus 事件,但只编写一种方法来处理该事件。

为此,我需要知道触发事件的 CEdit ID,但看起来 MFC 中 OnFocus 事件的实现没有此作为参数(与 @987654325 等其他一些事件相比@ 具有 CWnd* 对象作为参数)。

我只是拒绝相信我必须为每个单独的CEdit 实现一个小方法,将其 ID 传递给将做我想做的事情的主要方法!。如果这是唯一的解决方案,那你 MFC 真丢脸!

【问题讨论】:

    标签: c++ mfc


    【解决方案1】:

    ON_CONTROL_RANGE macro 的存在正是为了允许将单个处理程序映射到多个控件上的同一事件。

    首先,您需要确保控件 ID 是连续的。 然后在标题中,您需要声明一个以控件 ID 作为参数的处理程序:

    afx_msg void OnSetFocusMulti(UINT ctrlId);
    

    这允许您在需要时区分处理程序中的发送者控件。

    现在您需要将其添加到消息映射中,而不是一堆 ON_EN_SETFOCUS(IDC_EDIT1, &CMyDlg::OnSetfocus)

    ON_CONTROL_RANGE(EN_SETFOCUS, IDC_EDIT1, IDC_EDIT_X, OnEnSetFocusMulti)
                          ^           ^          ^             ^
    //       notification code | first ctrl | last ctrl |   the handler
    

    记录了其他消息映射宏here

    【讨论】:

    • 是的,工作,非常感谢!有大量的手动工作来整理 ID,但是一旦我完成了,主要来源就变得更加整洁了!
    • 很高兴听到这个消息。是的,处理 ID 有时真的很麻烦,特别是如果项目中有多个人手动更改它们并且逻辑依赖于它们是连续的。
    猜你喜欢
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    相关资源
    最近更新 更多