2015-03-13 130 views
0

我想添加一个CPropertySheet与三个CPropertyPages到我的MFC应用程序。我的问题是,属性表只显示不到一秒钟,然后关闭。当我在创建CPropertySheet后打开不同的模式对话框时,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); 

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

IntelliSense: argument of type "CSLIMOptCplusplusApp *" is incompatible with parameter of type "CWnd *"

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

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

+1

我很困惑你正在使用的窗口样式。你的意图是什么? – rrirower 2015-03-13 15:15:34

+0

我更新了图片和说明。我的意图是有三个选项卡在我的应用程序中执行三种不同的操作。我使用CPropertySheet而不是TabControl,因为它允许我将设计器制作的对话框添加为页面。 – 2015-03-13 15:24:53

+1

那么,为什么扩展窗口的样式?你显示的代码的上下文是什么?它如何适合整个应用程序? – rrirower 2015-03-13 15:28:28

回答

1

你的问题在于试图在基于对话框的应用程序中构造属性表。实际上,您在InitInstance中执行所有操作的选择有时可能会有问题。

对于初学者来说,不需要在堆上创建所有对象(即使用'new')。但是,如果这就是你想要的,好的。至于你的原始问题只会显示片刻,InitInstance被设计为如果没有告知其他情况立即返回。因此,您可以看到实例的工作表。这是由于MFC期望有一个有效的指向CWinApp类派生成员变量的名为'm_pMainWnd'(实际上是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如何启动应用程序以及期望的内容。

+0

谢谢你你的答案。我在那里犯了一个错误。我通过将'm_pMainWnd'设置为属性表并使用'INT_PRT nResponse ='进行了修改。窗口仍然打开,然后关闭。在进一步的研究中,可能需要至少一个模态窗口。我现在试图找到如何设置窗口而不是无模式的模式。 – 2015-03-13 17:34:34

+0

将每个页面的属性“System Modal”设置为true都不起作用。 – 2015-03-13 17:38:20

+0

我找到了一个解决方案,但对我来说没有意义。在InitInstance()的末尾,我做了'返回TRUE'。当我使用'Create()'而不是'DoModal()'创建窗口时,这将保持我的窗口打开。 – 2015-03-13 17:50:01