2013.8.5 学习笔记《windows核心编程》(八) 常用消息

《windows核心编程》(八)-----------2013.8.5

一、概念

Windows常用消息

WM_DESTROY - 窗口被销毁时的消息,无消息参数。常用于在窗口被销毁之前,做相应的善后处理,例如资源、内存等。
WM_SYSCOMMAND - 系统命令消息,当点击窗口的最大化、最小化、关闭等命令时,收到这个消息。
常用在窗口关闭时,提示用户处理。
     wParam - 具体点击哪个部分,例如关闭SC_CLOSE等.
     lParam - 鼠标位置
     LOWORD 低字 - 水平位置(前两位)
     HIWORD 高字 - 垂直位置(后两位)
计算方法:
     LOWORD = lParam & 0x0000FFFF;
     HIWORD = lParam >> 16 & 0x0000FFFF;
WM_CREATE - 在窗口创建成功还未显示之前,收到这个消息。
常用于初始化窗口的参数、资源等等,包括创建子窗口等。
     WPARAM - 不使用
     LPARAM - 是CREATESTRUCT结构的指针,保存了CreatWindowEx中的12个参数。
WM_SIZE - 在窗口的大小发生变化后,会收到WM_SIZE。
常用于窗口大小变化后,调整窗口内各个部分的布局。
     WPARAM - 窗口大小变化的原因。
     LPARAM - 变化窗口客户区的大小
     LOWORD - 变化后的宽度
     HIOWORD- 变化后的高度(计算方法同上)

WM_SYSCOMMAND消息的使用:
// WinCreate.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "windows.h"
HINSTANCE g_hInstance = 0;//用于接受应用程序实例句柄
//窗口处理函数
LRESULT CALLBACK WndProc(HWND hWnd,UINT nMsg,
						 WPARAM wParam,LPARAM lParam)
{
	switch(nMsg)
	{
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	case WM_SYSCOMMAND:
		if(wParam == SC_CLOSE)
		{
			int nRet = MessageBox(NULL,"是否退出","Infor",MB_YESNO);
			if(nRet == IDNO)
			{
				return 0;
			}
		}
	}
	return DefWindowProc(hWnd,nMsg,wParam,lParam);
}
//注册窗口类
BOOL Register(LPSTR lpClassName,WNDPROC wndproc)
{
	WNDCLASSEX wce = {0};
	wce.cbSize = sizeof(wce);
	wce.cbClsExtra = 0;
	wce.cbWndExtra = 0;
	wce.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
	wce.hCursor = NULL;
	wce.hIcon = NULL;
	wce.hIconSm = NULL;
	wce.hInstance = g_hInstance;
	wce.lpfnWndProc = wndproc;
	wce.lpszClassName = lpClassName;
	wce.lpszMenuName = NULL;
	wce.style = CS_HREDRAW | CS_VREDRAW;
	ATOM nAtom = RegisterClassEx(&wce);
	if(nAtom == 0)
	{
		return FALSE;
	}
	return TRUE;
}
//创建主窗口
HWND CreateMain(LPSTR lpClassName,LPSTR lpWndName)
{
	HWND hWnd = CreateWindowEx(0,lpClassName,lpWndName,
		WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
		NULL,NULL,g_hInstance,NULL);
	return hWnd;
}
//显示窗口
void Display(HWND hWnd)
{
	ShowWindow(hWnd,SW_SHOW);
	UpdateWindow(hWnd);
}
//消息循环
void Message()
{
	MSG nMsg = {0};
	while (GetMessage(&nMsg,NULL,0,0))
	{
		TranslateMessage(&nMsg);
		DispatchMessage(&nMsg);
	}
}
int APIENTRY WinMain(HINSTANCE hInstance,
					 HINSTANCE hPrevInstance,
					 LPSTR     lpCmdLine,
					 int       nCmdShow)
{
	// TODO: Place code here.
	g_hInstance = hInstance;
	Register("Main",WndProc);
	HWND hWnd = CreateMain("Main","Window");
	Display(hWnd);
	Message();
	return 0;
}


当点确定则退出,点取消不退出。

WM_CREATE消息的使用:
使用WM_CREATE消息生成messagebox,然后将CREATESTRUCT结构体里的 LPVOID lPCreateParams在messagebox中输出。
// WinCreate.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "windows.h"
HINSTANCE g_hInstance = 0;//用于接受应用程序实例句柄

