CPropertySheet 只显示一秒钟

Posted

技术标签:

【中文标题】CPropertySheet 只显示一秒钟【英文标题】:CPropertySheet only shows for a second 【发布时间】:2015-03-13 14:20:11 【问题描述】:

我正在尝试将具有三个 CPropertyPages 的 CPropertySheet 添加到我的 MFC 应用程序中。我的问题是属性表只显示不到一秒钟然后关闭。当我在创建 CPropertySheet 后打开一个不同的模式对话框时,CPropertySheet 保持打开状态,我可以毫无问题地使用它。这是我的代码:

BOOL CSLIMOptCplusplusApp::InitInstance()


CWinApp::InitInstance();
SQLHENV m_1;
EnvGetHandle(m_1);


Login lgn;
lgn.DoModal();




CImageSheet*      imagedlg            = new CImageSheet("Image Capture Dialog" );
CImageDisplay*    pageImageDisplay    = new CImageDisplay;
CImageDimensions* pageImageDimensions = new CImageDimensions;
ListOption*       pageListOption      = new ListOption;

ASSERT( imagedlg );
ASSERT( pageImageDisplay );
ASSERT( pageImageDimensions );  
ASSERT( pageListOption );

imagedlg->AddPage( pageListOption);
imagedlg->AddPage( pageImageDimensions );
imagedlg->AddPage( pageImageDisplay );

imagedlg->Create( NULL,
              -1,
              WS_EX_CONTROLPARENT | WS_EX_TOOLWINDOW ); 

imagedlg->ShowWindow( SW_SHOW );

当我使用NULL 作为第一个参数时,我认为我的问题可能出在imagedlg->Create(。我遵循的教程使用this 代替NULL。但是,这给出了错误:

IntelliSense:“CSLIMOptCplusplusApp *”类型的参数与“CWnd *”类型的参数不兼容

我也试过imagedlg->Create();,它也只是闪了一下。 我希望我的 CPropertySheet 保持打开状态,直到它关闭。感谢您的帮助!

编辑: 这是我希望我的属性表看起来像的图像。我的第一个选项卡使用 ListControl 更改数据库选项,其他两个选项卡将执行其他操作。我的意图是保持对话框/属性表看起来和现在一样,但保持打开而不是关闭。

【问题讨论】:

我对您使用的窗口样式感到困惑。你的意图是什么? 我更新了图片和描述。我的意图是让三个选项卡在我的应用程序中执行三种不同的操作。我使用 CPropertySheet 而不是 TabControl,因为它允许我将设计器制作的对话框添加为页面。 那么,为什么要扩展窗口样式呢?您显示的代码的上下文是什么?它如何融入整个应用程序? 请见谅,但我不知道我使用的扩展窗口样式是什么意思。我展示的代码是在用户登录后创建主 CPropertySheet 并附加页面的代码。显示的屏幕截图是应用程序的主窗口。一切都将在这个窗口中完成,并带有几个模式弹出窗口。我更新了我的代码以显示我调用模式登录对话框的位置。用户登录后,我希望显示包含标签页的属性表。谢谢。 我还将尝试删除“应用”和“帮助”按钮。每个 CPropertyPage 都有自己的类,使我更容易处理应用程序。 【参考方案1】:

您的问题在于尝试在基于对话框的应用程序中构建属性表。实际上,您在 InitInstance 中执行所有内容的选择有时可能会出现问题。

对于初学者来说,没有必要在堆上创建所有对象(即使用“new”)。但是,如果那是你想要的,好吧。至于您最初的工作表只显示片刻的问题,InitInstance 旨在在没有另行通知的情况下立即返回。因此,您会看到一个实例的工作表。这是因为 MFC 需要一个有效指针,指向名为“m_pMainWnd”的 CWinApp 类派生成员变量(实际上是 CWinThread::m_pMainWnd)。如果要从 InitInstance 中启动属性表或主对话框,则需要将该变量设置为有效窗口。这是我写的一个快速示例:

CPropertySheet* m_pdlgPropertySheet = new CPropertySheet(_T("Simple PropertySheet"));
    ASSERT(m_pdlgPropertySheet);

    // Add three pages to the CPropertySheet object.  Both m_pstylePage,  
    // m_pcolorPage, and m_pshapePage are data members of type  
    // CPropertyPage-derived classes in CView-derived class.
    Page1* m_pstylePage = new Page1;
    m_pstylePage->Construct(IDD_DIALOG1);
    Page2* m_pcolorPage = new Page2;
    m_pcolorPage->Construct(IDD_DIALOG2);
    m_pdlgPropertySheet->AddPage(m_pstylePage);
    m_pdlgPropertySheet->AddPage(m_pcolorPage);

    m_pMainWnd = m_pdlgPropertySheet;
    INT_PTR nResponse = m_pdlgPropertySheet->DoModal();

注意 DoModal 上面的行。如果您需要更多信息,请查看Creating a full application using the CPropertySheet。最后,您可能想了解 MFC 如何启动应用程序以及预期的内容。

【讨论】:

感谢您的回答。我确实在那里犯了一个错误。我通过将m_pMainWnd 设置为我的属性表并使用INT_PRT nResponse = 进行了您所说的更改。窗口仍然打开然后关闭。在进一步的研究中,我可能需要至少一个模态窗口。我现在正在尝试找到如何将窗口设置为模态而不是无模态。 将每个页面的“系统模式”属性设置为 true 无效。 我找到了一种解决方案,但对我来说没有意义。在 InitInstance() 结束时,我做了return TRUE。当我使用 Create() 而不是 DoModal() 创建窗口时,这会使我的窗口保持打开状态。 我建议您使用我发布的示例或文章链接作为代码的起点。我认为你添加的代码比你真正需要的要多。 虽然接受的答案会起作用,但我认为归结为为什么您需要无模式属性表?如果这不是必需的,则应使用模态处理。更好地了解Life Cycle of a Dialog Box 可能会帮助您确定您真正需要的。

以上是关于CPropertySheet 只显示一秒钟的主要内容,如果未能解决你的问题,请参考以下文章

为啥老是会出现由于 cpro.baidu.com 响应时间过长,导致“360安全浏览器”无法加载网页。

MFC之向导页和属性页(CPropertyPage/CPropertySheet)

(MFC)CPropertySheet的生成

如何在继续之前暂停我的 shell 脚本一秒钟?

MFC:如何识别对话框是不是是使用 CPropertySheet 或 CTabCtrl 创建的

在 MFC CPropertySheet 中添加 ActiveX 控件的问题(Windows 7 64 位和 Windows 2008 Server)