view - 如何用 3 个视图拆分 MFC 对话框?
问题描述
问题:如何拆分具有 3 个视图的 MFC 对话框?
环境: Win10 RS5 x64
工具: Visual Studio 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();
}
我认为当我尝试创建空视图时会发生此错误。所以,我实现了注释编辑,但仍然发生同样的错误。
解决方案
当您收到这些调试错误时,调试器应该为您提供查看源代码的选项(但旧版本的 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
。
推荐阅读
- c++ - 指定当用户固定我的应用程序时运行应用程序的命令参数
- charts - SSRS 图表 - 水平而不是垂直
- javascript - 带有后备网址的历史记录 back()
- python-2.7 - 如何使用机器人测试框架从创建的会话中获取访问令牌
- java - 将 for 循环示例转换为 while 循环
- json - JSON 错误:试图从 JSON 结果中获取信息
- javascript - 即使事件未执行,事件侦听器也会立即触发
- javascript - 使用 AngularJS 将所选值绑定到多选 ListboxFor 控件
- android - Firestore:库中的包引用无效
- node.js - Azure Active Directory 动态回复 url