void OnCreate(HWND hWnd,LPARAM lParam)
{
	CREATESTRUCT *cs = (CREATESTRUCT*)lParam;
	LPSTR pszText = (LPSTR)cs->lpCreateParams;
	MessageBox(NULL,pszText,"Infor",MB_OK);
}
//窗口处理函数
LRESULT CALLBACK WndProc(HWND hWnd,UINT nMsg,
						 WPARAM wParam,LPARAM lParam)
{
	switch(nMsg)
	{
	case WM_CREATE:
		OnCreate(hWnd,lParam);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	case WM_SYSCOMMAND:
		if(wParam == SC_CLOSE)
		{
			int nRet = MessageBox(NULL,"是否退出","Infor",MB_YESNO);
			if(nRet == IDNO)
			{
				return 0;
			}
		}
	}
	return DefWindowProc(hWnd,nMsg,wParam,lParam);
}
//注册窗口类
BOOL Register(LPSTR lpClassName,WNDPROC wndproc)
{
	WNDCLASSEX wce = {0};
	wce.cbSize = sizeof(wce);
	wce.cbClsExtra = 0;
	wce.cbWndExtra = 0;
	wce.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
	wce.hCursor = NULL;
	wce.hIcon = NULL;
	wce.hIconSm = NULL;
	wce.hInstance = g_hInstance;
	wce.lpfnWndProc = wndproc;
	wce.lpszClassName = lpClassName;
	wce.lpszMenuName = NULL;
	wce.style = CS_HREDRAW | CS_VREDRAW;
	ATOM nAtom = RegisterClassEx(&wce);
	if(nAtom == 0)
	{
		return FALSE;
	}
	return TRUE;
}
//创建主窗口
HWND CreateMain(LPSTR lpClassName,LPSTR lpWndName)
{
	char* pszText = "Hello Create";
	HWND hWnd = CreateWindowEx(0,lpClassName,lpWndName,
		WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
		NULL,NULL,g_hInstance,pszText);
	return hWnd;
}
//显示窗口
void Display(HWND hWnd)
{
	ShowWindow(hWnd,SW_SHOW);
	UpdateWindow(hWnd);
}
//消息循环
void Message()
{
	MSG nMsg = {0};
	while (GetMessage(&nMsg,NULL,0,0))
	{
		TranslateMessage(&nMsg);
		DispatchMessage(&nMsg);
	}
}
int APIENTRY WinMain(HINSTANCE hInstance,
					 HINSTANCE hPrevInstance,
					 LPSTR     lpCmdLine,
					 int       nCmdShow)
{
	// TODO: Place code here.
	g_hInstance = hInstance;
	Register("Main",WndProc);
	HWND hWnd = CreateMain("Main","Window");
	Display(hWnd);
	Message();
	return 0;
}


在窗口中生成一个EDIT窗口。
// WinCreate.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "windows.h"
HINSTANCE g_hInstance = 0;//用于接受应用程序实例句柄

