win32 学习笔记(二) 初识消息

WM_DESTROY消息:
产生时间:窗口销毁时
附带信息:wParam为0,lParam为0
一般用法:常用于在窗口呗销毁之前,做善后处理,例如资源、内存
WM_SYSCOMMAND消息:
产生时间:当点击窗口的最大化、最小化、关闭等。
附带信息:wParam:具体点击的位置,例如关闭SC_CLOSE等。
    lParam:鼠标光标的位置。
    LOWORD(lParam);//水平位置(lParam的低两个字节)
    HIWORD(lParam);//垂直位置(lParam的高两个字节)
一般用法:常用在窗口关闭时,提示用户处理。
WM_CREATE消息:
产生时间:窗口创建成功但还未显示时
附带信息:wParam:为0.
    lParam:为CREATESTRUCT类型的指针。
    通过这个指针可以获取CreatWindowEx中的全部12个参数的信息。
一般用法:常用于初始化窗口的参数、资源等等,包括创建子窗口等。
WM_SIZE消息:
产生时间: 在窗口大小发生变化后。
附带信息:wParam:窗口大小变化的原因
    lParam:窗口变化后的大小。
        LOWORD(lParam)//变化后的宽度
        HIWORD(lParam)//变化后的高度
一般用法:常用于窗口大小变化后,调整窗口内各部分的布局。 
WM_QUIT消息:
产生时间:程序员发送。
附带消息:wParam: PostQuitMessage函数传递的参数。
    lParam: 0。
一般用法:用于结束消息循环,当GetMessage收到这个消息后,会返回FALSE, 结束while处理,退出消息循环。
 

#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <stdio.h>
HANDLE g_hOutput; //接受标准输出句柄
void OnCreate(HWND hWnd, LPARAM lParam) {
	CREATESTRUCT* pcs = (CREATESTRUCT*)lParam;
	char* pszText = (char*)pcs->lpCreateParams;
	MessageBox(NULL, pszText, "Infor", MB_OK);
	CreateWindowEx(0, "EDIT", "hello", WS_CHILD | WS_VISIBLE | WS_BORDER, 0, 0, 200, 200, hWnd, NULL, 0, NULL);
}
void OnSize(HWND hWnd, LPARAM lParam) {
	short nWidth = LOWORD(lParam);
	short nHeight = HIWORD(lParam);
	char szText[256] = { 0 };
	sprintf(szText, "WM_SIZE:宽:%d, 高:%d\n", nWidth, nHeight);
	WriteConsole(g_hOutput, szText, strlen(szText), NULL, NULL);
}
//窗口处理函数(自定义,处理消息)
LRESULT CALLBACK WndProc(HWND hWnd, UINT msgId, WPARAM wParam, LPARAM lParam) {
	switch (msgId) {
	case WM_SIZE:
		OnSize(hWnd, lParam);
		break;
	case WM_CREATE:
		OnCreate(hWnd, lParam);
		break;   
	case WM_DESTROY: 
		PostQuitMessage(0);
		break;
	case WM_SYSCOMMAND:
		if (wParam == SC_CLOSE) {
			int nRet = MessageBox(hWnd, "是否退出", "注意", MB_YESNO);
			if (nRet != IDYES) {
				return 0;
			}
			break;
		}
	}
	return DefWindowProc(hWnd, msgId, wParam, lParam);
}

//入口函数
int  CALLBACK WinMain(HINSTANCE hIns, HINSTANCE hPreIns, LPSTR lpCmdLine, int nCmdShow) {
	AllocConsole();//增加dos窗口
	g_hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
	//注册窗口类
	WNDCLASS wc = { 0 };
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
	wc.hCursor = NULL;
	wc.hIcon = NULL;
	wc.hInstance = hIns;
	wc.lpfnWndProc = WndProc;
	TCHAR name[] = TEXT("Main");
	wc.lpszClassName = name;
	wc.lpszMenuName = NULL;
	wc.style = CS_HREDRAW | CS_VREDRAW;
	RegisterClass(&wc);//将以上所有赋值全部写入操作系统。
	
	char pszText[] = "hello data";
	//在内存中创建窗口
	HWND hWnd = CreateWindow(name, TEXT("title"), WS_OVERLAPPEDWINDOW, 100, 100, 500, 500, NULL, NULL, hIns, pszText);

	//注册子窗口类
	wc = { 0 };
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
	wc.hCursor = NULL;
	wc.hIcon = NULL;
	wc.hInstance = hIns;
	wc.lpfnWndProc = DefWindowProc;
	TCHAR name1[] = TEXT("Child");
	wc.lpszClassName = name1;
	wc.lpszMenuName = NULL;
	wc.style = CS_HREDRAW | CS_VREDRAW;
	RegisterClass(&wc);//将以上所有赋值全部写入操作系统。
	//在内存中创建子窗口
	HWND hChild1 = CreateWindowEx(0, name1, TEXT("ChildTitle"), WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW, 0, 0, 200, 200, hWnd, NULL, hIns, NULL);
	HWND hChild2 = CreateWindowEx(0, "Child", "c2", WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW, 200, 0, 200, 200, hWnd, NULL, hIns, NULL);
	//显示窗口
	ShowWindow(hWnd, SW_SHOW);
	UpdateWindow(hWnd);
	//消息循环
	MSG nMsg = { 0 };
	while (GetMessage(&nMsg, NULL, 0, 0)) {
		TranslateMessage(&nMsg);
		DispatchMessage(&nMsg);//将消息交给窗口处理函数来处理
	}
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值