首页 > 编程语言 >【C++】【MFC】CView和CDocument关联以及COMMAND消息走向

【C++】【MFC】CView和CDocument关联以及COMMAND消息走向

时间:2024-06-21 09:44:30浏览次数:20  
标签:MAP MFC CMyView C++ CDocument CView public CMyDoc

MFC编程中,CView类负责显示,CDocument负责数据管理,所以其之间的联系十分重要,包括COMMAND消息的流向

CView中的m_pDocument成员将存储和其关联的唯一的CDocument地址,而CDocument中的m_viewList链表将存储和其关联的所有CView地址,即一个CDocument可以有多个CView,但一个CView只能有一个CDocument。

关于COMMAND消息走向,其优先级分别是:CView -> CDocument -> CFrameWnd -> CWinApp。

Code:

  1 #include <afxwin.h>
  2 #include <afxext.h>
  3 #include "resource.h"
  4 
  5 // 文档类
  6 class CMyDoc : public CDocument {
  7     DECLARE_MESSAGE_MAP()                    // 消息映射—类内声名宏
  8 public:
  9     CString str;                            // 数据管理
 10     afx_msg void OnNew();                    // ID_FILE_NEW消息映射回调函数
 11 };
 12 BEGIN_MESSAGE_MAP(CMyDoc, CDocument)        // 消息映射—类外实现宏
 13     ON_COMMAND(ID_FILE_NEW, OnNew)            // 触发COMMAND消息的控件和回调函数
 14 END_MESSAGE_MAP()
 15 
 16 // 在CMyDoc中触发 ID_FILE_NEW 控件后执行该函数
 17 void CMyDoc::OnNew() {
 18     str = "HELLO, WORLD";                    
 19     POSITION pos = GetFirstViewPosition();    // 获取m_viewList链表头节点的前一个地址
 20     CView* pView = GetNextView(pos);        // 获取头节点地址
 21     UpdateAllViews(pView);                    // 更新除第一个View窗口以外的所有窗口
 22 }
 23 
 24 // 视图类
 25 class CMyView : public CView {
 26     DECLARE_DYNCREATE(CMyView)                // 动态创建—类内声名宏
 27     DECLARE_MESSAGE_MAP()                    
 28 public:
 29     virtual void OnDraw(CDC* pdc);            // 父类绘图函数
 30     afx_msg int OnCreate(LPCREATESTRUCT pcs);
 31     afx_msg void OnNew();
 32 };
 33 IMPLEMENT_DYNCREATE(CMyView, CView)            // 动态创建—类外实现宏
 34 BEGIN_MESSAGE_MAP(CMyView, CView)
 35     //ON_COMMAND(ID_FILE_NEW, OnNew)
 36     ON_WM_CREATE()
 37 END_MESSAGE_MAP()
 38 
 39 // 在 CMyView 中触发 ID_FILE_NEW 控件后执行该函数
 40 void CMyView::OnNew() {
 41     AfxMessageBox("View.");                    // 弹出消息框,内容为“View.”
 42 }
 43 
 44 int CMyView::OnCreate(LPCREATESTRUCT pcs) {
 45 
 46     return CView::OnCreate(pcs);
 47 }
 48 
 49 // 在 CView 客户区中绘制界面
 50 void CMyView::OnDraw(CDC* pdc) {
 51     //CMyDoc* pDoc = (CMyDoc*)m_pDocument;
 52     CMyDoc* pDoc = (CMyDoc*)GetDocument();    // 获取文档类地址
 53     pdc->TextOut(100, 100, pDoc->str);        // 将文档类中的str成员变量输出至View窗口中
 54 }
 55 
 56 // 框架窗口类
 57 class CMyFrameWnd : public CFrameWnd {
 58     DECLARE_MESSAGE_MAP()
 59 public:
 60     CSplitterWnd split;
 61 public:
 62     afx_msg int OnCreate(LPCREATESTRUCT pcs);
 63     afx_msg void OnPaint();
 64     virtual BOOL OnCreateClient(LPCREATESTRUCT psc, CCreateContext* pContext);
 65 };
 66 BEGIN_MESSAGE_MAP(CMyFrameWnd, CFrameWnd)
 67     ON_WM_PAINT()
 68     ON_WM_CREATE()
 69 END_MESSAGE_MAP()
 70 
 71 BOOL CMyFrameWnd::OnCreateClient(LPCREATESTRUCT psc, CCreateContext* pContext) {
 72     // 划分为一个一行两列的两个View
 73     split.CreateStatic(this, 1, 2);
 74     // 创建第一个View
 75     split.CreateView(0, 0, pContext->m_pNewViewClass, CSize(100, 100), pContext);
 76     split.CreateView(0, 1, RUNTIME_CLASS(CMyView), CSize(100, 100), pContext);
 77 
 78     // 设置第一个View为活动窗口
 79     m_pViewActive = (CView*)split.GetPane(0,0);  
 80     return TRUE;
 81 }
 82 
 83 void CMyFrameWnd::OnPaint() {
 84     PAINTSTRUCT ps = { 0 };
 85     HDC hdc = ::BeginPaint(m_hWnd, &ps);
 86     ::TextOut(hdc, 100, 100, "123", 3);
 87     ::EndPaint(m_hWnd, &ps);
 88 }
 89 
 90 int CMyFrameWnd::OnCreate(LPCREATESTRUCT pcs) {
 91 
 92     return CFrameWnd::OnCreate(pcs);
 93     //return 0;
 94 }
 95 
 96 class CMyWinApp : public CWinApp {
 97 public:
 98     virtual BOOL InitInstance();
 99 };
