专家!
我正在使用一个继承 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);
最佳答案
所谓的“默认按钮处理”是由名为 IsDialogMessage
的函数完成的。
控制它的最简单方法是使您的父控件成为从 CDialog
派生的窗口,或者如果它是从 CFormView
派生的 View 。 MFC 将在适当的 PreTranslateMessage
处理程序中为您处理所有这些。
如果您想自己完成此操作,您可以插入自己的 PreTranslateMessage
处理程序并使用 IsDialogMessage
。 CWnd
类还有一个名为 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/