MFC简介以及基础使用(小白级别入门讲解)

一、Windows消息机制

1.1窗口

一个Windows应用程序中至少有一个窗口,称为主窗口。我们在客户区进行图案的绘制。

1.2句柄

一个Windows应用程序是包含图标、光标等许多部件(资源),系统在为这些部件(资源)分配内存后会返回他们的标识号,也就是所谓的句柄。比如在Windows应用程序中,使用窗口句柄来标识每一个窗口。对窗口进行操作时候,首先就是得到这个窗口的标识。

1.3消息与消息队列

Windows是事件驱动方式的程序设计,当一个Windows应用程序开始执行的时候,系统会产生一个消息队列,用于保存这个窗口的消息。eg:当你自己在一个窗口中按下键盘时候(事件),系统会收集到这个按下键盘事情(事件),然后包装成消息,放到这个窗口的消息队列中(窗口过程)。因为队列的先进先出的特点,这时候窗口会一个一个的读取消息,然后进行相应的执行处理。

1.4WinMain函数

控制台DOS中的入口是mian函数,而WinMain函数就是Windows程序的入口函数。启动一个应用程序时候就开始先调用WinMain函数

1.5Windows编程模型

一个应用程序的功能是:创建一个窗口,然后响应键盘或者鼠标消息。

  • WinMain函数的定义
  • 创建窗口
  • 消息循环
  • 窗口过程

二、MFC的简单使用

2.1MFC简介

MFC是微软基础类库,以C++类的形式封装了Windows API,并且包含一个应用程序框架。类中包含了大量的windows句柄封装类和很多windows的组件和内建控件的封装类。MFC把Windows SDK API函数包装成了几百个类,MFC给Windows系统提供面向对象的接口,支持可重用性、自包含性以及OPP原则。

2.2MFC程序入口

MFC.h

//mfc头文件
#include

//1、应用程序类CWinApp,MyAPP派生类
class MyApp : public CWinApp{
public:
    //父类的虚函数,需要派生类进行重写
    //也是MFC函数的入口函数
    virtual BOOL InitInstance();
};

//2、框架类CFrameWnd,MyFrame派生类
class MyFrame : public CFrameWnd{
public:
    //构造函数
    MyFrame();
}

MFC.cpp

//对应类的头文件
#include "mfc.h"

//有且只有一个的全局应用程序类的对象
MyApp app;

//程序入口
BOOL MyApp::InitInstance(){
    //1、创建类框架
    MyFrame *frame = new MyFrame;
    //2、显示窗口
    frame -> ShowWindow(SW_SHOWNORMAL);
    //3、更新窗口
    frame -> UpdateWindow();
    //4、保存框架类对象指针
    m_pMainWnd = frame;
    return TRUE;
}

//重写构造函数
MyFrame::MyFrame(){
    //创建窗口
    Create(NULL,TEXT("mfc"));
}

2.3MFC的消息映射

息映射就是将消息和成员函数相互关联的表。比如,Windows将一个鼠标左击消息放到一个框架窗口消息队列中,然后这个窗口取到这个消息时候,MFC将搜索该窗口的消息映射,如果存在一个处理鼠标左击消息(WM_LBUTTONDOWN)的处理程序,就调用。

下面是如何在一个类中编写一个消息映射

  • 在操作的类中声明消息宏
  • 通过放置标识消息的宏来执行消息映射,相应的类将对BEGIN_MESSAGE_MAP和END_MESSAGE_MAP的调用之间处理消息

mfc.h

class MyFrame : public CFrameWnd{
public:
    MyFrame();

    //声明消息宏
    DECLARE_MESSAGE_MAP()
}

mfc.cpp

//定义消息宏,在类中实现(派生类,父类)
BEGIN_MESSAGE_MAP(MyFrame,CFrameWnd)
    ON_WM_LBUTTONDOWN
END_MESSAGE_MAP()

//重写构造函数
MyFrame::MyFrame(){
    //创建窗口
    Create(NULL,TEXT("mfc"));
}

对应的处理函数分别在类中声明,类外定义

mfc.h

//框架类CFrameWnd,MyFrame派生类
class MyFrame : public CFrameWnd{
public:
    //构造函数
    MyFrame();
    //声明消息宏
    DECLARE_MESSAGE_MAP()
    //函数声明
    dfx_msg void OnLButtonDown(UINT,CPoint);
}

mfc.cpp

//定义消息宏,在类中实现(派生类,父类)
BEGIN_MESSAGE_MAP(MyFrame,CFrameWnd)
    ON_WM_LBUTTONDOWN
END_MESSAGE_MAP()

//重写构造函数
MyFrame::MyFrame(){
    //创建窗口
    Create(NULL,TEXT("mfc"));
}

//定义具体函数的实现
void OnLButtonDown(UINT,CPoint){
    .......
    .......
}

2.4创建项目时候使用MFC模板

创建之后,会产生下面的几个类

MFC简介以及基础使用(小白级别入门讲解)_第1张图片

其中要记住,我们的处理函数就是在视图类中编写。可以理解原来的框架类是作为底图,现在的视图类是叠加在上面的一个白板区域,就在这上面绘制渲染

2.5VS2019中的类向导使用

ctrl+shift+x可以快速调出类向导。所谓类向导,就是帮助你快速的产生消息映射,再也不用像上面一样自己手写开始宏,结束宏…会自动帮你生成这些。
MFC简介以及基础使用(小白级别入门讲解)_第2张图片

三、MFC的绘图简介

3.1MFC绘图基本介绍

Windows GDI 是Windows提供的图像设备接口,可以将图形绘制在显示器上

MFC是提供2个类来支持调用GDI:

  • DC类:用来设置绘图属性和绘制图形
  • 绘图对象类:封装了各种GDI绘图对象,包括画笔,刷子,字体…

而在MFC中图像设备接口被抽象为CDC类,CDC类封装了所有的GDI函数,所以使用CDC类绘图,而窗口操作在CWnd类。

CDC类中又有4个子类

  • CClientDC 操作用户区,在鼠标绘图,绘制文本时候要用到它
  • CMetaFileDC 设备环境类,在构造期间执行BeginPaint,析构期间执行EndPaint
  • CPaintDC
  • CWindowsDC

3.2CDC类

GetDC、releaseDC是CWnd类的成员函数
CreateDC、DeleteDC是CDC类的成员函数

下面是展示三种获取设备环境对象的方法、

void CDrawTestView::Draw(CDC *pDC)
{
  //使用传入CDC的对象指针绘图指针
  pDC -> LineTo(200,100);

  //构造CClientDC设备环境对象指针
  CClientDC dc(this);
  dc.LineTo(200,200)

  //通过GetDC函数获得设备环境对象指针
  CDC* p = this ->GetDC();
  p->LineTo(100,200);
  //利用GetDC函数获得的设备环境对象必须使用ReleaseDC函数释放
  this->ReleaseDC(p);
}

你可能感兴趣的:(c++,c++,mfc,桌面,c语言)