win32窗口应用程序学习记录

简单的Windows 应用程序

Windows窗口应用程序主函数-WinMain()

定义

int WINAPI WinMain(
    HINSTANCE   hInstance,
    HINSTANCE   hPrevInstace,
    LPSTR       lpCmdLine,
    int         nCmdShow
) {
    MSG		msg;			// 消息结构体
	HACCEL	hAccelTable;	// 消息加速键表

    // 注册窗口类
    MyRegisterClass(hInstance);

    // 创建窗口并显示窗口
    if ( !InitInstance(hInstance, SW_SHOWNORMAL) ) {
		return FALSE;
    }

	// 加载加速键表
	hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_SIMPLEWIN32));

	// 获取消息
	while ( GetMessage(&msg, NULL, 0, 0) ) {
		// 将虚拟键消息转换为字符消息,并分发等待
		if ( !TranslateAccelerator(msg.hwnd, hAccelTable, &msg) ) {
			// 将虚拟键消息转换为字符消息
			TranslateMessage(&msg);
			// 分发消息
			DispatchMessage(&msg);
		}
	}

	// 返回退出消息值
	return msg.wParam;
}
参数

hInstance:应用程序的实例句柄,操作实例化进程的变量。可通过GetModuleHandle()获得。
hPrevInstance:同一个文件创建的上一个实例句柄,是Win16平台的参数。Win32下弃用。
lpCmdLine:程序启动时传递给进程的参数。
nCmdShow:进程显示的方式(最大化、最小化、隐藏等)。
句柄:句柄不是固定含义,随着上下文的不同而不同。

内容概述

①注册窗口类
②显示并更新窗口
③不断获取消息并分发消息

流程

1.注册

创建WNDCLASSEX结构体传入RegisterClassEx()进行注册。

ATOM MyRegisterClass(HINSTANCE hInstance) {
	// 填充结构体为0
	WNDCLASSEX WndCls = {0};

	WndCls.cbSize = sizeof(WndCls);                     // 结构体大小
	WndCls.lpfnWndProc = WindowProc;                    // 窗口过程地址(消息处理函数)
	WndCls.hInstance = hInstance;                       // 实例句柄
	WndCls.lpszClassName = szClassName;                 // 窗口类名
	WndCls.style = CS_HREDRAW | CS_VREDRAW;             // 窗口风格
	WndCls.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);    // 窗口背景色
	WndCls.hCursor = LoadCursor(NULL, IDC_ARROW);       // 鼠标句柄
	WndCls.hIcon = LoadIcon(NULL, IDI_QUESTION);        // 图标句柄
	WndCls.cbClsExtra = 0;                              // 分配窗口管理类附加内存
	WndCls.cbWndExtra = 0;                              // 分配窗口附加内存

    // 注册窗口
	return RegisterClassEx(&WndCls);
}
2.创建并显示

创建窗口:CreateWindow()CreateWindowEx()
显示窗口:ShowWindow()
更新窗口:UpdateWindow()

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) {
	HWND hWnd = NULL;

	//创建窗口
	hWnd = CreateWindow(
			szClassName,                    // 类名
			TEXT("标题"),                   // 标题
			WS_OVERLAPPEDWINDOW,            // 样式
			CW_USEDEFAULT, CW_USEDEFAULT,	// X,Y
			CW_USEDEFAULT, CW_USEDEFAULT,	// W,H
			NULL,                           // 父窗口句柄
			NULL,                           // 菜单(ID)句柄
			hInstance,                      // 应用程序句柄
			NULL                            // 传递给WM_CREATE消息的CREATESTRUCT结构体的指针
		);
	
	if ( !hWnd ) {
		return FALSE;
	}

	// 显示窗口
	ShowWindow(hWnd, nCmdShow);

	// 更新窗口
	UpdateWindow(hWnd);

	return TRUE;
}
3.获取并分发消息

获取消息:TranslateMessage();
分发消息:DispatchMessage();

窗口消息处理

消息在WinMain()中分发后,由系统调用WindowProc()消息处理函数。
对于应用程序自己的窗口,其他应用程序也会进行调用,所以为方便维护,调用消息处理函数由系统处理。

定义

LRESULT CALLBACK WindowProc(
	HWND	hWnd,
	UINT	message,
	WPARAM	wParam,
	LPARAM	lParam
) {
	int id, wmEvent;

	switch (message) {
	case WM_COMMAND:
		{
			id = LOWORD(wParam);
			wmEvent = HIWORD(wParam);

			switch ( id ) {
			default:
				return DefWindowProc(hWnd, message, wParam, lParam);
			}
			break;
		}
	case WM_CLOSE:					// ①关闭按钮消息
		{
			DestroyWindow(hWnd);	// ②销毁窗口,并发送WM_DESTROY消息
		}
		break;
	case WM_DESTROY:				// ③DestroyWindow()消息
		{
			PostQuitMessage(0);		// ④发送WM_QUIT消息结束消息循环
		}
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}

	return 0;
}
参数

hWnd:窗口句柄
message:消息类型
wParam:消息附加信息
lParam:消息附加信息

说明

1)消息处理:通过参数message获得消息类型,一般处理较为频繁的消息放在最前以提高效率。
2)默认处理:对于没有设置处理的消息,通过DefWindowProc()交由系统处理。
2)结束:
    ①关闭按钮【发送WM_CLOSE消息】
    ②销毁窗口【发送WM_DESTROY消息】:DestroyWindow()
    ③结束消息循环【发送WM_QUIT消息】:PostQuitMessage(0)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值