在上两篇中学习了窗口的底层实现,从本文开始将正式开始学习MFC编程
目录
1.MFC概念及作用
1.1什么是MFC
概念:Microsoft 基础类 (MFC) 库针对大部分 Win32 和 COM API 提供面向对象的包装器。 虽然此包装器可用于创建极为简单的桌面应用程序,但当你需要开发具有多个控件的更复杂的用户界面时,此包装器将最为有用。 可以使用 MFC 创建带有 Office 样式用户界面的应用程序。
1.2 为什么要使用MFC呢?
基于框架编程,提高工作效率,减少开发周期,降低开发成本。
2.MFC基本内容
2.1类层次结构
基本层次结构如图:
2.2 头文件
afx.h--包含了MFC中绝大部分类的声明
afxwin.h--包含了afx.h和windows.h
afxext.h--提供了对扩展类的支持,例如:工具栏、状态栏...
附:以Afx...开头的函数,可以确定为MFC库中的一个全局函数;
以::...开头的函数,可以确定为Win32的API函数;
2.3 应用程序分类
1、使用MFC库制作自己的控制台程序
相比Win32控制台程序:
多了一个全局对象 CWinApp theApp
入口函数不同于以往的入口函数
2、使用MFC库制作自己的静态库程序
3、使用MFC库制作自己的动态库程序
1--使用MFC库制作自己的规则动态库(静/动态MFC库)
2--使用MFC库制作自己的扩展动态库
区别:规则库可以被所有程序调用,扩展库只能被支持MFC的程序调用
4、使用MFC库制作自己的窗口程序
1--单文档视图构架程序
CFrameWnd-框架窗口类,封装了关于框架窗口的操作
CWinApp-应用程序类,封装了关于程序流程的操作
CDocument-文档类,封装了关于数据的操作(提取、转换、存储...)
CView-视图窗口类,封装了关于视图窗口的操作(绘图)
2--多文档视图构架程序
CMDIChildWnd-子框架窗口类,封装了关于子框架窗口的操作
CMDIFrameWnd-主框架窗口类,封装了关于主框架窗口的操作
CWinApp-应用程序类,封装了关于程序流程的操作
CDocument-文档类,封装了关于数据的操作(提取、转换、存储...)
CView-视图窗口类,封装了关于视图窗口的操作(绘图)
3--对话框构架程序
CWinApp-应用程序类,封装了关于程序流程的操作
CDialog-对话框窗口类,封装了关于对话框窗口的操作
3.MFC库中的类
3.1 MFC库中类的概述
如上图所示, 其中Cobject是MFC中提供了绝大数类的基类。该类完成动态控件的分配与回收,支持一般的诊断、出错信息和文档序列化等。
CCmdTarget类主要负责将系统事件(消息)和窗口事件(消息)发送给响应这些事件的对象,完成消息发送、等待和派遣(调度)等工作,实现应用程序的对象之间协调运行。
CWinApp类是应用程序的主线程类,它是从CWinThread类派生而来。CWinThread类用来完成对线程的控制,包括线程的创建、运行、终止和挂起等。
CDocument类是文档类,包含了应用程序在运行期间所用到的数据。
CWnd类是一个通用的窗口类,用来提供Windows 中的所有通用特性。
CView 是用于让用户通过窗口来访问文档以及负责文档内容的显示。
CFrameWnd 类是从 CWnd 继承来的,并实现了标准的框架应用程序。
CDialog 类用来控制对话框窗口。
CMDIFrameWnd和CMDIChildWnd类分别用来多文档应用程序的主框架窗口和文档子窗口的显示和管理。
CMiniFrameWnd类是一种简化的框架窗口,它没有最大化和最小化窗口按钮,也没有窗口系统菜单,一般很少用到它。
有关类文档的下载:可以参考MFC 类层次结构图 | Microsoft Learn
3.2 类的导向功能(在此不展开)
1、Message Maps选项卡
2、Member Variables选项卡
3、Automation选项卡
4、ActiveX Events选项卡
5、Class Info选项卡
代码
使用MFC库制作自己的程序窗口:
头文件:
#pragma once
#include<afxwin.h>
class MyApp :public CWinApp//继承应用程序类
{
public:
//程序入口
virtual BOOL InitInstance();
};
class MyFrame :public CFrameWnd//继承CFrameWnd框架
{
public:
MyFrame();
//声明宏 提供消息映射机制
DECLARE_MESSAGE_MAP()
afx_msg void OnLButtonDown(UINT, CPoint);
afx_msg void OnChar(UINT, UINT, UINT);
afx_msg void OnPaint();
};
.cpp
#include"mfs.h"
MyApp app; //全局应用程序对象,有且仅有一个
BOOL MyApp::InitInstance()
{
//创建窗口
MyFrame* frame = new MyFrame;
//显示和更新
frame->ShowWindow(SW_SHOWNORMAL);
frame->UpdateWindow();
m_pMainWnd = frame; //保存指向应用程序的主窗口的指针
return TRUE; //返回正常初始化
}
//分界宏
BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)
ON_WM_LBUTTONDOWN() //鼠标左键按下
ON_WM_CHAR() //键盘
ON_WM_PAINT() //绘图宏
END_MESSAGE_MAP()
MyFrame::MyFrame()//创建一个窗口
{
Create(NULL, TEXT("mfc"));
}
void MyFrame::OnLButtonDown(UINT, CPoint point)//鼠标左键
{
/*TCHAR buf[1024];
wsprintf(buf, TEXT("x = %d, y =%d"), point.x, point.y);
MessageBox(buf);*/
//mfc中的字符串 CString
CString str;
str.Format(TEXT("x = %d ,,,, y = %d "), point.x, point.y);
MessageBox(str);
}
void MyFrame::OnChar(UINT key, UINT, UINT)//键盘
{
CString str;
str.Format(TEXT("按下了%c 键"), key);
MessageBox(str);
}
void MyFrame::OnPaint()//绘画
{
CPaintDC dc(this); //CDC里找其他的能画的图形
dc.TextOutW(100, 100, TEXT("这是一个⚪ "));
//画椭圆
dc.Ellipse(10, 10, 100, 100);
//多字节转为 宽字节
//TEXT是由自适应编码的转换
// TCHER 自适应编码的转换
//MessageBox(L"aaa");
//统计字符串长度
int num = 0;
const char* p = "aaaa";
num = strlen(p);
//统计宽字节的字符串长度
const wchar_t* p2 = L"bbbb";
num = wcslen(p2);
//char * 与 CString之间的转换 C++ string .c_str();
//char* -> CString
const char* p3 = "ccc";
CString str = CString(p3);
//CString -> char *
CStringA tmp;
tmp = str;
char* pp = tmp.GetBuffer();
}