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

How can I remove the border on a Dialog Window with Dynamic Layout controls?

我有一个 WIN32 应用程序,它使用一个主对话框 window 作为背景,以及几个可以出现在主 window 前面的替代对话框。这些覆盖对话框不应该有任何边框,因为它们需要看起来是主 window 的一部分。 在我在覆盖对话框的控件上激活动态布局之前,一切都运行良好。然后它获得了一个带有阴影的细边框,一个有时是 windows 顶部栏颜色有时是白色的细顶部栏,并且对话框变得可以独立调整大小。我不想要这个,我希望覆盖对话框仅随主对话框 window 调整大小。 如何强制对话框无边框?

您可以在重写 OnInitDialog() 成员函数中修改对话框 window 的样式,前提是 window 是使用派生自的自定义 class 创建的CDialogCDialogEx,或类似的东西。 (如果没有,您将需要以某种方式 'intercept' window 的创建过程。)

假设您覆盖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;
}

注意:在尝试修改window的样式之前调用基础classOnInitDialog()很重要;否则,window 可能不会处于 'completed' 状态,并且您所做的任何更改都可能会被还原。


IInspectable 评论中所述,可能 可以(甚至更好)修改样式(去掉 WS_BORDER 属性) 在 PreCreateWindow() 函数的覆盖中:

BOOL MyDialog::PreCreateWindow(CREATESTRUCT &cs)
{
    if (!CDialog::PreCreateWindow(cs)) return FALSE;
    cs.style &= ~WS_BORDER;
    return TRUE;
}

同样,as shown here,您应该在 修改样式之前调用基础 class 成员

所以我原来的问题的答案是在调用基础 class.
之后将以下代码放在重载的 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, GWL_STYLE, wStyle); // And set the new style