MFC学习笔记001

教程:B站黑马程序员MFC教程(3天)
网址:https://www.bilibili.com/video/BV1JW41147NX?p=1
需要下载API: VC++之MFC类库中文手册(修正者:一怀去意) (注:百度可以找到,百度网盘下载)

课程安排

第一天(Win消息机制,SDK编程基础):
1,基本概念介绍(SDK,API,句柄,消息队列,WinMain函数)
2,第一个Windows界面程序(WinAPI)
3,消息循环和窗口过程函数
4,第一个MFC程序(CWinApp,CFrameWnd)
5,消息映射
6,unicode字符集介绍
7,根据向导创建MFC应用程序
8,MFC应用程序几个重要函数的介绍
9,事件的添加和删除

第二天(对话框,常用控件,文档和视图):
1,对话框(模态和非模态)
2,常用控件的使用
a)按钮CButton
b)编辑框CEdit
c)组合框(下拉框)CComboBox
d)列表视图控件CListCtrl
e)树视图控件CTreeCtrl
f)标签控件CTabCtrl

第三天(综合案列:销售信息管理系统)

第一天

1,底层实现窗口
1.1 sdk api 句柄
1.2 消息处理机制
1.3 头文件 windows.h
1.4 程序入口 WinMain

2,具体6个步骤
2.1 1,设计窗口 WNDCLASS wc
2.2 2,注册窗口 RegisterClass
2.3 3,创建窗口 createWindow
2.4 4,显示和更新 showWindow updateWindow
2.5 5,通过循环取消息 MSG msg
2.5.1 写循环 while(1)
2.5.2 GetMessage==false 退出循环
2.5.3 翻译消息
2.5.4 分发消息
2.6 6,窗口过程
2.6.1 LRESULT CALLBACK WindowProc
2.6.2 返回默认处理
2.6.3 return DefWindowProc(hwnd,uMsg,wParam,lParam);
2.6.4 点击叉子 WM_CLOSE destroy
2.6.5 WM_DESTROY postQuitMessage(0)
2.6.6 鼠标左键按下
2.6.7 键盘按下
2.6.8 绘图文字
3,利用mfc创建窗口
3.1 mfc头文件 afxwin.h
3.2 自定义类 继承与CWinApp应用程序类 MyApp app 应用程序对象,有且仅有一个
3.3 程序如果 InitInstance
3.4 入口里创建窗口
3.5 窗口类MyFrame 继承与CFrameWnd
3.6 MyFrame构造中Create(NULL,标题名称)
3.7 创建窗口对象
3.8 显示和更新
3.9 m_pMainWnd = frame;//保存指向应用程序的主窗口的指针
3.10 return TRUE
3.11 对项目进行配置 在共享DLL中使用MFC
4,消息映射机制
4.1 声明宏 写到.h中
4.2 分界宏 写到.cpp中
4.3 找消息宏 写到分界宏中间
4.4 把函数原型 声明写到.h中
4.5 函数的实现写到.cpp中
4.6 鼠标,键盘,绘图
5,window字符集
5.1 多字节 字符串 转宽字节
5.2 声明 宽字节字符串 wchar_t
5.3 统计宽字节字符串wcslen
5.4 TEXT 做了自适应编码转换
5.5 char* CString之间转换
6,利用向导创建mfc
6.1 wiew视类 相片 MainFrame类 相框
6.2 OnCreate Create WM_Create联系
6.3 OnDraw OnPaint 如果同时存在OnPaint会覆盖OnDraw

创建项目步骤:
创建新项目–> 选择windows桌面向导–>取项目名称–>选择桌面应用程序–>源文件添加.c文件

