显示最初隐藏的无模型对话框

Posted

技术标签:

【中文标题】显示最初隐藏的无模型对话框【英文标题】:Show modelless dialog initially hidden 【发布时间】:2016-09-29 13:13:45 【问题描述】:

我有无模型的子对话框。在资源属性中可见标志设置为真。(根据我在资源属性中的要求可见标志应该为真)。

我想在初始显示时以编程方式隐藏对话框。

我使用下面的代码覆盖了 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);  
    

请任何人帮助我实现我的要求

【问题讨论】:

ShowWindow(hWnd, SW_HIDE); 应该这样做。欲了解更多详情,请访问link @Tushar:仅消息窗口的哪些功能应该有助于解决这个问题? 如果我在 OnInitdialog 中调用 ShowWindow(hWnd, SW_HIDE),对话框不会被隐藏 你不能只创建对话框,一旦它应该变得可见。 【参考方案1】:

你也可以覆盖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);

【讨论】:

【参考方案2】:

你不清楚你想要什么。您的标题说您希望最初隐藏对话框。然后问题中的文字说您希望它最初可见然后隐藏。这是哪个/

您的要求是什么意思说对话框样式必须是 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...

【讨论】:

重要的区别不在于 heapstack,而在于 dynamic storage duration自动存储期限.

以上是关于显示最初隐藏的无模型对话框的主要内容,如果未能解决你的问题,请参考以下文章

从 mfc 扩展 dll 导出的无模式对话框不显示

最初显示的 jQuery 模式对话框验证器

Eric IDE,Qt 文件对话框:显示隐藏文件

显示/隐藏对话框的最佳方法

如何在网格中显示列并将其隐藏在视图对话框中

在 Angular 材质垫对话框中隐藏/显示列