我有无模型儿童对话框。在资源属性中,Visible标志设置为true。(根据我在资源属性中的要求,visible flag应为true)。
我想在最初显示时以编程方式隐藏对话框。
我覆盖了presubclasswindow并使用下面的代码删除了WS_VISIBLE标志,但对话框没有被隐藏。
void CAddressChildDlg::PreSubclassWindow()
{
CWnd::PreSubclassWindow();
if (::IsWindow(m_hWnd))
{
LONG lStyle = GetWindowLong(m_hWnd, GWL_STYLE);
lStyle &= ~WS_VISIBLE;
SetWindowLong(m_hWnd, GWL_STYLE, lStyle);
}
}
请有人帮我实现我的要求
答案 0 :(得分:1)
你不清楚你想要什么。你的标题说你想最初隐藏对话框。然后问题中的文字说你希望它最初可见,然后隐藏。这是/
您的要求是什么意思说对话框样式必须是WS_VISIBLE。如果你想让它最初不可见,那么不要包含旗帜。
对于无模式对话框,通常在堆上创建它们,而模式对话框通常在堆栈上创建。
CYourDialog* pDlg = new CYourDialog(... and whatever arguments);
pDlg->Create(CYourDialog::IDD); // or whatever the ID is...
pDlg->ShowWindow(SW_NORMAL); // shows window if it was invisible...
pDlg->ShowWindow(SW_HIDE); // hides window if it was visible...
答案 1 :(得分:0)
您也可以覆盖ON_WM_WINDOWPOSCHANGING
class CMyDialog : public CDialog
{
public:
bool m_override_showwindow;
//initialize somewhere ...
void OnWindowPosChanging(WINDOWPOS* wpos)
{
if (m_override_showwindow)
wpos->flags &= ~SWP_SHOWWINDOW;
CDialog::OnWindowPosChanging(wpos);
}
DECLARE_MESSAGE_MAP()
...
};
BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
ON_WM_WINDOWPOSCHANGING()
...
END_MESSAGE_MAP()
仅在您不希望它显示对话框时才启用此覆盖。确保禁用覆盖,否则从不显示对话框。
dlg.m_override_showwindow = true;
dlg.Create(...);
dlg.m_override_showwindow = false;
MessageBox(L"Test...");
dlg.ShowWindow(SW_SHOW);