MFC-Windows编程

MFC-Windows编程模型勿忘知识点

1.句柄(HANDLE) //系统在创建资源(窗口,光标…)的时候会为他们分配内存,并且返回标识这些资源的标识号,那就是句柄,和人的名字相差不大。
2.消息:

  • 窗口消息被操作系统捕获
  • 操作系统把消息放入消息队列(队列是先进先出)中
  • 应用程序从消息队列获取消息
  • 应用程序把消息分发给操作系统 E.操作系统调用回调函数(窗口过程)

3.WinMain函数 //Windows程序入口函数,和main函数作用一致,WinMain函数结束,Windows应用程序同样也结束。
4.Windwos编程的大致模型:

  • 导入#include<windows.h>头文件
  • WinMain函数的定义
  • 创建一个windows窗口
  • 进行消息循环
  • 编写窗口过程函数

图像






代码

#include<windows.h>
//6.处理消息(窗口过程)
LRESULT CALLBACK returnwin(HWND hwnd, //消息产生的窗口句柄
	UINT uMsg,  //消息名称
	WPARAM wParam,  //键盘的附加消息
	LPARAM lParam)  //鼠标的附加消息
{
	switch (uMsg)
	{
	case WM_CLOSE: DestroyWindow(hwnd); break; //DestroyWindow会发送WM_DESTROY消息
	case WM_DESTROY: PostQuitMessage(0); break; //结束消息循环(break)了,程序结束退出
	case WM_LBUTTONDOWN:  //鼠标左键按下
	{ int xPos = LOWORD(lParam);
	  int yPos = HIWORD(lParam);
	  char pos[99];
	  wsprintf(pos,TEXT("鼠标坐标是:x=%d,y=%d"), xPos, yPos); //拼接,对TEXT进行转义
	  MessageBox(hwnd, pos, TEXT("鼠标的左键被按下"), MB_OK); //hwnd窗口弹出消息,消息内容,消息标题,MB_OK按钮
	  break; 
	}	
	case WM_KEYDOWN: //键盘事件
		MessageBox(hwnd, TEXT("键盘被按下"), TEXT("我是标题"), MB_OK); break;
	case WM_PAINT: //绘图
	{	
		PAINTSTRUCT ps; //定义一个绘图结构体
		HDC hdc = BeginPaint(hwnd, &ps);  //画图对象,在hwnd窗口画图
		TextOut(hdc, 500, 200, TEXT("Hello World!"), strlen("Hello World!")); //开始画图
		EndPaint(hdc, &ps); //结束画图
		break;
	}
	}
	

	return DefWindowProc(hwnd, uMsg, wParam, lParam); //默认返回值
}
int WINAPI WinMain(       //WinMain程序入口函数,WINAPI是_stdcall参数的传递顺序:从右到左入栈且在函数返回前清空堆栈
	HINSTANCE hInstance,     //应用程序实例句柄,h代表句柄,instance是实例意思,以下类同
	HINSTANCE hPrevInstance,   //上一个应用程序的句柄,参数一般为NULL
	LPSTR lpCmdLine,  //相当于char * argv[]
	int nShowCmd)  //窗口显示指令(最大化...)
{
	//流程:设计窗口,注册窗口,创建窗口,显示和更新,通过循环取消息,处理消息(操作系统回调的窗口过程)
	
	//1.设计窗口
	WNDCLASS w;
	w.cbClsExtra = 0; //对类额外的内存
	w.cbWndExtra = 0; //对窗口额外的内存
	w.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //设置背景,声明:HGDIOBJ GetStockObject(int fnObject);
	w.hCursor = LoadCursor(NULL, IDC_HAND);//设置程序光标,第一个参数为空则使用系统提供一些的光标
	w.hIcon = LoadIcon(NULL, IDI_WARNING);//同上,IDC_HAND和IDI_WARNING光标样式
	w.hInstance = hInstance; //应用程序实例句柄,传入WinMain第一个参数做形参
	w.lpfnWndProc = returnwin; //回调函数,操作系统➡窗口过程,returnwin自定义回调函数
	w.lpszClassName = TEXT("Win32oop"); //窗口类名称
	w.lpszMenuName = NULL; //菜单名称
	w.style = 0; //窗口显示的风格,0为默认的风格

	//2.注册窗口
	RegisterClass(&w); //注册一个窗口类

	//3.创建窗口
	HWND hwnd= CreateWindow(w.lpszClassName,
		TEXT("Windows窗口"),
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		CW_USEDEFAULT, 
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		NULL,
		NULL,
		hInstance,
		NULL);
	/* 
	HWND CreateWindow(lpClassName,lpWindowName,dwStyle,x,,,..);
	    lpClassName 类名
	    lpWindowName 标题名称
		dwStyle   窗口风格
		x 坐标
		y 同上
		nWidth  宽
		nHeight  高
		hWndParent 父窗口,没有就NULL
		hMenu 菜单,没有就NULL
		hInstance 实例句柄
		lpParam 附加值,没有就NULL
	*/

	//4.显示和更新
	ShowWindow(hwnd,SW_SHOWNORMAL); // 声明:ShowWindow(HWND hwnd,int nCmdShow); SW_SHOWNORMAL是正常显示窗口,也有最小化...显示
	UpdateWindow(hwnd); //声明:UpdateWindow(HWND hwnd);

	//5.通过循环取消息
	MSG msg;
	while(1)
	{
		if (GetMessage(&msg, NULL, 0, 0)==FALSE)
		{
			break;
		}
		TranslateMessage(&msg); //翻译消息,eg:组合按键消息的翻译以便实现组合按键功能
		DispatchMessage(&msg); //分发消息
	}
	/*
	MSG msg;
	HWND hwnd   主窗口的句柄
	UINT message    具体消息的名称
	WPARAM wParam   附加消息-键盘的消息
	LPARAM lParam   附加消息-鼠标的消息
	DWORD time  消息产生的时间
	POINT pt    鼠标消息-鼠标的坐标x,y  
	*/

	/*
	GetMessage(...)
	LPMSGlpMsg   消息
    HWND hWnd    捕获窗口,NULL则表示捕获所有的窗口
    UINT wMsgFilterMin  最小过滤的消息,0代表捕获所以的消息
    UINT wMsgFilterMax  最大过滤的消息,同上
	*/

	system("pause");
	return 0;
}

在这里插入图片描述

End

~
记录留存


发布了34 篇原创文章 · 获赞 0 · 访问量 501

猜你喜欢

转载自blog.csdn.net/weixin_44228006/article/details/104095644