void OnCreate(HWND hWnd,LPARAM lParam)
{
	CREATESTRUCT *cs = (CREATESTRUCT*)lParam;
	LPSTR pszText = (LPSTR)cs->lpCreateParams;
	CreateWindowEx(NULL,"EDIT","OK",
		WS_CHILD | WS_VISIBLE | WS_BORDER,
		0,0,200,200,hWnd,NULL,g_hInstance,NULL);
}
//窗口处理函数
LRESULT CALLBACK WndProc(HWND hWnd,UINT nMsg,
						 WPARAM wParam,LPARAM lParam)
{
	switch(nMsg)
	{
	case WM_CREATE:
		OnCreate(hWnd,lParam);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	case WM_SYSCOMMAND:
		if(wParam == SC_CLOSE)
		{
			int nRet = MessageBox(NULL,"是否退出","Infor",MB_YESNO);
			if(nRet == IDNO)
			{
				return 0;
			}
		}
	}
	return DefWindowProc(hWnd,nMsg,wParam,lParam);
}
//注册窗口类
BOOL Register(LPSTR lpClassName,WNDPROC wndproc)
{
	WNDCLASSEX wce = {0};
	wce.cbSize = sizeof(wce);
	wce.cbClsExtra = 0;
	wce.cbWndExtra = 0;
	wce.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
	wce.hCursor = NULL;
	wce.hIcon = NULL;
	wce.hIconSm = NULL;
	wce.hInstance = g_hInstance;
	wce.lpfnWndProc = wndproc;
	wce.lpszClassName = lpClassName;
	wce.lpszMenuName = NULL;
	wce.style = CS_HREDRAW | CS_VREDRAW;
	ATOM nAtom = RegisterClassEx(&wce);
	if(nAtom == 0)
	{
		return FALSE;
	}
	return TRUE;
}
//创建主窗口
HWND CreateMain(LPSTR lpClassName,LPSTR lpWndName)
{
	HWND hWnd = CreateWindowEx(0,lpClassName,lpWndName,
		WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
		NULL,NULL,g_hInstance,NULL);
	return hWnd;
}
//显示窗口
void Display(HWND hWnd)
{
	ShowWindow(hWnd,SW_SHOW);
	UpdateWindow(hWnd);
}
//消息循环
void Message()
{
	MSG nMsg = {0};
	while (GetMessage(&nMsg,NULL,0,0))
	{
		TranslateMessage(&nMsg);
		DispatchMessage(&nMsg);
	}
}
int APIENTRY WinMain(HINSTANCE hInstance,
					 HINSTANCE hPrevInstance,
					 LPSTR     lpCmdLine,
					 int       nCmdShow)
{
	// TODO: Place code here.
	g_hInstance = hInstance;
	Register("Main",WndProc);
	HWND hWnd = CreateMain("Main","Window");
	Display(hWnd);
	Message();
	return 0;
}




WM_SIZE消息的使用:

使用AllocConsole()函数在控制台输出调试数据。
// WinCreate.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
HINSTANCE g_hInstance = 0;//用于接受应用程序实例句柄
HANDLE g_hOutput = 0;
void OnCreate(HWND hWnd,LPARAM lParam)
{
	CREATESTRUCT *cs = (CREATESTRUCT*)lParam;
	LPSTR pszText = (LPSTR)cs->lpCreateParams;
	CreateWindowEx(NULL,"EDIT","OK",
		WS_CHILD | WS_VISIBLE | WS_BORDER,
		0,0,200,200,hWnd,NULL,g_hInstance,NULL);
}
void OnSize(HWND hWnd,LPARAM lParam)
{
	int nWidth = LOWORD(lParam);
	int nHight = HIWORD(lParam);
	char szText[256] = {0};
	sprintf(szText,"高:%d 宽:%d\n",nWidth,nHight);
	WriteConsole(g_hOutput,szText,strlen(szText),NULL,NULL);
}
//窗口处理函数
LRESULT CALLBACK WndProc(HWND hWnd,UINT nMsg,
						 WPARAM wParam,LPARAM lParam)
{
	switch(nMsg)
	{
	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(NULL,"是否退出","Infor",MB_YESNO);
			if(nRet == IDNO)
			{
				return 0;
			}
		}
	}
	return DefWindowProc(hWnd,nMsg,wParam,lParam);
}
//注册窗口类
BOOL Register(LPSTR lpClassName,WNDPROC wndproc)
{
	WNDCLASSEX wce = {0};
	wce.cbSize = sizeof(wce);
	wce.cbClsExtra = 0;
	wce.cbWndExtra = 0;
	wce.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
	wce.hCursor = NULL;
	wce.hIcon = NULL;
	wce.hIconSm = NULL;
	wce.hInstance = g_hInstance;
	wce.lpfnWndProc = wndproc;
	wce.lpszClassName = lpClassName;
	wce.lpszMenuName = NULL;
	wce.style = CS_HREDRAW | CS_VREDRAW;
	ATOM nAtom = RegisterClassEx(&wce);
	if(nAtom == 0)
	{
		return FALSE;
	}
	return TRUE;
}
//创建主窗口
HWND CreateMain(LPSTR lpClassName,LPSTR lpWndName)
{
	HWND hWnd = CreateWindowEx(0,lpClassName,lpWndName,
		WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
		NULL,NULL,g_hInstance,NULL);
	return hWnd;
}
//显示窗口
void Display(HWND hWnd)
{
	ShowWindow(hWnd,SW_SHOW);
	UpdateWindow(hWnd);
}
//消息循环
void Message()
{
	MSG nMsg = {0};
	while (GetMessage(&nMsg,NULL,0,0))
	{
		TranslateMessage(&nMsg);
		DispatchMessage(&nMsg);
	}
}
int APIENTRY WinMain(HINSTANCE hInstance,
					 HINSTANCE hPrevInstance,
					 LPSTR     lpCmdLine,
					 int       nCmdShow)
{
	// TODO: Place code here.
	AllocConsole();
	g_hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
	g_hInstance = hInstance;
	Register("Main",WndProc);
	HWND hWnd = CreateMain("Main","Window");
	Display(hWnd);
	Message();
	return 0;
}



