如何用 3 个视图拆分 MFC 对话框?

Posted

技术标签:

【中文标题】如何用 3 个视图拆分 MFC 对话框?【英文标题】:How to split MFC dialog with 3 views? 【发布时间】:2019-01-06 02:40:45 【问题描述】:

问题:如何拆分具有 3 个视图的 MFC 对话框?环境: Win10 RS5 x64工具: 视觉工作室 10.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();

我认为当我尝试创建空视图时会发生此错误。 所以,我实现了注释编辑,但仍然发生同样的错误。

【问题讨论】:

【参考方案1】:

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

在这种情况下,调试器可能会告诉您CSplitterWndEx 正在寻找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

【讨论】:

以上是关于如何用 3 个视图拆分 MFC 对话框?的主要内容,如果未能解决你的问题,请参考以下文章

MFC如何用一button控件选择一幅bmp图片并在picture控件上显示?

如何用c++的mfc绘制柱状图

想用MFC做个界面,但不知道如何在MFC对话框中插入背景图片,把这图片用于登录界面的背景

如何用 VS2015 制作简易视频播放器

拆分按钮控件在 MFC 对话框中消失

如何用C++6.0中的MFC 画图?最简单的线就可以