底层窗口实现代码:
#include <windows.h>//底层实现窗口的头文件

		//6,处理窗口过程
		//CALLBACK代表__stdcall 参数的传递顺序:从右到左 依次入栈,并且在函数返回前 清空堆栈
		LRESULT CALLBACK WindowProc(
			HWND hwnd,//消息所属的窗口句柄
			UINT uMsg,//具体消息名称 WM_XXXX消息名
			WPARAM wParam,//键盘附加消息
			LPARAM lParam//鼠标附加消息
		)
		{	
			switch (uMsg)
			{
				case WM_CLOSE://关闭
					//所有xxxWindow为结尾的方法,都不会进入到消息队列中,而是直接执行
					DestroyWindow(hwnd);//DestroyWindow 发送另一个消息 WM_DESTROY
					break;

				case WM_DESTROY://销毁
					PostQuitMessage(0);//PostQuitMessage(0),关闭进程
					break;

				case WM_LBUTTONDOWN://鼠标左键按下
						{
							int xPos = LOWORD(lParam);
							int yPos = HIWORD(lParam);

							char buf[1024];
							wsprintf(buf, TEXT("x=%d,y=%d"), xPos, yPos);
							MessageBox(hwnd, buf, TEXT("鼠标左键按下"), MB_OK);//获取鼠标左键按下时的坐标并弹出消息
							break;
						}

				case WM_KEYDOWN://键盘
					MessageBox(hwnd, TEXT("键盘按下了"), TEXT("键盘按下了"), MB_OK);
					break;

				case WM_PAINT://绘图
						{
							PAINTSTRUCT ps;
							HDC hdc = BeginPaint(hwnd, &ps);
							TextOut(hdc, 100, 100, TEXT("HELLO"), strlen("HELLO"));
							EndPaint(hwnd, &ps);
							break;
						}
			
			}
			//返回值用默认处理方式
			return DefWindowProc(hwnd, uMsg, wParam, lParam);
		}


		//程序函数入口
		//WINAPI代表__stdcall 参数的传递顺序:从右到左 依次入栈,并且在函数返回前 清空堆栈
		int WINAPI WinMain(
			HINSTANCE hInstance,	//应用程序实例句柄
			HINSTANCE hPrevInstance,	//上一个应用程序句柄,在win32环境下,参数一般为NULL,不起作用了
			LPSTR lpCmdLine,	//char * argv[]
			int nShowCmd	//显示命令 最大化,最小化 正常
		)
		{
			//1,设计窗口
			//2,注册窗口
			//3,创建窗口
			//4,显示和更新
			//5,通过循环取消息
			//6,处理消息(窗口过程)


			//1,设计窗口
			WNDCLASS wc;
			wc.cbClsExtra = 0;//类的额外内存
			wc.cbWndExtra = 0;//窗口额外内存
			wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//设置背景
			wc.hCursor = LoadCursor(NULL, IDC_HAND);//设置光标 如果第一个参数为NULL,代表使用系统提供的光标
			wc.hIcon = LoadIcon(NULL, IDI_ERROR);//图标 如果第一个参数为NULL,代表使用系统提供的图标
			wc.hInstance = hInstance;//应用程序实例句柄 传入WinMain中的形参即可
			wc.lpfnWndProc = WindowProc;//回调函数  窗口过程
			wc.lpszClassName = TEXT("WIN");//指定窗口类名称
			wc.lpszMenuName = NULL;//菜单名称
			wc.style = 0;//显示风格 0代表默认风格

			//2,注册窗口类
			RegisterClass(&wc);

			//3,创建窗口

			/*
			lpClassName,//类名
			lpWindowName,//标题名
			dwStyle, //风格   WS_OVERLAPPEDWINDOW
			x,//显示x轴坐标		 CW_USEDEFAULT 默认值
			y,//显示y轴坐标		 CW_USEDEFAULT 默认值
			nWidth,//显示宽		 CW_USEDEFAULT 默认值
			nHeight,//显示高	 CW_USEDEFAULT 默认值
			hWndParent,//父窗口 NULL
			hMenu, //菜单 NULL
			hInstance,//实例句柄 hInstance
			lpParam//附加值 NULL
			*/
			HWND hwnd=CreateWindow(wc.lpszClassName, TEXT("WINDOWS"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
				CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

			//4,显示和更新
			ShowWindow(hwnd, SW_SHOWNORMAL);
			UpdateWindow(hwnd);

			//5,通过循环取消息
			/*
			HWND        hwnd;//主窗口句柄
			UINT        message;//具体消息名称
			WPARAM      wParam;//附加消息,键盘消息
			LPARAM      lParam;//附加消息,鼠标消息
			DWORD       time;//消息产生时间
			POINT       pt;//附加消息,鼠标消息,x,y
			*/
			MSG msg;
			while (1)
			{
				/*
				_Out_ LPMSG lpMsg,//消息
				_In_opt_ HWND hWnd,//捕获窗口 填NULL代表捕获所有窗口
				_In_ UINT wMsgFilterMin,//最小和最大的过滤消息,一般填0
				_In_ UINT wMsgFilterMax);//填0代表捕获所有消息
				*/
				if (GetMessage(&msg, NULL,0,0)==FALSE)
				{
					break;
				}

				//翻译消息
				TranslateMessage(&msg);

				//不为false 
				//分发消息
				DispatchMessage(&msg);
			}

			return 0;
		}

MFC

创建项目步骤:
创建新项目–> 选择windows桌面向导–>取项目名称–>选择桌面应用程序–>添加头文件和源文件

配置:鼠标右键项目–>属性–>配置属性–>高级–>MFC的使用–>在共享DLL中使用MFC

mfc.h 头文件中代码
#include <afxwin.h>//mfc头文件

	class MyApp:public CWinApp //CWinApp应用程序类
	{
	public:
		//程序入口
		virtual BOOL InitInstance();

	};

	class MyFrame :public CFrameWnd //窗口框架类
	{
	public:
		MyFrame();//构造函数

		//声明宏 提供消息映射机制
		DECLARE_MESSAGE_MAP();

		//鼠标左键按下
		afx_msg void OnLButtonDown(UINT, CPoint);
		//键盘按下
		afx_msg void OnChar(UINT, UINT, UINT);
		//绘图
		afx_msg void OnPaint();
	};

mfc.cpp 源文件中代码

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

	MyApp app;//全局应用程序对象,有且仅有一个

	BOOL MyApp::InitInstance()//程序入口地址
	{
		//创建窗口
		MyFrame* frame = new MyFrame;//1,创建框架类对象

		//显示和更新
		frame->ShowWindow(SW_SHOWNORMAL);//2,显示窗口
		frame->UpdateWindow();//3,更新窗口

		m_pMainWnd = frame;//4,保存指向应用程序的主窗口的指针
		return TRUE;//返回正常初始化
	}

	//分界宏
	BEGIN_MESSAGE_MAP(MyFrame,CFrameWnd)
		ON_WM_LBUTTONDOWN()//鼠标左键按下

		ON_WM_CHAR()//键盘按下

		ON_WM_PAINT()//绘图宏
	END_MESSAGE_MAP()

	//创建窗口
	MyFrame::MyFrame()
	{
		Create(NULL, TEXT("mfc"));//创建窗口
	}

	//鼠标左键按下
	void MyFrame::OnLButtonDown(UINT, CPoint point)
	{
		/*TCHAR buf[1024];
		wsprintf(buf, TEXT("x=%d,y=%d"), point.x, point.y);
		MessageBox(buf);*/

		//mfc中的字符串 CString
		CString str;
		str.Format(TEXT("x=%d,,,,,y=%d"),point.x,point.y);
		MessageBox(str);
	}

	//键盘按下
	void MyFrame::OnChar(UINT key, UINT, UINT)
	{
		CString str;
		str.Format(TEXT("按下的键为:%c"),key);
		MessageBox(str);
	}

	//绘图
	void MyFrame::OnPaint()
	{
		CPaintDC dc(this);

		dc.TextOutW(100,100,TEXT("为了部落"));
		//画椭圆
		dc.Ellipse(10,10,100,100);
	}

5,windows字符集
//多字节转为宽字节
//TEXT是有自适应编码的转换
//TCHAR自适应编码的转换
//MessageBox(L"aaa");

//统计字符串长度
int num = 0;
const char* p = "aaaa";
num = strlen(p);

//统计宽字节的字符串长度
const wchar_t* p2 = L"bbbb";
num = wcslen(p2);

//char * 与CString之间的转换
//char* ->CString
const char* p3 = "ccc";
CString str = CString(p3);
//CString ->char*
CStringA tmp;
tmp = str;
char* pp = tmp.GetBuffer();		

6,利用向导创建mfc
创建新项目–>MFC应用–>起应用名–>应用程序类型选单个文档–>项目样式选MFC标准–>完成

上一篇:Linux 命令001


下一篇:Terraform 入门教程-001