_WinAPI创建窗口大致格式(笔记)

一、流程

1定义入口函数WinMain()

2创建一个窗口:

        a)设计窗口类WNDCLASS(给成员变量赋值)

        b)注册窗口类

        c)创建窗口类

        d)显示和更新窗口

3消息循环

4窗口过程函数

二、WinMain()

//WINAPI:修饰函数,规定函数参数入栈从右往左,函数调用完毕,自动清理堆栈
int WINAPI WinMain(HINSTANCE hInstance,//应用程序实例
	HINSTANCE hPrevInstance,//上一个应用程序实例
	LPSTR lpCmdLine,//long pointer string,命令行参数
	int nCmdShow//窗口显示样式
)

三、设计窗口类WNDCLASS

用来对窗口进行设置,写在WinMain之中

_WinAPI创建窗口大致格式(笔记)

    WNDCLASS wc;
	//类的附加信息
	wc.cbClsExtra = 0;
	//窗口的附加信息
	wc.cbWndExtra = 0;
	//背景色,必须写
	//获取系统默认的白色画刷
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	//光标图像
	//使用默认  wc.hCursor = NULL;
	//使用系统默认的“帮助”光标
	wc.hCursor = LoadCursor(NULL,IDC_HELP);
	//使用图标
	//使用默认 wc.hIcon = NULL;
	//使用系统默认的“警告”图标
	wc.hIcon = LoadIcon(NULL, IDI_WARNING);
	wc.hInstance = hInstance;//应用程序实例传窗口
	wc.lpfnWndProc = DealMessage;//消息处理函数,需要为回调类型,需自己编写
	wc.lpszClassName = TEXT("abc");//类的名字
	wc.lpszMenuName = NULL;//菜单名字
	wc.style = nCmdShow; //显示风格

四、注册窗口类 


//在窗口过程类完成后
//注册窗口类,告知系统窗口过程函数的入口地址
	RegisterClass(&wc);

五、创建窗口类

	//创建窗口类,参数:
	//类名,窗口标题,显示风格
	//x轴,y轴,宽度,高度
	//父窗口(主窗口则为空),菜单,应用程序实例,附加信息
	HWND hWnd = CreateWindow(TEXT("abc"), TEXT("hello,windows"),WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
		NULL,NULL,hInstance,NULL);//返回窗口句柄

六、显示与更新窗口

	ShowWindow(hWnd, SW_SHOWNORMAL);
	UpdateWindow(hWnd);

七、消息循环

_WinAPI创建窗口大致格式(笔记)

hwnd:消息属于哪一个拆给你扣

message:哪一种消息,如敲击键盘,则为键盘敲击事件。

wParam,lParam:消息的附加信息,比如敲击键盘事件发生时,该对象记录具体敲击键位。

time:消息产生的时间。

pt:鼠标的位置。

_WinAPI创建窗口大致格式(笔记)

    MSG msg;
	//消息的引用,属于哪一个窗口(NULL为所有的),从消息队列中接收消息的最小值,最大值
	//如果接收到WM_QUIT,返回0
	//出错返回-1,但不退出
	while (GetMessageW(&msg, NULL, 0, 0)) {
		//翻译工作
		//当键盘时间操作时,虚拟按键转换标准字符WM_CHAR,然后再次传给消息队列后,继续循环
		TranslateMessage(&msg);
		//给操作系统分发消息
		DispatchMessage(&msg);
	}
	

消息处理函数

