MFC(1)

MFC:微软基础类库(Microsoft Foundation Classes) 在Windows平台做GUI(图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。)开发,MFC很好的选择 不仅要学习MFC还得学习它的框架设计思想。底层调用WinApi

  • SDK:软件开发工具包(缩写:SDK、外语全称:Software Development Kit)一般都是一些软件工程师为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合。
  • JDK:JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。
  • IDE:集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。VS,QT
  • API :应用程序接口
  • WINAPI:windows平台下的系统调用。包含头文件windows.h,调用系统提供的特殊接口,得到系统资源
  • 窗口:父窗口,子窗口。 客户区(里面的内容),非客户区(外边的框架)
  • 句柄:结构体类型HANDLE,窗口句柄HWND,图标句柄HICON。和文件控制符那些差不多
  • 消息队列:程序运行的时候,操作系统会同时创建消息队列,你点击鼠标或者键盘,操作系统捕获,会把消息放入到消息队列,死循环取出来给操作系统,操作系统调用处理函数处理(处理函数叫做窗口处理函数)
  • WinMain函数:WINAPI的入口地址
    消息处理MFC(1)
    Windows编程模型MFC(1)

WinAPI窗口程序

  1. 定义一个入口函数WinMain()
  2. 创建一个窗口
    a.设计窗口类WNDCLASS(给成员变量赋值)
    b.注册窗口类
    c.创建窗口类
    d.显示更新窗口
  3. 消息循环
  4. 窗口过程函数
#include<windows.h>
//窗口过程函数
LRESULT CALLBACK DealMessage(HWND hWnd,//窗口句柄,消息所属的窗口
	UINT uMsg,  //消息标志
	WPARAM wParam, //附加信息
	LPARAM lParam)
{
	switch (uMsg) {
	case WM_LBUTTONDOWN://鼠标左键按下
		MessageBox(hWnd, TEXT("ABC"), TEXT("鼠标左键按下"), MB_OK);
		break;
	case WM_PAINT:
	{
		PAINTSTRUCT ps;//绘图结构体
		HDC dc = BeginPaint(hWnd, &ps);//开始
		TCHAR *p = L"我爱你也";//转化宽字节
		TextOut(dc, 1, 1, p, wcslen(p));
		EndPaint(hWnd, &ps);//结束
		break;
	}
	case WM_DESTROY:
		PostQuitMessage(2);  //WM_QUIT,  2给主函数return msg.wParam
		break;
	default:
		return DefWindowProc(hWnd, uMsg, wParam, lParam);
	}
	return 0;
}

//WINAPI:修饰函数:规定函数参数入栈从右往左,函数调用完毕,自动清理
//CALLBACK
//int main(int argc,char *argv[])第一个参数代表传参个数,第二个把它放到指针数组

int WINAPI WinMain(HINSTANCE hInstance,  //应用程序实例
	HINSTANCE hPrevInstacne,  //上一个应用程序实例,不用
	LPSTR lpCmdLine,			//long point string char*  命令行参数
	int nCmdShow)			//窗口显示的样式,最大化,最小化
{
	/*	1. 定义一个入口函数WinMain()
		2. 创建一个窗口
			a.设计窗口类WNDCLASS(给成员变量赋值)
			b.注册窗口类
			c.创建窗口类
			d.显示更新窗口
		3.  消息循环 
		4.  窗口过程函数	*/

	//a.设计窗口类WNDCLASS(给成员变量赋值)
	WNDCLASS wc;
	wc.cbClsExtra = 0;  // 类的附加信息
	wc.cbWndExtra = 0;	// 窗口附加信息
	//获取系统默认的白色画刷
	wc.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH) ;//背景色,必须写
	//wc.hCursor = NULL;//光标 默认的写NULL
	wc.hCursor = LoadCursor(NULL, IDC_HELP);  //加载系统默认光标
	//wc.hIcon = NULL;//默认图标
	wc.hIcon = LoadIcon(NULL, IDI_WARNING);//加载默认图标
	wc.hInstance = hInstance;//应用程序实例
	wc.lpfnWndProc = DealMessage;  //窗口过程函数名字,消息处理函数
	wc.lpszClassName = TEXT("abc");//类的名字
	wc.lpszMenuName = NULL;//菜单名字 不用为空
	wc.style = nCmdShow;//显示风格

	//b.注册窗口类,告诉系统窗口过程函数的入口地址
	RegisterClass(&wc);

	//c.创建窗口类
	HWND hWnd=CreateWindow(TEXT("abc"), TEXT("hello,windows"), WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
		NULL, NULL, hInstance, NULL);

	//d.显示和更新窗口
	ShowWindow(hWnd, nCmdShow);//也有参数,可以查阅MSDN LIBRARY
	UpdateWindow(hWnd);

	//消息循环
	MSG msg;
	//如果接受到WM_QUIT,返回0,退出
	//如果出错,返回-1,不退出
	while (GetMessage(&msg, NULL, 0, 0))
	{
		//翻译工作
		//虚拟按键(键盘)转为标准字符WM_CHAR
		TranslateMessage(&msg);
		//给操作系统分发消息
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

MFC程序(纯代码)

  1. 应用程序类 CWinAPP
  2. 框架类 CFrameWnd

消息映射
1 所操作类中,声明消息映射宏 DECLARE_MESSAGE_MAP()
2. 对应.cpp 定义宏
BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)//派生类 基类 BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)//派生类 基类
//消息映射入口标志
END_MESSAGE_MAP()
3.对应类中,消息处理函数的声明
4.对应.cpp消息处理函数的定义
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();//画画  cdc
};

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->UpdateData();

	//4.保存框架类对象指针
	//修改属性MFC的使用为共享DDL
	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()
{
	CPaintDC cdc(this);
	cdc.TextOutW(100, 100, TEXT("画画啊啊"));
}

利用向导来创建

文档视图结构

  1. 文档:它是一个类,存储数据
  2. 视图:它是一个类,显示和修改数据
  3. 框架类:一个容器,这个容器装了视图

几个比较重要的函数几个比较重要的函数 几个比较重要的函数几个比较重要的函数

  1. 应用程序类CwinApp:

a. InitIstance(),程序的入口地址InitIstance(),程序的入口地址

  1. 框架类CFrameWnd:

a.PreCreateWindow()创建窗口之前的调用
b.OnCreate()创建窗口后,触发WM_CREATE,它是WM_CREATE消息的处理函数

  1. 视图类CView():

a.OnDraw():绘图 b.WM_PAINT消息处理函数OnPaint()内部调用OnDraw()
c.OnPaint()和OnDraw()同时存在,只有OnPaint()有效

事件的添加和删除

a.框架和视图的区别 选择所需类->右击->属性->消息- >WM_LBUTTONDOW->ADD 框架就相当于容器,容器放视图
视图相当于壁纸

字符集

ANSI 多字节,单字节 char p[]=“adasdas”; //一个字符一个字节

unicode 宽字节,一个字符两个字节 TCHAR *p=L"abc"; // 一个字符两个字节 wcslen ( p) ;//长度

MFC: TCHAR:自动适应字节(条件编译) TEXT();

扩展

afx_xxxxx:全局函数,不属于某个类特有的 xxxEx, xxxW, 扩展函数

类名函数名首字母大写
形参第二个英文单词首字母大写
成员对象m_大写英文单词首字母