MFC界面编程基础(02):MFC窗口的创建

上一篇:MFC界面编程基础(01):Windows 编程模型下一篇:MFC界面编程基础(03):消息映射、窗口绘制、文档/视图结构体系

MFC是什么?

微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是一个微软公司提供的类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。
MFC把Windows SDK API函数包装成了几百个类,MFC给Windows操作系统提供了面向对象的接口,支持可重用性、自包含性以及其他OPP原则。MFC通过编写类来封装窗口、对话框以及其他对象,引入某些关键的虚函数(覆盖这些虚函数可以改变派生类的功能)来完成,并且MFC设计者使类库带来的总开销降到了最低。

编写第一个MFC应用程序

两个重要的MFC类:

  • CWinApp 应用程序类
  • CFrameWnd 窗口框架类

CFrameWnd 框架窗口类

MFC的CWnd类以及其派生类为 窗口 或 应用程序创建的窗口 提供了面向对象的接口。CFrameWnd就是从CWnd派生出来的。CFrameWnd模仿框架窗口行为,我们可以把框架窗口作为顶层窗口看待,它是应用程序与外部世界的主要接口
如果想要创建一个窗口,可以在此类中调用Create或CreateEX函数,并且在CWinApp::InitInstance中创建一个框架窗口对象,并通过ShowWindow函数将其显示出来。

CFrameWnd::Create原型如下:
在这里插入图片描述
Create接收的8个参数6个有默认值定义。我们只需要为函数的前两个参数指定值,剩下六个参数接收默认值。第一个参数lpszClassName指定了窗口基于WNDCLASS类的名称,为此将其设定为NULL将创建一个基于已注册的WNDCLASS类的默认框架窗口。lpszWindowName参数指定将在窗口的标题栏出现的文字。

CWinApp应用程序类
MFC应用程序的核心就是基于CWinApp类的应用程序对象。CWinApp提供了消息循环来检索消息并将消息调度给应用程序窗口。它还包括可被覆盖的、用来自定义应用程序行为的主要虚函数。一旦包含Afxwin.h,就可以将CWinApp以及其他MFC类引入应用程序中。一个MFC程序可以有且仅有一个应用程序对象,此对象必须声明为在全局范围内有效,以便它在程序开始时即在内存中被实例化

  1. InitInstance函数
    CWinApp::InitInstance函数是一个虚函数,其默认操作仅有一条语句:
    return TRUE;
    InitInstance的目的是给应用程序提供一个自身初始化的机会,其返回值决定了框架接下来要执行的内容,如果返回FALSE将关闭应用程序,如果初始化正常返回TRUE以便允许程序继续进行。此函数是MFC应用程序的入口。
  2. m_pMainWnd 成员变量
    在 CWinApp 中有一个名为 m_pMainWnd 的成员变量。 该变量是一个 CWnd 类型的指针,它保存了应用程序框架窗口对象的指针。也就是说,是指向 CFramWnd 对象(框架窗口类对象)的指针。
  3. 程序代码实现

在这里插入图片描述
在这里插入图片描述

完整代码
// mfc.h

#pragma once

#include <afxwin.h>

//1)应用程序类 CWinApp, 派生类(子类)
class MyApp: public CWinApp
{
public:
	//基类的虚函数
	//派生类只是重写
	//MFC程序的入口地址
	virtual BOOL InitInstance();
};



//2)框架类	CFrameWnd, 派生类(子类)
class MyFrame: public CFrameWnd
{
public:
	MyFrame();

	//声明消息映射宏
	DECLARE_MESSAGE_MAP()

	afx_msg void OnLButtonDown(UINT, CPoint);

	afx_msg void OnPaint();

private:
};

// mfc.cpp

#include "mfc.h"

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

//程序的入口地址
BOOL MyApp::InitInstance()
{

	/*
	1、创建框架类对象
	2、显示窗口
	3、更新窗口
	4、保存框架类对象指针
	*/

	//1、创建框架类对象
	MyFrame *frame = new MyFrame; //构造函数

	//	2、显示窗口
	frame->ShowWindow(SW_SHOWNORMAL);

	//	3、更新窗口
	frame->UpdateWindow();

	//4、保存框架类对象指针
	m_pMainWnd = frame;

	return TRUE;
}

//定义消息宏
BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)
	ON_WM_LBUTTONDOWN()
	ON_WM_PAINT()

END_MESSAGE_MAP()

MyFrame::MyFrame()
{
	//CWnd类的成员函数  CWnd::Create
	//CFrameWnd 继承于 CWnd

	Create(NULL, TEXT("MFC"));
}

void MyFrame::OnLButtonDown(UINT, CPoint)
{
	//CWnd::MessageBox
	MessageBox(TEXT("鼠标左键"));
}

void MyFrame::OnPaint()
{
// 	QPainter p(this);
// 	p.drawxxxx();

	CPaintDC cdc(this);
	cdc.TextOutW(100, 100, TEXT("你好,mfc"));
}

上一篇:MFC界面编程基础(01):Windows 编程模型下一篇:MFC界面编程基础(03):消息映射、窗口绘制、文档/视图结构体系
  • 0
    点赞
  • 16
    收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页
评论
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值