如何解决如何使用动态布局控件删除对话框窗口上的边框?
我有一个 WIN32 应用程序,它使用一个主对话框窗口作为背景,还有几个可以出现在主窗口前面的替代对话框。这些覆盖对话框不应有任何边框,因为它们需要显示为主窗口的一部分。 一切正常,直到我在叠加对话框中的控件上激活动态布局。然后它获得了一个带有阴影的细边框,一个细的顶部栏,有时是窗口顶部栏的颜色,有时是白色,对话框变得独立可调整大小。我不想要这个,我希望覆盖对话框只在主对话框窗口中调整大小。 如何强制对话框无边框?
解决方法
您可以在覆盖 OnInitDialog()
成员函数时修改对话框窗口的样式,如果该窗口是使用派生自 CDialog
或 CDialogEx
的自定义类创建的,或者其他相似的。 (如果没有,您需要以某种方式“拦截”窗口的创建过程。)
假设您已经覆盖了 OnInitDialog()
,则过程将按照以下方式进行:
BOOL MyDialog::OnInitDialog()
{
BOOL answer = CDialog::OnInitDialog(); // Call base class stuff
LONG_PTR wStyle = GetWindowLongPtr(m_hWnd,GWL_STYLE); // Get the current style
wStyle &= ~WS_BORDER; // Here,we mask out the style bit(s) we want to remove
SetWindowLongPtr(m_hWnd,GWL_STYLE,wStyle); // And set the new style
// ... other code as required ...
return answer;
}
注意:在尝试修改窗口样式之前调用基类 OnInitDialog()
很重要;否则,窗口可能不会处于“已完成”状态,并且您所做的任何更改都可能会被还原。
正如 IInspectable 在评论中提到的那样,可能可以(甚至更好)修改样式(去掉 WS_BORDER
属性)以覆盖PreCreateWindow()
函数:
BOOL MyDialog::PreCreateWindow(CREATESTRUCT &cs)
{
if (!CDialog::PreCreateWindow(cs)) return FALSE;
cs.style &= ~WS_BORDER;
return TRUE;
}
同样,as shown here,您应该在修改样式之前调用基类成员。
,所以我原来的问题的答案是在调用基类之后将以下代码放在重载的 OnInitDialog() 中。LONG_PTR wStyle = GetWindowLongPtr(m_hWnd,GWL_STYLE); // Get the current style
wStyle &= ~WS_SIZEBOX; // Mask out the style bit(s) we don't want
SetWindowLongPtr(m_hWnd,wStyle); // And set the new style
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。