MFC_C++01-window简单名词解析,创建底层窗口WinMain函数,利用MFC创建窗口,Windows字符集介绍

01 window简单名词解析

1.Windows消息机制

1.SDK和API

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

2.窗口和句柄

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

3.消息与消息队列

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
###4. WinMain函数
在这里插入图片描述

2.Windows编程模型

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

02.创建底层窗口WinMain函数介绍

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

//WINAPI 代表_stdcall参数传递顺序,从右往左,依次入栈,并且在函数返回前自动清空堆栈内容
//WinMain函数入口
int WINAPI WinMain(
	HINSTANCE hInstance,//应用程序实例句柄
	HINSTANCE hPrevInstance,//前一个应用程序实例句柄,在win32环境下,基本值为NULL,不起作用
	LPSTR lpCmdLine,//char * argv[] 命令行参数数组
	int nShowCmd)//窗口命令显示,最大化最小化...
{
	//实现底层窗口 6步骤

	//1.设计窗口类
	//2.注册窗口类
	//3.创建窗口类
	//4.显示和更新窗口
	//5.通过循环取消息
	//6.处理消息(窗口过程)

	return 0;
}

03 底层实现窗口的前5步骤

1.设计窗口类
2.注册窗口类
3.创建窗口类
4.显示和更新窗口
5.通过循环取消息


//WINAPI 代表_stdcall参数传递顺序,从右往左,依次入栈,并且在函数返回前自动清空堆栈内容
//WinMain函数入口
int WINAPI WinMain(
	HINSTANCE hInstance,//应用程序实例句柄
	HINSTANCE hPrevInstance,//前一个应用程序实例句柄,在win32环境下,基本值为NULL,不起作用
	LPSTR lpCmdLine,//char * argv[] 命令行参数数组
	int nShowCmd)//窗口命令显示,最大化最小化...
{
	//实现底层窗口 6步骤

	//1.设计窗口类
	//2.注册窗口类
	//3.创建窗口类
	//4.显示和更新窗口
	//5.通过循环取消息
	//6.处理消息(窗口过程)

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

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

	//3.创建窗口
	/*
	lpClassName, 类名
	lpWindowName, 窗口名
	dwStyle,显示风格 WS_OVERLAPPEDWINDOW
	x, y,\  创建窗口起始坐标  CW_USEDEFAULT
	nWidth, 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;//消息名称 WM_XXXX(WINDOW 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,过滤最小消息数量
		_In_ UINT wMsgFilterMax;过滤最大消息数量 0,都写0,代表捕获所有消息
		*/
		if(GetMessage(&msg, NULL, 0, 0) == FALSE)
		{
		break;
		}

		//翻译消息
		TranslateMessage(&msg);//比如:键盘输入c和ctrl+c时需要翻译,再次输入到消息列表中

		//分发消息
		DispatchMessage(&msg);
	}
	return 0;
}

04 底层窗口实现-处理窗口过程

处理消息(窗口过程)
windows.c:

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

//6.处理消息(窗口过程)
// CALLBACK 代表_stdcall参数传递顺序,从右往左,依次入栈,并且在函数返回前自动清空堆栈内容
LRESULT CALLBACK WindowProc(
	HWND hwnd, //消息所属窗口句柄
	UINT uMsg, //具体消息名称 WM_XXX
	WPARAM wParam,//键盘附加消息
	LPARAM lParam //鼠标附加消息
)
{
	switch (uMsg)
	{
	case WM_CLOSE:
		DestroyWindow(hwnd);//触发 WM_DESTORY  约定俗成一个事情:函数名 xxxWindow消息,不会放到消息队列中,而是直接执行
		break;
	case WM_DESTROY:
		PostQuitMessage(0); //发送退出消息
		break;
	case WM_LBUTTONDOWN: //鼠标左键按下消息
	{
		int xPos;
		int yPos;
		xPos = LOWORD(lParam);
		yPos = HIWORD(lParam);

		//打印操作,通常同MessageBox

		TCHAR 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("helloworld"), strlen("helloworld"));
		EndPaint(hwnd, &ps);
	}
		break;
	default:
		break;
	}
	return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
//WINAPI 代表_stdcall参数传递顺序,从右往左,依次入栈,并且在函数返回前自动清空堆栈内容
//WinMain函数入口
int WINAPI WinMain(
	HINSTANCE hInstance,//应用程序实例句柄
	HINSTANCE hPrevInstance,//前一个应用程序实例句柄,在win32环境下,基本值为NULL,不起作用
	LPSTR lpCmdLine,//char * argv[] 命令行参数数组
	int nShowCmd)//窗口命令显示,最大化最小化...
{
	//实现底层窗口 6步骤

	//1.设计窗口类
	//2.注册窗口类
	//3.创建窗口类
	//4.显示和更新窗口
	//5.通过循环取消息
	//6.处理消息(窗口过程)

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

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

	//3.创建窗口
	/*
	lpClassName, 类名
	lpWindowName, 窗口名
	dwStyle,显示风格 WS_OVERLAPPEDWINDOW
	x, y,\  创建窗口起始坐标  CW_USEDEFAULT
	nWidth, 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;//消息名称 WM_XXXX(WINDOW 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,过滤最小消息数量
		_In_ UINT wMsgFilterMax;过滤最大消息数量 0,都写0,代表捕获所有消息
		*/
		if(GetMessage(&msg, NULL, 0, 0) == FALSE)
		{
			break;
		}

		//翻译消息
		TranslateMessage(&msg);//比如:键盘输入c和ctrl+c时需要翻译,再次输入到消息列表中

		//分发消息
		DispatchMessage(&msg);
	}
	return 0;
}

