Winapi 如何删除带有动态布局控件的对话框窗口上的边框?

Winapi 如何删除带有动态布局控件的对话框窗口上的边框?,winapi,visual-c++,layout,dynamic,mfc,Winapi,Visual C++,Layout,Dynamic,Mfc,我有一个WIN32应用程序,它使用一个主对话框窗口作为背景,还有几个可选对话框可以出现在主窗口前面。这些覆盖对话框不应有任何边框,因为它们需要显示为主窗口的一部分。 在我在覆盖对话框中激活控件的动态布局之前,一切都很顺利。然后,它获得了一个带有阴影的薄边框,一个薄的顶部栏,有时是windows顶部栏的颜色,有时是白色,对话框可以独立调整大小。我不想这样,我想覆盖对话框的大小只与主对话框窗口。 如何强制对话框没有边框?如果对话框窗口是使用从CDialog或CDialogEx或类似内容派生的自定义类

我有一个WIN32应用程序,它使用一个主对话框窗口作为背景,还有几个可选对话框可以出现在主窗口前面。这些覆盖对话框不应有任何边框,因为它们需要显示为主窗口的一部分。 在我在覆盖对话框中激活控件的动态布局之前,一切都很顺利。然后,它获得了一个带有阴影的薄边框,一个薄的顶部栏,有时是windows顶部栏的颜色,有时是白色,对话框可以独立调整大小。我不想这样,我想覆盖对话框的大小只与主对话框窗口。
如何强制对话框没有边框?

如果对话框窗口是使用从
CDialog
CDialogEx
或类似内容派生的自定义类创建的,则可以在重写
OnInitDialog()成员函数时修改对话框窗口的样式。(如果没有,则需要以某种方式“拦截”窗口的创建过程。)

假设您已重写了OnInitDialog()
,则该过程将遵循以下原则:

BOOL MyDialog::OnInitDialog()
{
BOOL answer=CDialog::OnInitDialog();//调用基类
LONG_PTR wStyle=GetWindowLongPtr(m_hWnd,GWL_样式);//获取当前样式
wStyle&=~WS\u BORDER;//在这里,我们屏蔽了要删除的样式位
SetWindowLongPtr(m_hWnd,GWL_STYLE,wStyle);//并设置新样式
//…需要的其他代码。。。
返回答案;
}
注意:在尝试修改窗口样式之前,调用基类
OnInitDialog()
非常重要;否则,窗口可能不会处于“完成”状态,您所做的任何更改都可能会被还原


如注释中所述,在重写
PreCreateWindow()
函数时,可以(甚至更好)修改样式(去掉
WS\u BORDER
属性):

BOOL MyDialog::PreCreateWindow(CREATESTRUCT&cs)
{
if(!CDialog::PreCreateWindow(cs))返回FALSE;
cs.style&=~WS\u边框;
返回TRUE;
}

同样,您应该在修改样式之前调用基类成员。

因此,我最初的问题的答案是在调用基类之后,将以下代码放入重载的OnInitDialog()中。
LONG_PTR wStyle=GetWindowLongPtr(m_hWnd,GWL_样式);//获取当前样式

wStyle&=~WS\u SIZEBOX;//掩盖我们不想要的样式位


SetWindowLongPtr(m_-hWnd,GWL_风格,wStyle);//并设置新样式

我还没有检查这个,但是最好在覆盖中修改窗口样式。这将确保每个人在一个窗口的生命周期中都看到相同的样式。@IInspectable是的-这可能是一个更普遍的选择。但是,我不完全确定MFC框架在以后的基类例程(例如
OnInitDialog()
)中修改样式时会有什么技巧。谢谢您的建议。我尝试了PreCreateWindow()和OnInitDialog()(注意先调用基类函数),但两者都不起作用。我仍然得到令人讨厌的边框。@Hmmm。请尝试将样式(end-ex-style)显式设置为仅需要的那些标志。或者阅读这些值,看看它们被设置为什么?谢谢你的建议。这段代码解决了这个问题LONG_PTR wStyle=GetWindowLongPtr(m_hWnd,GWL_样式);//获取当前样式wStyle&=(~WS_SYSMENU&&WS_SIZEBOX);//在这里,我们屏蔽了要删除SetWindowLongPtr的样式位(m_hWnd,GWL_style,wStyle);//设置新样式`有趣的是,更正前的wStyle值为0x840c004c,但没有列出下面四个字节的任何函数。这在大部分情况下重复了另一个答案,只是它将
WS_BORDER
替换为
WS_SIZEBOX
(对于可调整大小的边框,与
WS_THICKFRAME
相同)并删除问题中未询问的系统菜单。您可以单击复选标记接受您想要的答案。谢谢您的建议。我仍在学习正确使用这个网站。我已编辑我的答案并单击复选标记。我想给出一个明确的答案,以防其他人也有同样的问题。我觉得完全重申这一点很重要,因为之前的回答都没有任何影响。