微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用动态布局控件删除对话框窗口上的边框?

如何解决如何使用动态布局控件删除对话框窗口上的边框?

我有一个 WIN32 应用程序,它使用一个主对话框窗口作为背景,还有几个可以出现在主窗口前面的替代对话框。这些覆盖对话框不应有任何边框,因为它们需要显示为主窗口的一部分。 一切正常,直到我在叠加对话框中的控件上激活动态布局。然后它获得了一个带有阴影的细边框,一个细的顶部栏,有时是窗口顶部栏的颜色,有时是白色,对话框变得独立可调整大小。我不想要这个,我希望覆盖对话框只在主对话框窗口中调整大小。 如何强制对话框无边框?

解决方法

您可以在覆盖 OnInitDialog() 成员函数时修改对话框窗口的样式,如果该窗口是使用派生自 CDialogCDialogEx 的自定义类创建的,或者其他相似的。 (如果没有,您需要以某种方式“拦截”窗口的创建过程。)

假设您已经覆盖了 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 举报,一经查实,本站将立刻删除。