在这里插入图片描述

05 利用MFC创建窗口

1.MFC入门

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

2.代码实现

在这里插入图片描述

mfc.h:

#include <afxwin.h>//mfc需要包含的头文件

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

//窗口框架类
class MyFrame :public CFrameWnd
{
public:
	MyFrame();
};

mfc.cpp:

#include"mfc.h"

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

BOOL MyApp::InitInstance()
{
	//创建窗口
	//MyFrame* frame = new MyFrame;

	//显示和更新
	//frame->ShowWindow(SW_SHOWNORMAL);
	//frame->UpdateWindow();

	//m_pMainWnd = frame;//保证指向应用程序的主窗口指针

	m_pMainWnd = new MyFrame;

	//显示和更新
	m_pMainWnd->ShowWindow(SW_SHOWNORMAL);
	m_pMainWnd->UpdateWindow();

	return TRUE;//返回正常初始化
}

//窗口框架的默认构造函数
MyFrame::MyFrame()
{
	Create(NULL, TEXT("MFC WINDOW"));
}

在这里插入图片描述

3.vs2019 报错代码LNK2019:严重性 无法解析的外部符号 main,函数 “int __cdecl invoke_main(void)“(?invoke_main@@YAHXZ中引用了该符号

在这里插入图片描述

06 MFC中消息映射机制

在这里插入图片描述
mfc.h:

#include <afxwin.h>//mfc需要包含的头文件

class MyApp :public CWinApp //CWinApp 应用程序类
{
public:
	//MFC程序入口
	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;

	//显示和更新
	//frame->ShowWindow(SW_SHOWNORMAL);
	//frame->UpdateWindow();

	//m_pMainWnd = frame;//保证指向应用程序的主窗口指针

	m_pMainWnd = new MyFrame;

	//显示和更新
	m_pMainWnd->ShowWindow(SW_SHOWNORMAL);
	m_pMainWnd->UpdateWindow();

	return TRUE;//返回正常初始化
}

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

	CString str;//MFC使用的字符串
	//格式化字符串
	str.Format(TEXT("::::x = %d,y = %d"), point.x, point.y);

	MessageBox(str);
}

//键盘实现
void MyFrame::OnChar(UINT key, UINT, UINT)
{
	//TCHAR buf[1024];
	//wsprintf(buf, TEXT("按下了%c"), key);
	//MessageBox(buf);

	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);
}

//消息映射的分界宏
BEGIN_MESSAGE_MAP(MyFrame,CFrameWnd)
	ON_WM_LBUTTONDOWN() //鼠标左键按下 宏
	ON_WM_CHAR() //键盘宏
	ON_WM_PAINT() //绘图
END_MESSAGE_MAP()

//窗口框架的默认构造函数
MyFrame::MyFrame()
{
	Create(NULL, TEXT("MFC WINDOW"));
}

在这里插入图片描述

07 Windows字符集介绍

在这里插入图片描述

void MyFrame::OnPaint()
{
	CPaintDC dc(this);//画家,画到当前的窗口中

	//画文字
	dc.TextOutW(100, 100, TEXT("为了部落"));
	dc.Ellipse(10, 10, 100, 100);

	//多字节转宽字节
	MessageBox(L"aaa");
	//TEXT  TCHAR 自动编码转换
	MessageBox(TEXT("aaaa"));

	//统计宽字节字符串长度
	char s[] = "aaa";
	char* p = s;
	int n = 0;
	n = strlen(p);

	wchar_t s2[] = L"aaaa";
	wchar_t* p2 = s2;
	n = wcslen(p2);

	//string 互相转换char*  .c_str()
	//CString 和char* 互相转换
	//char* -> CString
	char s3[] = "aaa";
	char* p3 = s3;
	CString str = CString(p3);
	
	//CString -> char*
	CString str2 = TEXT("abc");
	CStringA tmp;
	tmp = str2;

	char* pp = tmp.GetBuffer();
	MessageBox(CString(pp));

}

//Window字符集
//ANSI 1个字符对应1个字节  多个字节
//中文 韩文... 宽字节 1个字符对应多个字节,UniCode utf8 3个字节 gbk 2个字节

08 利用向导创建MFC

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
后续都是默认值

视图-》类视图
在这里插入图片描述

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

MFC框架的一些重要的函数

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值