手写MFC应用程序流程的步骤:
1.创建 Win32 项目 -》空项目–》 修改属性中 配置属性-》常规-》MFC的使用,改为:在共享DLL中使用MFC(默认为使用标准Windows)
2.添加头文件,cpp文件
MFC窗口创建的流程:
- 头文件中:
创建两个类: 应用程序类MyApp和框架类MyFrame
MyApp : public CWinApp 而且里面有一个虚函数 InitInstance函数,作为函数入口地址
MyFrame:有一个构造函数
-----------------------------重要----------------------------
2).cpp中 //实际的执行流程为CPP中 A B 流程
A. 定义一个唯一的应用程序类的全局对象
B. 程序入口函数功能: InitInstance
a. 给框架类对象进行动态内存分配,创建一个框架类对象指针
aa. 框架类对象的构造函数中进行创建窗口CWnd::Create
b. 显示窗口 CWnd::showWindow
c.更新窗口 cWinTread::m_pMainWnd
d.保存框架类窗口对象指针 cWinTread::m_pMainWnd
-----------------------------重要----------------------------
消息映射机制的实现流程
1.DECLARE_MESSAGE_MAP() :
在头文件的类的内部添加,表明在类中使用消息映射机制,将消息映射到函数中
2.BEGING_MESSAGE_MAP(派生类名, 基类名) : 开始消息映射
ON_WM_LBUTTONDOWN( )//入口函数
ON_WM_PAINT()
END_MESSAGE_MAP() 结束消息映射
3.在头文件中声明消息处理函数
4.在cpp中实现消息函数
代码:
头文件中
#pragma once//防止头文件多次包含,只调用一次
#include <afxwin.h>
//应用程序类
class MyApp : public CWinApp
{
public:
//基类写虚函数
//派生类只是重写
//MFC应用程序入口函数
virtual BOOL InitInstance();
};
//框架类
class MyFrame : public CFrameWnd
{
public:
MyFrame();
afx_msg void OnLButtonDown( UINT, CPoint ) ; //只在.h中创建声明时,是不会响应函数的,必须在cpp的开始消息映射的地方声明一下
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP();//声明在一个类中使用消息映射,把消息映射到函数中,必须声明//在类实现中,必须在 开始消息映射和结束消息映射的地方添加 映射入口 ON_WM_LBUTTONDOWN( )
};
cpp中
#include "mfcc.h"
//有且只要一个全局的应用程序类对象
MyApp myApp;//如果不定义一个全局对象时,在winmain.cpp中 有一个AfxGetApp()函数就是获取应用程序的CWinAPP 对象的指针,此时返回的就是NULL 程序执行不了
BOOL MyApp::InitInstance()
{
/*
1.创建框架类对象
2.显示窗口
3.更新窗口
4.保存框架类对象指针
*/
//使用new 创建类的动态内存时,会自动调用类的构造函数。。。
MyFrame* myframe = new MyFrame;//new MyFrame() new MyFrame 这两个好像都行?
//显示窗口
myframe->ShowWindow(SW_SHOW);
//更新窗口
myframe->UpdateWindow();
//保存框架类指针
m_pMainWnd = myframe;//如果不保存框架类对象指针,则窗口一闪而过
//而且,还不能给 myframe 指针给delete掉,去掉也是一闪而过,那我啥时候给动态内存释放呢?
return TRUE;
}
BEGIN_MESSAGE_MAP(MyFrame,CFrameWnd)
ON_WM_LBUTTONDOWN( )
ON_WM_PAINT()
END_MESSAGE_MAP()
MyFrame::MyFrame()
{
//CWnd类的成员函数 CFrameWnd继承与CWnd
//创建对象
Create(NULL,TEXT("MFC"));//windows API时创建窗口需要用createwindow 而且还必须要先注册窗口类,才能用createwindow
//显示框框
}
void MyFrame::OnLButtonDown( UINT, CPoint )
{
MessageBox(TEXT("LLLD"));
}
void MyFrame::OnPaint()//必须加类说明符,否则会报错:“this”: 只能用于非静态成员函数内部
{
CPaintDC dc(this);
dc.TextOutW(30,30,TEXT("ACC"));
}
【总结】
【1】#pragma once :防止头文件多次包含,只调用一次,,放在头文件中。。。。。。。
【2】Create与CreateWindow的区别
CreateWindow是一个Windows API 函数,也是用来创建窗口的函数。
本文中如果使用CreateWindow 则必须的先注册窗口类,在创建窗口。
如果使用MFC自己封装好的窗口类在,则不用如此。
CFrameWnd::Create ,是MFC的CFrameWnd类的一个成员函数,用于创建和设置窗口,还函数已经把,初始化窗口的基本信息,注册窗口类封装在了一起。
【3】用new 给类进行动态内存分配对象时,
MyFrame* myframe = new MyFrame;//new MyFrame() new MyFrame 这两个好像都行?
MyFrame* myframe = new MyFrame();这两个都可以
后者
【4】//有且只要一个全局的应用程序类对象
MyApp myApp;//如果不定义一个全局对象时,在winmain.cpp中 有一个AfxGetApp()函数就是获取应用程序的CWinAPP 对象的指针,此时返回的就是NULL 程序执行不了
【5】执行时报错:“this”: 只能用于非静态成员函数内部
解决: OnPaint函数是在框架类函数中的,需要添加类作用域修饰符 MyFrame::
而且 CPaintDC必须只能在OnPaint()函数中使用
【6】在手动写消息映射时,如果在头文件中声明了消息处理函数,在cpp中有了函数的实现,但没有在 开始消息映射和结束消息映射的中间给出映射入口地址,则程序不会报错,只不过不会执行此功能。
【7】MFC中文本一些操作都是CDC类 的派生类,,,
问题: 在应用程序类中InitInstance函数中,给框架类进行 动态内存分配时 使用new ,那什么情况时候会使用delete 进行内存释放呢???
MFC有三种消息
标准消息:鼠标,键盘消息
命令消息:command 菜单的操作,,,有自更新机制,自动更新,不用管
通告消息: 控件产生的事件