mfc 学习的第一天

mfc 学习的第一天

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、显示和更新 showWindhow 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 绘图 文字

vs2013创建win32项目

步骤:文件→新建→项目→选择Win32项目,确定→下一步→勾上空项目,完成→源文件右键→添加→新建项→C++文件→名称为:windows.c→添加

小技巧:

安装番茄助手,提高编程效率。

注释/取消注释
1)注释:组合键“Ctrl+K+C”;
2)取消注释:组合键“Ctrl+K+U”

windows.c的源码

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

 


//6、处理窗口过程


//CALLBACK 代表__stdcall参数的传递顺序:从右到左 一次入栈,并且在函数返回前 清空堆栈
LRESULT CALLBACK WindowProc(
	HWND   hwnd,   //消息所属的窗口句柄
	UINT   uMsg,   //具体的消息名称  WM_XXXX 消息名
	WPARAM wParam, //键盘附加消息
	LPARAM lParam  //鼠标附加消息
	)
{
	POINT pt; //定义坐标
	PAINTSTRUCT ps; //定义绘图结构体
	HDC	hdc; //定义设备上下文句柄 
	switch (uMsg)
	{
	case WM_CLOSE:
		//所以xxxWindow为结尾的方法,都不会进入到消息队列中,而是直接执行
		DestroyWindow(hwnd); //DestroyWindow  发送另一个消息 WM_DESTROY
		break;
	case WM_DESTROY:
		PostQuitMessage(0);  //真正的退出窗口 使 GetMessage(&msg,NULL,0,0) == FALSE
	case  WM_LBUTTONDOWN:  //鼠标左键按下
		pt.x = GET_X_LPARAM(lParam);  //GET_X_LPARAM 方法 需要加windowsx.h 头文件
		pt.y = GET_Y_LPARAM(lParam);

		wchar_t buf[1024];
		wsprintf(buf, TEXT("x = %d,y = %d"), pt.x, pt.y);

		MessageBox(hwnd, buf, TEXT("鼠标的左键按下"), MB_OK);
		break; 
	case WM_KEYDOWN:  //键盘
		MessageBox(hwnd, TEXT("键盘按下"), TEXT("键盘按下"), MB_OK);
		break;

	case WM_PAINT: //绘图
		//绘图结构体
		hdc = BeginPaint(hwnd, &ps);
		TextOut(hdc, 100, 100, TEXT("hello"), strlen("hello"));
		EndPaint(hwnd, &ps);

		break;
	default:
		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 = LoadCursorW(NULL,	IDC_HAND);  //设置光标 如果第一个参数为NULL,代表使用系统提供的光标
	 wc.hIcon = LoadIconW(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,  显示坐标  CW_USEDEFAULT 使用默认值
	 y,
	 nWidth,  宽高
	 nHeight, 
	 hWndParent,   父窗口 NULL
	 hMenu,   菜单 NULL
	 hInstance,  实例句柄 hInstance
	 lpParam  附加值  鼠标附加值 NULL
	 */
	 HWND hwnd =  CreateWindow(wc.lpszClassName,wc.lpszMenuName,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 (GetMessage(&msg,NULL,0,0))
	 {
		 /*
		_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);

	 }

	 //6、处理窗口过程


	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shark_xk88

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值