//大致格式 
LRESULT CALLBACK DealMessage(HWND hWnd,//窗口句柄,消息所属窗口
	UINT uMsg,//消息标志
	WPARAM wParam,//消息附加信息
	LPARAM lParam
) {
	switch (uMsg) {
	case WM_LBUTTONDOWN://鼠标左键按下
		//消息对话框:哪一个窗口,内容,标题,按钮
		MessageBox(hWnd, TEXT("ABC"), TEXT("鼠标左键按下"), MB_OK);
		break;
	case WM_DESTROY://关闭按钮按下
		//返回WM_QUIT,并给主函数return msg.wParam
		PostQuitMessage(2);
		break;
	case WM_PAINT: {//绘图
		PAINTSTRUCT ps;//绘图结构体
		//开始作画,哪一个窗口,绘图信息,
		//HDC"画家"
		HDC dc = BeginPaint(hWnd, &ps);
		char* p = L"asfasdfasfas";//转换为宽字节,1字符2字节
		//HDC对象,x,y坐标,内容,长度
		TextOutW(dc, 30, 30, p, wcslen(p));
		EndPaint(hWnd, &ps);
	}
	default:
		return DefWindowProc(hWnd, uMsg, wParam, lParam);

	}

八、总结构

#include<Windows.h>

LRESULT CALLBACK DealMessage(HWND hWnd,//窗口句柄,消息所属窗口
	UINT uMsg,//消息标志
	WPARAM wParam,//消息附加信息
	LPARAM lParam
) {
	switch (uMsg) {
	case WM_LBUTTONDOWN://鼠标左键按下
		//消息对话框:哪一个窗口,内容,标题,按钮
		MessageBox(hWnd, TEXT("ABC"), TEXT("鼠标左键按下"), MB_OK);
		break;
	case WM_DESTROY://关闭按钮按下
		//返回WM_QUIT,并给主函数return msg.wParam
		PostQuitMessage(2);
		break;
	case WM_PAINT: {//绘图
		PAINTSTRUCT ps;//绘图结构体
		//开始作画,哪一个窗口,绘图信息,
		//HDC"画家"
		HDC dc = BeginPaint(hWnd, &ps);
		char* p = L"asfasdfasfas";//转换为宽字节,1字符2字节
		//HDC对象,x,y坐标,内容,长度
		TextOutW(dc, 30, 30, p, wcslen(p));
		EndPaint(hWnd, &ps);
	}
	default:
		return DefWindowProc(hWnd, uMsg, wParam, lParam);

	}

	return DefWindowProc(hWnd,uMsg, wParam, lParam);//采用默认处理方式
}

//WINAPI:修饰函数,规定函数参数入栈从右往左,函数调用完毕,自动清理堆栈
int WINAPI WinMain(HINSTANCE hInstance,//应用程序实例
	HINSTANCE hPrevInstance,//上一个应用程序实例
	LPSTR lpCmdLine,//long pointer string,命令行参数
	int nCmdShow//窗口显示样式
) {
	WNDCLASS wc;
	//类的附加信息
	wc.cbClsExtra = 0;
	//窗口的附加信息
	wc.cbWndExtra = 0;
	//背景色,必须写
	//获取系统默认的白色画刷
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	//光标图像
	//使用默认  wc.hCursor = NULL;
	//使用系统默认的“帮助”光标
	wc.hCursor = LoadCursor(NULL,IDC_HELP);
	//使用图标
	//使用默认 wc.hIcon = NULL;
	//使用系统默认的“警告”图标
	wc.hIcon = LoadIcon(NULL, IDI_WARNING);
	wc.hInstance = hInstance;//应用程序实例传窗口
	wc.lpfnWndProc = DealMessage;//消息处理函数,需要为回调类型,需自己编写
	wc.lpszClassName = TEXT("abc");//类的名字
	wc.lpszMenuName = NULL;//菜单名字
	wc.style = nCmdShow; //显示风格
	//注册窗口类,告知系统窗口过程函数的入口地址
	RegisterClass(&wc);
	//创建窗口类,参数:
	//类名,窗口标题,显示风格
	//x轴,y轴,宽度,高度
	//父窗口(主窗口则为空),菜单,应用程序实例,附加信息
	HWND hWnd = CreateWindow(TEXT("abc"), TEXT("hello,windows"),WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
		NULL,NULL,hInstance,NULL);//返回窗口句柄
	//显示和更新窗口
	ShowWindow(hWnd, SW_SHOWNORMAL);
	UpdateWindow(hWnd);
	MSG msg;
	//消息的引用,属于哪一个窗口(NULL为所有的),从消息队列中接收消息的最小值,最大值
	//如果接收到WM_QUIT,返回0
	//出错返回-1,但不退出
	while (GetMessageW(&msg, NULL, 0, 0)) {
		//翻译工作
		//当键盘时间操作时,虚拟按键转换标准字符WM_CHAR,然后再次传给消息队列
		TranslateMessage(&msg);
		//给操作系统分发消息
		DispatchMessage(&msg);
	}
	
	return msg.wParam;
}

_WinAPI创建窗口大致格式(笔记)

 

上一篇:第一个windows桌面应用程序


下一篇:TOJ 2815 Connect them (kruskal+并查集)