Win32对话框应用程序:如何使对话框在启动时隐藏?

4
我有一个Win32应用程序,它使用DialogBox()来显示其主窗口。
现在我想让这个应用程序启动时对话框不可见,并稍后使用SetWindowPos(hDlg, HWND_TOPMOST, ...将其设置为可见。
不幸的是,

http://msdn.microsoft.com/en-us/library/ms645452(VS.85).aspx

该函数显示对话框框(不管模板是否指定了WS_VISIBLE样式)。

...看起来使用DialogBox()没有办法做到这一点。

我可以在WM_INITDIALOG处理程序中的对话框过程中添加一个调用SetWindowPos(hDlg, HWND_NOTOPMOST...

...但我担心在系统负载较重时,对话框框会短暂地出现然后消失,产生难看的闪烁效果。

有没有一种通过DialogBox()创建我的对话框框而不显示它的方法?


你能绕过DialogBox直接使用CreateWindowEx等吗? - YWE
@YWE:我不确定。MSDN说DialogBox()在内部使用CreateWindowEx(),所以应该是可能的。我的对话框过程期望诸如WM_INITDIALOG之类的消息,并进行诸如SendDlgItemMessage()之类的对话框调用:如果我使用CreateWindowEx(),不确定所有这些是否仍然有效。 - Simon Elliott
@Hans Passant:我希望创建对话框,处理消息,保留一些状态,然后在需要时变为可见。正如您所建议的那样,我可能需要包含一个消息循环。这没什么大不了的,但我本来希望避免额外的代码行。 - Simon Elliott
2
我也不理解。写代码,难道不是他们付钱给你的工作吗?赶紧去写吧。 - Hans Passant
1
我和汉斯在一起。我不明白问题出在哪里。通过发送消息并调用“DialogBox(...)”来显示对话框。 - selbie
显示剩余2条评论
2个回答

3

0

我在使用这个技巧时取得了一些成功

void CMyDlg::OnWindowPosChanging(WINDOWPOS* lpWndPos)
{
    // hide dialog
    lpWndPos->flags &= ~SWP_SHOWWINDOW;
    CDialog::OnWindowPosChanging(lpWndPos);
}

这里开始


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接