MFC深入浅出读书笔记第二部分2

第七章  MFC骨干程序

  所谓骨干程序就是指有AppWizard生成的MFC程序。如下图的层次关系是程序中常用的几个类,一定要熟记于心。

  

  1 Document/View应用程序

  CDocument存放资料内容,CView显示资料,并且负责最资料的编辑、修改。

  有关文件读写的动作在CDocument 的Serialize 函数进行,有关画面显示的动作在CView 的OnDraw 或OnPaint 函数进行。

  程序每打开一份文件(资料),就应该产生三份对象:
    1. 一份Document 对象,
    2. 一份View 对象,
    3. 一份CMDIChildWnd 对象(做为外框窗口)

  Document Template 用来管理上面程序生成的对象。如其中CMultiDocTemplate 的构造式参数如下:

1 CMultiDocTemplate::CMultiDocTemplate(UINT nIDResource,      //资源ID
2                                     CRuntimeClass* pDocClass,  //指向Document 对象
3                                     CRuntimeClass* pFrameClass,//指向CMDIChildWnd 对象
4                                     CRuntimeClass* pViewClass);//指向View 对象

  字符串资源(string)

  IDR_MAINFRAME   "\nScrib\nScrib\nScribble Files (*.scb)\n.SCB\nScribble.Document\nScrib Document"

  这是一个以'\n'分割的七个子字符串资源。每一个子字符串都可以在程序进行过程中取得,只要调用CDocTemplate::GetDocString 并在其第二参数中指定索引  值(1~7)即可。其中七个子字符串资源意义如下:

  string七个子字符串资源的出现位置如下:

  例子  

    1 主窗口的产生  

  构造MDI 主窗口,有两个步骤。第一个步骤是new 一个CMDIFrameWnd 对象,第二个步骤是调用其LoadFrame 函数。

  2 工具栏和状态列的诞生(Toolbar & Status bar)

  工具栏和状态列分别由CToolBar 和CStatusBar 掌管。两个对象隶属于主窗口,所以可以在CMainFrame中声明两个对象用来表示。

    CStatusBar m_wndStatusBar;
    CToolBar m_wndToolBar;

  然后在主窗口创建的时候初始化 工具栏和状态列,通过Create()与 LoadToolBar()函数以及Create()与 SetIndicators()函数

  3 鼠标拖放(Drag and Drop)

  实现:使用CreateWindowEx()创建窗口并指定第一个风格为WS_EX_ACCEPTFILES的窗口才能接受拖拽文件。在MFC中实现如下:

复制代码
 1 BOOL CScribbleApp::InitInstance()
 2 {
 3     ...
 4     // Enable drag/drop open
 5     m_pMainWnd->DragAcceptFiles();//愿意接受拖拽文件
 6     // Enable DDE Execute open
 7     EnableShellOpen();//实现双机打开文件
 8     RegisterShellFileTypes(TRUE);//注册文件类型
 9     ...
10 }
复制代码

  你可以拖拽任何类型的文件,但是只有你指定的才能响应,其他的则不能打开。

  4 消息映射 (Message Map)

  首先你应该在类别声明处加上DECLARE_MESSAGE_MAP 宏, 然后在.CPP 档中使用BEGIN_MESSAGE_MAP 和END_MESSAGE_MAP 两个宏,宏中间夹带  的就是「讯息与函数对映关系」。

  5 标准菜单File / Edit / View / Window / Help

  几乎所有MDI程序都有两组菜单。一组是当没有任何子窗口(文件窗口)存在时出现,另一组则是当有任何子窗口(文件窗口)存在时出现。而后者更加复杂多样,包含所有的文件操作。MFC将很多常用的菜单操作预先定义好了,直接使用就行。

  6 对话框

  每个程序的关于对话框都需要自己改写,加入自己的内容。作者,日期一类的。

posted @   struggle_time  阅读(915)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示