《windows核心编程》(八)-----------2013.8.5
一、概念
Windows常用消息
WM_DESTROY - 窗口被销毁时的消息,无消息参数。常用于在窗口被销毁之前,做相应的善后处理,例如资源、内存等。
WM_SYSCOMMAND - 系统命令消息,当点击窗口的最大化、最小化、关闭等命令时,收到这个消息。
常用在窗口关闭时,提示用户处理。
wParam - 具体点击哪个部分,例如关闭SC_CLOSE等.
lParam - 鼠标位置
LOWORD 低字 - 水平位置(前两位)
HIWORD 高字 - 垂直位置(后两位)
计算方法:
LOWORD = lParam & 0x0000FFFF;
HIWORD = lParam >> 16 & 0x0000FFFF;
计算方法:
LOWORD = lParam & 0x0000FFFF;
HIWORD = lParam >> 16 & 0x0000FFFF;
WM_CREATE - 在窗口创建成功还未显示之前,收到这个消息。
常用于初始化窗口的参数、资源等等,包括创建子窗口等。
WPARAM - 不使用
LPARAM - 是CREATESTRUCT结构的指针,保存了CreatWindowEx中的12个参数。
WM_SIZE - 在窗口的大小发生变化后,会收到WM_SIZE。
常用于窗口大小变化后,调整窗口内各个部分的布局。
WPARAM - 窗口大小变化的原因。
LPARAM - 变化窗口客户区的大小
LOWORD - 变化后的宽度
HIOWORD- 变化后的高度(计算方法同上)
WM_SYSCOMMAND消息的使用:
当点确定则退出,点取消不退出。
WM_CREATE消息的使用:
使用WM_CREATE消息生成messagebox,然后将CREATESTRUCT结构体里的 LPVOID lPCreateParams在messagebox中输出。
在窗口中生成一个EDIT窗口。
WM_SIZE消息的使用:
使用AllocConsole()函数在控制台输出调试数据。
小练习:
将EDIT窗口大小随着父窗口的大小改变而改变。
只需用MoveWindow函数将EDIT窗口进行重绘,将lParam进行位运算得出的高位和低位两个值传入MoveWindow函数的长宽的两个参数中,然后进行重绘就可以实现。
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;
}