10 消息队列与一个简单的窗口程序

消息:当我们点击鼠标的时候,或者当我们按下键盘的时候,操作系统都要把这些动作记录下来,存储到一个结构体中,这个结构体就是消息;
消息队列:每个线程只有一个消息队列;消息对列与线程相关的;消息队列就是一堆链表;
窗口与线程的关系:一个线程可以有多个窗口,一个窗口指对应一个线程;
简单的窗口程序示例:

/*-------------------------------
			MyWindows.c
---------------------------------*/
#include<Windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,					//入口函数,WINAPI即是__stdcall(函数调用约定的一种)
	HINSTANCE hPrevInstance,							
	PSTR szCmdLine,
	int iCmdShow)
{
	static TCHAR szAppName[] = TEXT("MyWindows");		//定义窗口类的名字
	HWND hwnd;											//窗口句柄定义
	MSG msg;											//定义消息
	WNDCLASS wndclass;									//Windows类定义

	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//背景,先要得到画刷句柄传回
	wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);//光标
	wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标
	wndclass.hInstance = hInstance;//模块句柄,如前面说的.exe .dll等地址
	wndclass.lpfnWndProc = WndProc;//过程函数
	wndclass.lpszClassName = szAppName;	//类名
	wndclass.lpszMenuName = NULL;//菜单
	wndclass.style = CS_HREDRAW | CS_VREDRAW;//调整宽度和高度重新绘制窗口

	if (!RegisterClass(&wndclass)){ //填完窗口类注册该窗口类
		MessageBox(NULL, TEXT("此程序需要在Windows NT平台上运行!"), szAppName, MB_ICONERROR);
		return 0;
	}

	hwnd = CreateWindow(szAppName,					//创建窗口并设置其具体特征,返回窗口句柄,窗口类名
		TEXT("Win模板"),							//窗口标题
		WS_OVERLAPPEDWINDOW,						//类风格的扩展
		CW_USEDEFAULT,								//初始窗口坐标
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		NULL,										//有无父窗口
		NULL,										//有无菜单
		hInstance,
		NULL
		);
	ShowWindow(hwnd, iCmdShow);						//显示窗口
	UpdateWindow(hwnd);								//更新窗口
	while (GetMessage(&msg, NULL, 0, 0)){
		TranslateMessage(&msg);						//翻译消息
		DispatchMessage(&msg);						//派送消息到系统,系统再调用WinProc函数处理消息
	}
	return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)//传入消息结构体的前四个参数
{
	HDC hdc;												//Handle of device context
	PAINTSTRUCT ps;											//绘画结构
	RECT rect;												//矩形结构
	switch (message)
	{			
	case WM_PAINT:					
		hdc = BeginPaint(hwnd, &ps);						//填充hdc结构
		GetClientRect(hwnd, &rect);							//获取客户区矩形信
		DrawText(hdc, TEXT("这是一个简单的窗口!"), -1, &rect,
			DT_CENTER | DT_VCENTER | DT_SINGLELINE);
		EndPaint(hwnd, &ps);
		return 0;
	case WM_DESTROY:										//点击右上角关闭发送WM_DESTROY消息
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hwnd, message, wParam, lParam);
}

猜你喜欢

转载自blog.csdn.net/lifeshave/article/details/84963161
今日推荐