MFC文档视图

简介: MFC文档视图

一、作用


文档就是提供用于管理数据模块


文档类CDocument,父类CCmdTarget,封装了文档类和视图类关系


二、实例


1、创建桌面应用程序,导入头文件


2、添加类


class CMyDoc :public CDocument {
};
//派生CEditView不用重写Ondraw
class CMyView :public CEditView {
    DECLARE_DYNCREATE(CMyView)
};
IMPLEMENT_DYNCREATE(CMyView, CEditView)
class CMyFrameWnd :public CFrameWnd {
};
class CMyWinApp :public CWinApp {
public:
    virtual BOOL InitInstance();
};
CMyWinApp theApp;


3、重写InitInstance函数


BOOL CMyWinApp::InitInstance()
{
    CMyFrameWnd* pFrame = new CMyFrameWnd;
    //文档类的对象地址
    CCreateContext cct;
    //视图类的静态变量
    cct.m_pCurrentDoc = new CMyDoc;
    cct.m_pNewViewClass = RUNTIME_CLASS(CMyView);
//loadframe自动重写了Oncreate函数
    pFrame->LoadFrame(IDR_MENU1,WS_OVERLAPPEDWINDOW,NULL,&cct);
    m_pMainWnd = pFrame;
    pFrame->ShowWindow(SW_SHOW);
    pFrame->UpdateData();
    return TRUE;
}


4、运行结果


0a2653c851af460fa595bd959398a8f1.png


5、证明父类窗口帮我们处理了OnCreate函数:通过框架重写Oncreate函数,返回0,编辑窗口将不会出现


class CMyFrameWnd :public CFrameWnd {
    DECLARE_MESSAGE_MAP()
public:
    afx_msg int OnCreate(LPCREATESTRUCT pcs);
};
BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)
    ON_WM_CREATE()
END_MESSAGE_MAP()
int CMyFrameWnd::OnCreate(LPCREATESTRUCT pcs) {
    return CFrameWnd::OnCreate(pcs);
    //return 0;
}

6、证明视图类窗口帮我们绑定了视图类和文档类对象,在视图类创建消息机制


class CMyView :public CEditView {
    DECLARE_MESSAGE_MAP()
    DECLARE_DYNCREATE(CMyView)
public:
    afx_msg int OnCreate(LPCREATESTRUCT pcs);
};
BEGIN_MESSAGE_MAP(CMyView,CEditView)
    ON_WM_CREATE()
END_MESSAGE_MAP()
IMPLEMENT_DYNCREATE(CMyView, CEditView)
int CMyView::OnCreate(LPCREATESTRUCT pcs) {
//必须调用父类,否则报错    
return CEditView::OnCreate(pcs);
    //return 0;
}


三、命令消息(WM_COMMAND)的处理顺序,都写上函数,看看那个先弹出


View-->Document-->Frame-->App  
class CMyDoc :public CDocument {
    DECLARE_MESSAGE_MAP()
public:
    afx_msg void xinjian();
};
BEGIN_MESSAGE_MAP(CMyDoc, CDocument)
    ON_COMMAND(ID_XJ,xinjian)
END_MESSAGE_MAP()
void CMyDoc::xinjian() {
    AfxMessageBox("文档处理消息了");
}


四、自己定义一个类,先执行消息处理函数


1、声明自己的类,并添加消息处理机制


class CGyb :public CCmdTarget {
    DECLARE_MESSAGE_MAP()
public:
    afx_msg void xinjian();
};
BEGIN_MESSAGE_MAP(CGyb,CCmdTarget)
    ON_COMMAND(ID_XJ,xinjian)
END_MESSAGE_MAP()
void CGyb::xinjian() {
    AfxMessageBox("我自己处理了函数");
}


2、在框架类声明OnCmdMsg函数


virtual BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO*  pHandlerInfo);

3、实现OnCmdMsg函数

BOOL CMyFrameWnd::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO*  pHandlerInfo) {
    CGyb  gyb;
    if (gyb.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)) {
        return TRUE; //如果找到执行自己的函数
    }
    //如果没找到,执行父类函数,按原来顺序执行
    return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}


目录
相关文章
|
Linux Windows
卸载windows的WSL
卸载windows的WSL
1357 1
|
存储 NoSQL 算法
MongoDB保姆级指南(中):从副本集群、分片集群起航,探索分布式存储的趋势!
本文一起来聊聊MongoDB集群,顺带以MongoDB集群为起点,共同探讨一下分布式存储的发展趋势~
2689 15
|
SQL 安全 网络安全
看完这篇 教你玩转渗透测试靶机vulnhub—DarkHole2
看完这篇 教你玩转渗透测试靶机vulnhub—DarkHole2
819 0
|
缓存 安全 Unix
C/C++使用Windows的API实现共享内存以及同步
C/C++使用Windows的API实现共享内存以及同步
1903 0
|
监控 关系型数据库 MySQL
SpringBoot + ShardingSphere-JDBC 实现读写分离
上一篇我们用 ShardingSphere-Proxy实现了读写分离 ShardingSphere 实战之读写分离 这一次我们用 ShardingSphere-JDBC 来实现一下
SpringBoot + ShardingSphere-JDBC 实现读写分离
|
5G 调度
5G NR 基础参数 及接入设计 |带你读《5G 无线系统设计与国际标准》之八
NR 帧结构配置不再沿用 LTE 阶段采用的固定帧结构方式,而是采用半静态无线资源控制(RRC,Radio Resource Control)配置和动态下行控制信息(DCI,Downlink ControlInformation)配置结合的方式进行灵活配置。这样设计的核心思想还是兼顾可靠性和灵活性。
5G NR 基础参数 及接入设计 |带你读《5G 无线系统设计与国际标准》之八
|
Web App开发 测试技术 应用服务中间件
|
18天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
下一篇
开通oss服务