2014-06-20 62 views
0

我有一个从CFormView派生的子窗口。在OnCreate()函数的某些条件下,我想关闭此窗口。关闭子窗口时避免MessageBox

我试过2种选择:

int CFilterWindow::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{ 
    if (CFormView::OnCreate(lpCreateStruct) == -1) 
    return -1; 

//Trial-1 
if (!IsInitialized()) 
{ 
    DestroyWindow(); 
    return 0; 
} 
//Trial-2 
if (!IsInitialized()) 
{ 
    return -1; 
} 

return 0; 
} 

在这两种情况下,窗口被关闭,但我的系统会返回"Failed to create empty document."

如何避免此消息?

+1

使用Debug + Break All并查看Call Stack调试器窗口以查看您如何到达那里。这是你的代码中的文档/视图编程缺陷。你创建了一个文档,但是当MFC试图为它创建视图时,你说“你看不到它”。您应该尽早停止此操作,不允许先创建文档。 –

+0

你能告诉我应该预期什么吗?我创建了文档,然后我创建了视图,但由于某些条件,在OnCreate()函数内关闭了相同的视图。 – Nipun

回答

0

这是一个完全正常的行为。

文档,框架和视图创建在一个回合。首先创建文档,而不是框架,而不是内部视图。如果其中一个操作失败,所有其他操作也会回滚并失败。

所以在MDI OnFileNew的情况下,从您的模板需要OpenDocumentFile。 该函数创建新的CDocument,然后创建一个新的框架窗口。框架窗口创建视图。这由于您的代码而失败。

你的错误消息来自CMultiDocTemplate :: OpenDocumentFile因为CreateNewFrame失败。

让MFC创建窗口,并破坏OnInitialUpdate中的观点吧。这应该没有这个消息。

+0

我在OnIniialUpdate函数中做了同样的事情后崩溃了。崩溃在void CFrameWnd :: InitialUpdateFrame(CDocument * pDoc,BOOL bMakeVisible)函数中,该函数为InInitialUpdate调用消息WM_INITIALUPDATE,并稍后调用OnActivateFrame()函数。我想在我销毁窗口的时候,它试图对DestroyWindow()之后的垃圾视图指针进行一些操作。 – Nipun

+0

我试着用CloseWindow工作()和WM_DESTROY消息话题很好,但同样的结果...崩溃 – Nipun

+0

比我看不出有什么其他的机会比邮寄私人WM_APP消息到您的视图。当你收到ist时使用DestroyWindw。切勿将WM_DESTROY作为消息发布或发送。它是内部的。 – xMRi