Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
View 如何拆分带有3个视图的MFC对话框?_View_Split_Interface_Mfc_Dialog - Fatal编程技术网

View 如何拆分带有3个视图的MFC对话框?

View 如何拆分带有3个视图的MFC对话框?,view,split,interface,mfc,dialog,View,Split,Interface,Mfc,Dialog,问题:如何将MFC对话框拆分为3个视图? 环境:Win10 RS5 x64 工具:VisualStudio10.0+Sp1 当我执行应用程序时,出现了“调试断言失败!”错误 错误消息: Debug Assertion Failed! File: f:\dd\vctools\vc7libs\ship\atlmfc\include\afxwin2.inl Line: 82 // SampleDlg.h class CSampleDlg : public CDialogEx { //

问题:如何将MFC对话框拆分为3个视图?
环境:Win10 RS5 x64
工具:VisualStudio10.0+Sp1

当我执行应用程序时,出现了“调试断言失败!”错误

错误消息:

Debug Assertion Failed!  
File: f:\dd\vctools\vc7libs\ship\atlmfc\include\afxwin2.inl  
Line: 82
// SampleDlg.h
class CSampleDlg : public CDialogEx
{
    //...
public:
    CSplitterWndEx m_wndSplitter;
};

// SampleDlg.cpp
BOOL CSampleDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();
    //...
    if (!m_wndSplitter.CreateStatic(this, 2, 1))
    {
        return FALSE;
    }
    if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CChild_NoteView), CSize(100, 100), 0) ||
        !m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CChild_LogView), CSize(100, 100), 0))
    {
        m_wndSplitter.DestroyWindow();
        return FALSE;
    }

    return TRUE;
}

// Child_NoteView.h
class CChild_NoteView : public CView
{
    DECLARE_DYNCREATE(CChild_NoteView)
    //...
public:
    CFont           m_note_font;
    CRichEditCtrl   m_note_edit;
}

// Child_NoteView.cpp
Message : WM_CREATE
int CChild_NoteView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if(CView::OnCreate(lpCreateStruct) == -1)
        return -1;

    CreateNoteEdit();

    return 0;
}
VOID CChild_NoteView::CreateNoteEdit()
{
    m_note_font.CreatePointFont(80, L"Consolas");
    m_note_edit.Create(ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | WS_HSCROLL, 
        CRect(10, 10, 100, 100), this, IDD_EDIT_NOTE);
    m_note_edit.SetReadOnly(TRUE);

    m_note_edit.SetFont(&m_note_font, 1);

    return VOID();
}
我想像这样拆分对话框:

Debug Assertion Failed!  
File: f:\dd\vctools\vc7libs\ship\atlmfc\include\afxwin2.inl  
Line: 82
// SampleDlg.h
class CSampleDlg : public CDialogEx
{
    //...
public:
    CSplitterWndEx m_wndSplitter;
};

// SampleDlg.cpp
BOOL CSampleDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();
    //...
    if (!m_wndSplitter.CreateStatic(this, 2, 1))
    {
        return FALSE;
    }
    if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CChild_NoteView), CSize(100, 100), 0) ||
        !m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CChild_LogView), CSize(100, 100), 0))
    {
        m_wndSplitter.DestroyWindow();
        return FALSE;
    }

    return TRUE;
}

// Child_NoteView.h
class CChild_NoteView : public CView
{
    DECLARE_DYNCREATE(CChild_NoteView)
    //...
public:
    CFont           m_note_font;
    CRichEditCtrl   m_note_edit;
}

// Child_NoteView.cpp
Message : WM_CREATE
int CChild_NoteView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if(CView::OnCreate(lpCreateStruct) == -1)
        return -1;

    CreateNoteEdit();

    return 0;
}
VOID CChild_NoteView::CreateNoteEdit()
{
    m_note_font.CreatePointFont(80, L"Consolas");
    m_note_edit.Create(ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | WS_HSCROLL, 
        CRect(10, 10, 100, 100), this, IDD_EDIT_NOTE);
    m_note_edit.SetReadOnly(TRUE);

    m_note_edit.SetFont(&m_note_font, 1);

    return VOID();
}

此处的实现代码:

Debug Assertion Failed!  
File: f:\dd\vctools\vc7libs\ship\atlmfc\include\afxwin2.inl  
Line: 82
// SampleDlg.h
class CSampleDlg : public CDialogEx
{
    //...
public:
    CSplitterWndEx m_wndSplitter;
};

// SampleDlg.cpp
BOOL CSampleDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();
    //...
    if (!m_wndSplitter.CreateStatic(this, 2, 1))
    {
        return FALSE;
    }
    if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CChild_NoteView), CSize(100, 100), 0) ||
        !m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CChild_LogView), CSize(100, 100), 0))
    {
        m_wndSplitter.DestroyWindow();
        return FALSE;
    }

    return TRUE;
}

// Child_NoteView.h
class CChild_NoteView : public CView
{
    DECLARE_DYNCREATE(CChild_NoteView)
    //...
public:
    CFont           m_note_font;
    CRichEditCtrl   m_note_edit;
}

// Child_NoteView.cpp
Message : WM_CREATE
int CChild_NoteView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if(CView::OnCreate(lpCreateStruct) == -1)
        return -1;

    CreateNoteEdit();

    return 0;
}
VOID CChild_NoteView::CreateNoteEdit()
{
    m_note_font.CreatePointFont(80, L"Consolas");
    m_note_edit.Create(ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | WS_HSCROLL, 
        CRect(10, 10, 100, 100), this, IDD_EDIT_NOTE);
    m_note_edit.SetReadOnly(TRUE);

    m_note_edit.SetFont(&m_note_font, 1);

    return VOID();
}
我认为当我尝试创建空视图时会发生此错误。
因此,我实现了note edit,但仍然发生相同的错误。

当您出现这些调试错误时,调试器应该为您提供查看源代码的选项(但较旧版本的Visual Studio可能会给您带来困难)。然后可以打开“调用堆栈”窗口并跟踪错误

在本例中,调试器可能会告诉您,
csplitterwendex
正在查找
CFrameWnd
,但找不到它

您可以派生自己的类
CMySplitterWndEx
,并更改代码以返回主对话框,而不是返回
CFrameWnd

或者,您可以按如下方式添加假帧窗口:

BOOL CSampleDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    CRect rc;
    GetClientRect(&rc);

    CFrameWnd *frame = new CFrameWnd;
    CString framecls = AfxRegisterWndClass(0, NULL, NULL, NULL);
    frame->Create(framecls, L"", WS_VISIBLE | WS_CHILD, rc, this);

    m_wndSplitter.CreateStatic(frame, 2, 1);
    m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CChild_NoteView), CSize(100, 100), NULL);
    m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CChild_NoteView), CSize(100, 100), NULL);

    rc.MoveToXY(0, 0);
    m_wndSplitter.MoveWindow(rc);
    m_wndSplitter.ShowWindow(SW_SHOW);
    return TRUE;
}
您可能还需要添加
CCreateContext