手写MFC应用程序流程---第二课

手写MFC应用程序流程的步骤:

1.创建 Win32 项目 -》空项目–》 修改属性中 配置属性-》常规-》MFC的使用,改为:在共享DLL中使用MFC(默认为使用标准Windows)
2.添加头文件,cpp文件

MFC窗口创建的流程:

  1. 头文件中:
    创建两个类: 应用程序类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 菜单的操作,,,有自更新机制,自动更新,不用管
通告消息: 控件产生的事件

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值