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 或 CTabCtrl 创建的
在 MFC CPropertySheet 中添加 ActiveX 控件的问题(Windows 7 64 位和 Windows 2008 Server)