小练习:
将EDIT窗口大小随着父窗口的大小改变而改变。

只需用MoveWindow函数将EDIT窗口进行重绘,将lParam进行位运算得出的高位和低位两个值传入MoveWindow函数的长宽的两个参数中,然后进行重绘就可以实现。
// WinCreate.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
HINSTANCE g_hInstance = 0;//用于接受应用程序实例句柄
HANDLE g_hOutput = 0;
HWND g_hEdit = 0;
void OnCreate(HWND hWnd,LPARAM lParam)
{
	CREATESTRUCT *cs = (CREATESTRUCT*)lParam;
	LPSTR pszText = (LPSTR)cs->lpCreateParams;
	g_hEdit = CreateWindowEx(NULL,"EDIT","OK",
		WS_CHILD | WS_VISIBLE | WS_BORDER,
		0,0,200,200,hWnd,NULL,g_hInstance,NULL);
}
void OnSize(HWND hWnd,LPARAM lParam)
{
	int nWidth = LOWORD(lParam);
	int nHight = HIWORD(lParam);
	char szText[256] = {0};
	sprintf(szText,"高:%d 宽:%d\n",nWidth,nHight);
	WriteConsole(g_hOutput,szText,strlen(szText),NULL,NULL);
	MoveWindow(g_hEdit,0,0,nWidth,nHight,TRUE);
}
//窗口处理函数
LRESULT CALLBACK WndProc(HWND hWnd,UINT nMsg,
						 WPARAM wParam,LPARAM lParam)
{
	switch(nMsg)
	{
	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(NULL,"是否退出","Infor",MB_YESNO);
			if(nRet == IDNO)
			{
				return 0;
			}
		}
	}
	return DefWindowProc(hWnd,nMsg,wParam,lParam);
}
//注册窗口类
BOOL Register(LPSTR lpClassName,WNDPROC wndproc)
{
	WNDCLASSEX wce = {0};
	wce.cbSize = sizeof(wce);
	wce.cbClsExtra = 0;
	wce.cbWndExtra = 0;
	wce.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
	wce.hCursor = NULL;
	wce.hIcon = NULL;
	wce.hIconSm = NULL;
	wce.hInstance = g_hInstance;
	wce.lpfnWndProc = wndproc;
	wce.lpszClassName = lpClassName;
	wce.lpszMenuName = NULL;
	wce.style = CS_HREDRAW | CS_VREDRAW;
	ATOM nAtom = RegisterClassEx(&wce);
	if(nAtom == 0)
	{
		return FALSE;
	}
	return TRUE;
}
//创建主窗口
HWND CreateMain(LPSTR lpClassName,LPSTR lpWndName)
{
	HWND hWnd = CreateWindowEx(0,lpClassName,lpWndName,
		WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
		NULL,NULL,g_hInstance,NULL);
	return hWnd;
}
//显示窗口
void Display(HWND hWnd)
{
	ShowWindow(hWnd,SW_SHOW);
	UpdateWindow(hWnd);
}
//消息循环
void Message()
{
	MSG nMsg = {0};
	while (GetMessage(&nMsg,NULL,0,0))
	{
		TranslateMessage(&nMsg);
		DispatchMessage(&nMsg);
	}
}
int APIENTRY WinMain(HINSTANCE hInstance,
					 HINSTANCE hPrevInstance,
					 LPSTR     lpCmdLine,
					 int       nCmdShow)
{
	// TODO: Place code here.
	AllocConsole();
	g_hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
	g_hInstance = hInstance;
	Register("Main",WndProc);
	HWND hWnd = CreateMain("Main","Window");
	Display(hWnd);
	Message();
	return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值