100 
101 BOOL CMyWinApp::InitInstance() {
102     CMyFrameWnd* pFrame = new CMyFrameWnd;
103     CMyDoc* pDoc = new CMyDoc;
104     CCreateContext cct;
105     cct.m_pNewViewClass = RUNTIME_CLASS(CMyView);
106     cct.m_pCurrentDoc = pDoc;
107     pFrame->LoadFrame(IDR_MENU1, WS_OVERLAPPEDWINDOW, NULL, &cct);
108     m_pMainWnd = pFrame;
109     pFrame->ShowWindow(SW_SHOW);
110     pFrame->UpdateWindow();
111 
112     return TRUE;
113 }
114 
115 CMyWinApp theApp;

 

标签:MAP,MFC,CMyView,C++,CDocument,CView,public,CMyDoc
From: https://www.cnblogs.com/vangoghpeng/p/18259010

相关文章

  • C++(野指针)
    野指针(DanglingPointer)是在C++中指向无效内存位置的指针。野指针通常发生在以下几种情况下:释放了内存但没有将指针设为NULL:当使用delete或delete[]释放内存后,指针仍然保持指向原来的地址,但该地址已经无效。int*ptr=newint(10);deleteptr;//ptr现在是野指针栈上......
  • 深入了解C++存储类
    在C++编程中,存储类(StorageClass)指定了变量的生命周期、可见性和存储位置。了解存储类是编写高效、清晰代码的基础。本文将详细介绍C++中各种存储类的定义、特点和使用场景。一、存储类概述C++中的存储类主要包括以下几种:自动存储类(auto)寄存器存储类(register)静态存储类(st......
  • 深入了解C++运算符
    C++是功能强大的编程语言,提供了丰富的运算符集合。运算符是用于执行各种操作的符号或关键字,包括数学运算、比较、逻辑操作、位操作等。本文将详细介绍C++中的各种运算符,并通过示例说明其用法。一、算术运算符算术运算符用于执行基本的数学运算,包括加、减、乘、除和取余。......
  • C++数据格式化6 - uint转换成二六进制字符串
    1.关键词2.strfmt.h3.strfmt.cpp4.测试代码5.运行结果6.源码地址1.关键词C++数据格式化字符串处理std::stringintbin跨平台2.strfmt.h#pragmaonce#include<string>#include<cstdint>#include<sstream>#include<iomanip>namespacecutl{......
  • C++数据格式化5 - uint转换成十六进制字符串&二进制的data打印成十六进制字符串
    1.关键词2.strfmt.h3.strfmt.cpp4.测试代码5.运行结果6.源码地址1.关键词关键字:C++数据格式化字符串处理std::stringinthex跨平台应用场景:int型的数据打印成十六进制字符串二进制的data打印成十六进制字符串。2.strfmt.h#pragmaonce#include<......
  • 2024华为OD机试真题- 计算三叉搜索树的高度-(C++/Java/Python)-C卷D卷-100分
     2024华为OD机试题库-(C卷+D卷)-(JAVA、Python、C++) 题目描述定义构造三叉搜索树规则如下:每个节点都存有一个数,当插入一个新的数时,从根节点向下寻找,直到找到一个合适的空节点插入。查找的规则是:1.如果数小于节点的数减去500,则将数插入节点的左子树2.如果数大于节点的......
  • 基于语音信号MFCC特征提取和GRNN神经网络的人员身份检测算法matlab仿真
    1.算法运行效果图预览    2.算法运行软件版本MATLAB2022a 3.部分核心程序P=[Dat1_wav1;Dat1_wav2;Dat2_wav1;Dat2_wav2;Dat3_wav1;Dat3_wav2;Dat4_wav1;Dat4_wav2];T=[ones(800,1);2*ones(800,1);3*ones(800,1);4*ones(800,1)];%GRNN训练net=newgrnn(......
  • C++程序编译 错误提示和评测状态
    编译常见错误提示1.[Error]expected';'before'cout'。在cout前面,缺少一个分号。2.[Error]'arr'wasnotdeclaredinthisscope。未定义变量名arr。3.[Error]ldreturned1exitstatus。重复运行错误(上一个运行的程序,输入窗口没有关掉)。  或者main写错了。......
  • 「C++」复杂模拟【壹】
    建议开启目录食用阅读本文之前建议您先看这里,如果您已经看完了,那么就可以放心大胆的学习本文了。我认为其实本文的难度还是比较大的,今天我们题是来自山东省省选,所以建议大家谨慎阅读,如果您是专业程序员当我没说。OK,那么事不宜迟,咱们来看第一题[SDOI2010]猪国杀题目描述游戏......
  • 《C++ Primer》导学系列:第 6 章 - 函数
    6.1函数基础6.1.1基本概念函数是C++程序的基本组成单元,用于将代码组织成可以复用的模块。函数通过函数名进行调用,并且可以接受参数和返回值。函数的定义包括函数头和函数体,其中函数头描述了函数的接口,函数体包含了具体的实现代码。函数的定义函数的定义通常包括返回类型......