Win32底层实现一个窗口

MFC(微软基础类库Microsoft Foundation Classes)。把Windows底层C语言写的几千个函数,MFC把那些函数封装成了几百个类和对应方法。(不支持跨平台)

学MFC重点是一个学习能力和其思想。

SDK:软件开发工具包(Software Development Kit),一般都是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具集合。

API函数 Application Programming Interface 。编程的接口。

句柄:创建资源时系统提供的资源标识号。HICON  HCURSOR HANDLE

 

消息和消息队列:

最先是操作系统捕捉到消息,然后放入消息队列,消息队列根据先进先出的原则将消息传递给应用程序,然后应用程序其实并不做什么处理而是将消息分发给操作系统(DispathchMessage),操作系统根据回调函数(窗口过程)对相应的消息做出相应的动作。

 底层实现程序入口是WinMain函数。。。。。

1),WinMain函数的定义。

2),创建一个窗口。

3),进行消息循环。(GetMessage)

4),编写窗口函数过程。(回调函数)

 

#include <windows.h>

//6,处理窗口过程
LRESULT CALLBACK WindowProc( //WINAPI _stdcall 参数传递顺序:从右到左,以此入栈,并且在函数返回前清空堆栈
	HWND hWnd,//消息所属得窗口句柄
	UINT uMsg,//具体消息名称 WM_XXXXXX消息名
	WPARAM wParam,//键盘附加消息
	LPARAM lParam//鼠标附加消息
)
{
	switch (uMsg)
	{
	case WM_CLOSE:
		//所有xxxWindow为结尾的不会进入消息队列,直接就执行了。
		DestroyWindow(hWnd);//发送另外一个消息 WM_Destory
		break;
	case WM_DESTROY:
		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(NULL,buf,"鼠标左键摁下",MB_OK);
		break;
	case WM_KEYDOWN:
		int tmp = LOWORD(wParam);
		char ch = tmp;
		char buf1[1024];
		wsprintf(buf1, "%s", ch);
		MessageBox(NULL, buf, "键盘按下摁下", MB_OK);
		break;
	case WM_PAINT:
		PAINTSTRUCT ps;//绘图结构体
		HDC hdc = BeginPaint(hWnd, &ps);
		TextOut(hdc, 200, 200, "HelloWorld", 10);

		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,正常
{
	//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_APPLICATION);//同上
	wc.hInstance = hInstance;//应用程序的实例句柄,传入winmain中实参
	wc.lpfnWndProc = WindowProc;//回调函数,窗口过程。
	wc.lpszClassName = TEXT("Window");//指定窗口类名称。
	wc.lpszMenuName = NULL;//指定菜单
	wc.style = 0;//风格显示 0代表默认风格
	//2,注册窗口
	RegisterClass(&wc);

	//3创建窗口
	/*
	lpClassName, 类名 ClassName   一样就行了
	lpWindowName, 窗口标题名称
	dwStyle, 风格	帮助文档//WS_OVERLAPPEDWINDOW混合风格(包含很多)。
	x, 坐标	CW_USEDEFAULT//默认值
	y, CW_USEDEFAULT//默认值
	nWidth, 宽CW_USEDEFAULT//默认值
	nHeight, 高CW_USEDEFAULT//默认值
	hWndParent, 父窗口  NULL
	hMenu, 菜单  NULL
	hInstance, 实例 hInstance
	lpParam//附加值  鼠标附加值
	
	*/
	//没有重载方式
	HANDLE handle;
	handle = CreateWindow(wc.lpszClassName, TEXT("WindoWS"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);



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

	UpdateWindow(handle);
	//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代表捕获所有窗口(Therefore if hWnd is NULL, both window messages and thread messages are processed.
)
		_In_ UINT wMsgFilterMin,最小		0	一般添0(捕获所有消息)
		_In_ UINT wMsgFilterMax);最大	0	一般添0(捕获所有消息)
		//If wMsgFilterMin and wMsgFilterMax are both zero, GetMessage returns all available messages (that is, no range filtering is performed).


		*/
		if (GetMessage(&msg, NULL, 0, 0) == FALSE)//获取的消息是FALSE值	
		{
			break;
		}

		//翻译消息(a , w   ======  但是 ctrl + c  组合键就得翻译)
		TranslateMessage(&msg);
		//不为FALSE分发消息
		//分发消息
		DispatchMessage(&msg);
	}

	//6,处理窗口过程



}

 

#include <afxwin.h>引入这个头文件就都可以用了MFC函数。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值