【问题标题】:How to set control focus inside an MFC custom control如何在 MFC 自定义控件中设置控件焦点
【发布时间】:2018-03-21 09:06:31
【问题描述】:

专家!

我正在使用一个继承 CWnd 的类来使用水平滚动条使内容可见

我要创建的控件如下所示:

不过,我有一些问题,留下一个问题

当按钮获得焦点时,它会变为蓝色。如果按下另一个按钮,则接收到现有焦点的按钮应该没有焦点。

按钮没有释放焦点,如第二张图片所示。

但是,上述问题是在Dialog中实现时出现的,而不是在SDI中。

我需要帮助解决这个问题。

自定义控件创建代码;

m_ScrollWnd.Create(WS_CHILD | WS_VISIBLE, CRect(0, 0, 0, 0), this, 1234);

BOOL CScrollWnd::Create(DWORD dwStyle, CRect &rect, CWnd *pParent, UINT nID)
{
    dwStyle |= ((WS_HSCROLL) );

    return CWnd::Create(CScrollWnd::IID, nullptr, dwStyle, rect, pParent, nID);
}


m_Button3.Create(_T("Hello3"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(0, 0, 0, 0), this, 1238);

【问题讨论】:

  • 另一个问题是WS_EX_CONTROLPARENT 标志没有被使用,所以用户将不能TAB 进出滚动窗口。修复:m_ScrollWnd.CreateEx(WS_EX_CONTROLPARENT, ...);

标签: c++ mfc


【解决方案1】:

所谓的“默认按钮处理”是由一个名为IsDialogMessage的函数完成的。

控制它的最简单方法是使您的父控件成为派生自CDialog 的窗口,或者如果它是派生自CFormView 的视图。 MFC 将在适当的PreTranslateMessage 处理程序中为您处理所有这些。

如果您想自己执行此操作,您可以插入自己的 PreTranslateMessage 处理程序并使用 IsDialogMessageCWnd 类还有一个名为 CWnd::PreTranslateInput 的预定义实现。

所以这可能就足够了:

BOOL CYourParentClass::PreTranslateMessage(MSG* pMsg)
{
    // allow standard processing
    if (__super::PreTranslateMessage(pMsg))
        return TRUE;
    return PreTranslateInput(pMsg);
}

在我看来,使用CFormView / CDialog 是更好的方法,因为它还解决了其他“关于对话框的问题”。包括失去和获得焦点和激活......

【讨论】:

    【解决方案2】:

    MSDN官方文档:Dialog Box Keyboard Interface

    顺便说一句,xMRi 解释得很好。

    【讨论】:

      猜你喜欢
      • 2018-01-11
      • 2014-02-20
      • 1970-01-01
      • 2012-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多