c++ - 如何在 MFC 自定义控件中设置控件焦点

标签 c++ mfc

专家!

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

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

enter image description here

不过,我有一些问题,请留言

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

enter image description here

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

但是在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);

最佳答案

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

控制它的最简单方法是使您的父控件成为从 CDialog 派生的窗口,或者如果它是从 CFormView 派生的 View 。 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 是更好的方法,因为它也解决了其他“关于对话框的问题”。包括失去和获得焦点和激活...

关于c++ - 如何在 MFC 自定义控件中设置控件焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49402061/

相关文章:

c++ - 指向两种不同类型 vector 的指针

c++ - 打开 cv 3.2.0 时出现苹果 mach-O 链接器 (id) 错误

C++11构造函数继承和纯虚方法

c++ MFC 和处理 windows 消息

c++ - Chromium 嵌入式框架 - 将 CSS/JS 附加/注入(inject)到页面(C++ - MFC)

c++ - visual studio 2005 到 2010 有 boost

c++ - MFC 中的 CEdit 和 GetwindowText

c++ - 静态链接 MFC 时未修改的 Visual Studio 2012 MFC 模板中的链接错误

c++ - 创建以 C (MFC) 格式化的字符串

c++ - Qt -> 从 Gui->Thread->Qtimer 设置值