如何使用动态布局控件删除对话框 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 创建的CDialog
或 CDialogEx
,或类似的东西。 (如果没有,您将需要以某种方式 '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
我有一个 WIN32 应用程序,它使用一个主对话框 window 作为背景,以及几个可以出现在主 window 前面的替代对话框。这些覆盖对话框不应该有任何边框,因为它们需要看起来是主 window 的一部分。 在我在覆盖对话框的控件上激活动态布局之前,一切都运行良好。然后它获得了一个带有阴影的细边框,一个有时是 windows 顶部栏颜色有时是白色的细顶部栏,并且对话框变得可以独立调整大小。我不想要这个,我希望覆盖对话框仅随主对话框 window 调整大小。 如何强制对话框无边框?
您可以在重写 OnInitDialog()
成员函数中修改对话框 window 的样式,前提是 window 是使用派生自的自定义 class 创建的CDialog
或 CDialogEx
,或类似的东西。 (如果没有,您将需要以某种方式 '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