// 创建一个窗口
// WinMsg.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
HINSTANCE g_hInst = NULL;
LRESULT CALLBACK WndProc(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
BOOL RegisterWnd(LPSTR pszClassName)
{
WNDCLASSEX wce = {0};
wce.cbSize = sizeof(wce);
wce.cbClsExtra = 0;
wce.cbWndExtra = 0;
wce.hbrBackground = HBRUSH(COLOR_BTNFACE+1);
wce.hCursor = NULL;
wce.hIcon = NULL;
wce.hIconSm = NULL;
wce.hInstance = g_hInst;
wce.lpfnWndProc = WndProc;
wce.lpszClassName = pszClassName;
wce.lpszMenuName = NULL;
wce.style = CS_VREDRAW|CS_HREDRAW;
ATOM nAtom = RegisterClassEx(&wce);
if (nAtom == NULL)
{
return FALSE;
}
return TRUE;
}
HWND CreateWnd(LPSTR pszClassName)
{
HWND hWnd = CreateWindowEx(0, pszClassName,
"CNTFWindows", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, NULL, NULL, g_hInst, NULL);
return hWnd;
}
void DisplayWnd(HWND hWnd)
{
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
}
void Message()
{
MSG msg = {0};
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
g_hInst = hInstance;
RegisterWnd("MyWnds");
HWND hWnd = CreateWnd("MyWnds");
DisplayWnd(hWnd);
Message();
return 0;
}
--------------------------------------------------------------------------------
// 窗口创建的时候产生的消息实例(WM_CREATE)
// WinMsg.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include
HINSTANCE g_hInst = NULL;
HWND g_hButton = NULL;
LRESULT CALLBACK WndProc(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
void OnCreate(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
LRESULT CALLBACK WndProc(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
OnCreate(hWnd, uMsg, wParam, lParam);
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
BOOL RegisterWnd(LPSTR pszClassName)
{
WNDCLASSEX wce = {0};
wce.cbSize = sizeof(wce);
wce.cbClsExtra = 0;
wce.cbWndExtra = 0;
wce.hbrBackground = HBRUSH(COLOR_BTNFACE+1);
wce.hCursor = NULL;
wce.hIcon = NULL;
wce.hIconSm = NULL;
wce.hInstance = g_hInst;
wce.lpfnWndProc = WndProc;
wce.lpszClassName = pszClassName;
wce.lpszMenuName = NULL;
wce.style = CS_VREDRAW|CS_HREDRAW;
ATOM nAtom = RegisterClassEx(&wce);
if (nAtom == NULL)
{
return FALSE;
}
return TRUE;
}
HWND CreateWnd(LPSTR pszClassName)
{
HWND hWnd = CreateWindowEx(0, pszClassName,
"CNTFWindows", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, NULL, NULL, g_hInst, NULL);
return hWnd;
}
void DisplayWnd(HWND hWnd)
{
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
}
/************************************************************************/
/*
WM_CREATE
窗口创建的时候产生的消息;
在窗口创建后,窗口处理函数会收到第一条消息,那么可以在这个消息
内做数据初始化/创建子窗口等。
WPARAM wParam - 不使用
LPARAM lParam - CREATESTRUCT指针
*/
/************************************************************************/
void OnCreate(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
// 下面是使用参数lParam
LPCREATESTRUCT pCreateStruct = LPCREATESTRUCT(lParam);
// 指向这个结构体指针之后就可以读取创建的窗口的信息
MessageBox(NULL, pCreateStruct->lpszName, "OnCreate", MB_OK);
// 创建一个全局变量的按钮,用来接收创建的窗口
g_hButton = CreateWindowEx(0, "BUTTON", "BUTTON",
WS_CHILD|WS_VISIBLE, 0, 0, 100, 100,
hWnd, NULL, g_hInst, NULL);
}
void Message()
{
MSG msg = {0};
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
g_hInst = hInstance;
RegisterWnd("MyWnds");
HWND hWnd = CreateWnd("MyWnds");
DisplayWnd(hWnd);
Message();
return 0;
}
--------------------------------------------------------------------------------
// 窗口大小的变化WM_SIZE的实例
// WinMsg.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include
HINSTANCE g_hInst = NULL;
HWND g_hButton = NULL;
LRESULT CALLBACK WndProc(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
void OnCreate(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
void OnSize(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
LRESULT CALLBACK WndProc(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
OnCreate(hWnd, uMsg, wParam, lParam);
break;
case WM_SIZE:
OnSize(hWnd, uMsg, wParam, lParam);
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
BOOL RegisterWnd(LPSTR pszClassName)
{
WNDCLASSEX wce = {0};
wce.cbSize = sizeof(wce);
wce.cbClsExtra = 0;
wce.cbWndExtra = 0;
wce.hbrBackground = HBRUSH(COLOR_BTNFACE+1);
wce.hCursor = NULL;
wce.hIcon = NULL;
wce.hIconSm = NULL;
wce.hInstance = g_hInst;
wce.lpfnWndProc = WndProc;
wce.lpszClassName = pszClassName;
wce.lpszMenuName = NULL;
wce.style = CS_VREDRAW|CS_HREDRAW;
ATOM nAtom = RegisterClassEx(&wce);
if (nAtom == NULL)
{
return FALSE;
}
return TRUE;
}
HWND CreateWnd(LPSTR pszClassName)
{
HWND hWnd = CreateWindowEx(0, pszClassName,
"CNTFWindows", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, NULL, NULL, g_hInst, NULL);
return hWnd;
}
void DisplayWnd(HWND hWnd)
{
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
}
/************************************************************************/
/*
WM_CREATE
窗口创建的时候产生的消息;
在窗口创建后,窗口处理函数会收到第一条消息,那么可以在这个消息
内做数据初始化/创建子窗口等。
WPARAM wParam - 不使用
LPARAM lParam - CREATESTRUCT指针
*/
/************************************************************************/
void OnCreate(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
// 下面是使用参数lParam
LPCREATESTRUCT pCreateStruct = LPCREATESTRUCT(lParam);
// 指向这个结构体指针之后就可以读取创建的窗口的信息
MessageBox(NULL, pCreateStruct->lpszName, "OnCreate", MB_OK);
// 创建一个全局变量的按钮,用来接收创建的窗口
g_hButton = CreateWindowEx(0, "BUTTON", "BUTTON",
WS_CHILD|WS_VISIBLE, 0, 0, 100, 100,
hWnd, NULL, g_hInst, NULL);
}
/************************************************************************/
/*
WM_SIZE
当窗口大小发生变化时,会收到这个消息。
可以在这个消息中调整窗口布局。
wParam - SIZE发生变化时的标识
LOWORD(lParam); - 客户区的宽
HIWORD(lParam); - 客户区的高
*/
/************************************************************************/
void OnSize(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
// 使用lParam参数,其中低位表示宽度Width,高位表示高度Height
int nWidth = LOWORD(lParam);
int nHeight = HIWORD(lParam);
// 下面是先定义一个数组,内存申请好,可以理解为缓冲区
// 临时存放点
CHAR szText[260] = {0};
// 使用sprintf将读取到的数据放入缓冲区szText
sprintf(szText, "WIDTH:%d, HEIGHT:%d", nWidth, nHeight);
// 定义一个按钮句柄,下面的主要就是当窗口不管是变大,变小
// 按钮都是在中间的位置
if (g_hButton != NULL)
{
// 总宽度减去按钮宽度除以2就能保证移动的宽度均等
int nX = (nWidth - 100)/2;
// 总高度减去按钮宽度除以2就能保证移动的宽度均等
int nY = (nHeight - 100)/2;
MoveWindow(g_hButton, nX, nY, 100, 100, TRUE);
/*
关于上面函数MoveWindow的参数解释:
nX -- > 表示当前打开的主窗口的宽度
nY -- > 表示当前打开的主窗口的高度
前面那个100 -- > 表示是按钮的宽度
后面那个100 -- > 表示是按钮的高度
*/
}
}
void Message()
{
MSG msg = {0};
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
g_hInst = hInstance;
RegisterWnd("MyWnds");
HWND hWnd = CreateWnd("MyWnds");
DisplayWnd(hWnd);
Message();
return 0;
}
--------------------------------------------------------------------------------
// 系统命令消息 WM_SYSCOMMAND
// WinMsg.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include
HINSTANCE g_hInst = NULL;
HWND g_hButton = NULL;
LRESULT CALLBACK WndProc(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
void OnCreate(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
void OnSize(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
BOOL OnSysCommand( HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
LRESULT CALLBACK WndProc(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
OnCreate(hWnd, uMsg, wParam, lParam);
break;
case WM_SIZE:
OnSize(hWnd, uMsg, wParam, lParam);
break;
case WM_SYSCOMMAND:
if( OnSysCommand( hWnd, uMsg,
wParam, lParam == FALSE ) )
{
return 0;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
BOOL RegisterWnd(LPSTR pszClassName)
{
WNDCLASSEX wce = {0};
wce.cbSize = sizeof(wce);
wce.cbClsExtra = 0;
wce.cbWndExtra = 0;
wce.hbrBackground = HBRUSH(COLOR_BTNFACE+1);
wce.hCursor = NULL;
wce.hIcon = NULL;
wce.hIconSm = NULL;
wce.hInstance = g_hInst;
wce.lpfnWndProc = WndProc;
wce.lpszClassName = pszClassName;
wce.lpszMenuName = NULL;
wce.style = CS_VREDRAW|CS_HREDRAW;
ATOM nAtom = RegisterClassEx(&wce);
if (nAtom == NULL)
{
return FALSE;
}
return TRUE;
}
HWND CreateWnd(LPSTR pszClassName)
{
HWND hWnd = CreateWindowEx(0, pszClassName,
"CNTFWindows", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, NULL, NULL, g_hInst, NULL);
return hWnd;
}
void DisplayWnd(HWND hWnd)
{
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
}
/************************************************************************/
/*
WM_CREATE
窗口创建的时候产生的消息;
在窗口创建后,窗口处理函数会收到第一条消息,那么可以在这个消息
内做数据初始化/创建子窗口等。
WPARAM wParam - 不使用
LPARAM lParam - CREATESTRUCT指针
*/
/************************************************************************/
void OnCreate(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
// 下面是使用参数lParam
LPCREATESTRUCT pCreateStruct = LPCREATESTRUCT(lParam);
// 指向这个结构体指针之后就可以读取创建的窗口的信息
MessageBox(NULL, pCreateStruct->lpszName, "OnCreate", MB_OK);
// 创建一个全局变量的按钮,用来接收创建的窗口
g_hButton = CreateWindowEx(0, "BUTTON", "BUTTON",
WS_CHILD|WS_VISIBLE, 0, 0, 100, 100,
hWnd, NULL, g_hInst, NULL);
}
/************************************************************************/
/*
WM_SIZE
当窗口大小发生变化时,会收到这个消息。
可以在这个消息中调整窗口布局。
wParam - SIZE发生变化时的标识
LOWORD(lParam); - 客户区的宽
HIWORD(lParam); - 客户区的高
*/
/************************************************************************/
void OnSize(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
// 使用lParam参数,其中低位表示宽度Width,高位表示高度Height
int nWidth = LOWORD(lParam);
int nHeight = HIWORD(lParam);
// 下面是先定义一个数组,内存申请好,可以理解为缓冲区
// 临时存放点
CHAR szText[260] = {0};
// 使用sprintf将读取到的数据放入缓冲区szText
sprintf(szText, "WIDTH:%d, HEIGHT:%d", nWidth, nHeight);
// 定义一个按钮句柄,下面的主要就是当窗口不管是变大,变小
// 按钮都是在中间的位置
if (g_hButton != NULL)
{
// 总宽度减去按钮宽度除以2就能保证移动的宽度均等
int nX = (nWidth - 100)/2;
// 总高度减去按钮宽度除以2就能保证移动的宽度均等
int nY = (nHeight - 100)/2;
MoveWindow(g_hButton, nX, nY, 100, 100, TRUE);
/*
关于上面函数MoveWindow的参数解释:
nX -- > 表示当前打开的主窗口的宽度
nY -- > 表示当前打开的主窗口的高度
前面那个100 -- > 表示是按钮的宽度
后面那个100 -- > 表示是按钮的高度
*/
}
}
/************************************************************************/
/*
WM_SYSCOMMAND
系统命令消息,当点击系统菜单和按钮的
时候就会收到消息
可以在这个消息中,提示用户保存数据等。
wParam - 系统命令类型
LOWORD(lParam) - 屏幕X坐标
HIWORD(lParam) - 屏幕Y坐标
*/
/************************************************************************/
BOOL OnSysCommand( HWND hWnd,
UINT nMsg,
WPARAM wParam,
LPARAM lParam)
{
switch(wParam)
{
case SC_CLOSE:
if( IDOK == MessageBox( NULL, "是否将文件存盘?",
"提示", MB_OKCANCEL|MB_ICONWARNING ) )
{
return FALSE;
}
return TRUE;
}
return FALSE;
}
void Message()
{
MSG msg = {0};
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
g_hInst = hInstance;
RegisterWnd("MyWnds");
HWND hWnd = CreateWnd("MyWnds");
DisplayWnd(hWnd);
Message();
return 0;
}
--------------------------------------------------------------------------------
// 用户自定义消息 添加了如下代码
/*
#define WM_FIRSTMSG (WM_USER+1)
#define WM_SECONDMSG (WM_USER+2)
case WM_FIRSTMSG:
MessageBox( NULL, "FIRSTMSG",
"FIRSTMSG", MB_OK );
break;
SendMessage(hWnd, WM_FIRSTMSG, 0, 0);
*/
// WinMsg.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include
HINSTANCE g_hInst = NULL;
HWND g_hButton = NULL;
#define WM_FIRSTMSG (WM_USER+1)
#define WM_SECONDMSG (WM_USER+2)
LRESULT CALLBACK WndProc(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
void OnCreate(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
void OnSize(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
BOOL OnSysCommand( HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
LRESULT CALLBACK WndProc(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
OnCreate(hWnd, uMsg, wParam, lParam);
break;
case WM_SIZE:
OnSize(hWnd, uMsg, wParam, lParam);
break;
case WM_SYSCOMMAND:
if( OnSysCommand( hWnd, uMsg,
wParam, lParam == FALSE ) )
{
return 0;
}
break;
case WM_DESTROY:
//SendMessage( hWnd, WM_QUIT, 0, 0 );
PostMessage( hWnd, WM_QUIT, 0, 0 );
//PostQuitMessage(0);
return 0;
case WM_FIRSTMSG:
MessageBox( NULL, "FIRSTMSG",
"FIRSTMSG", MB_OK );
break;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
BOOL RegisterWnd(LPSTR pszClassName)
{
WNDCLASSEX wce = {0};
wce.cbSize = sizeof(wce);
wce.cbClsExtra = 0;
wce.cbWndExtra = 0;
wce.hbrBackground = HBRUSH(COLOR_BTNFACE+1);
wce.hCursor = NULL;
wce.hIcon = NULL;
wce.hIconSm = NULL;
wce.hInstance = g_hInst;
wce.lpfnWndProc = WndProc;
wce.lpszClassName = pszClassName;
wce.lpszMenuName = NULL;
wce.style = CS_VREDRAW|CS_HREDRAW;
ATOM nAtom = RegisterClassEx(&wce);
if (nAtom == NULL)
{
return FALSE;
}
return TRUE;
}
HWND CreateWnd(LPSTR pszClassName)
{
HWND hWnd = CreateWindowEx(0, pszClassName,
"CNTFWindows", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, NULL, NULL, g_hInst, NULL);
return hWnd;
}
void DisplayWnd(HWND hWnd)
{
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
}
/************************************************************************/
/*
WM_CREATE
窗口创建的时候产生的消息;
在窗口创建后,窗口处理函数会收到第一条消息,那么可以在这个消息
内做数据初始化/创建子窗口等。
WPARAM wParam - 不使用
LPARAM lParam - CREATESTRUCT指针
*/
/************************************************************************/
void OnCreate(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
// 下面是使用参数lParam
LPCREATESTRUCT pCreateStruct = LPCREATESTRUCT(lParam);
// 指向这个结构体指针之后就可以读取创建的窗口的信息
MessageBox(NULL, pCreateStruct->lpszName, "OnCreate", MB_OK);
// 创建一个全局变量的按钮,用来接收创建的窗口
g_hButton = CreateWindowEx(0, "BUTTON", "BUTTON",
WS_CHILD|WS_VISIBLE, 0, 0, 100, 100,
hWnd, NULL, g_hInst, NULL);
SendMessage(hWnd, WM_FIRSTMSG, 0, 0);
}
/************************************************************************/
/*
WM_SIZE
当窗口大小发生变化时,会收到这个消息。
可以在这个消息中调整窗口布局。
wParam - SIZE发生变化时的标识
LOWORD(lParam); - 客户区的宽
HIWORD(lParam); - 客户区的高
*/
/************************************************************************/
void OnSize(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
// 使用lParam参数,其中低位表示宽度Width,高位表示高度Height
int nWidth = LOWORD(lParam);
int nHeight = HIWORD(lParam);
// 下面是先定义一个数组,内存申请好,可以理解为缓冲区
// 临时存放点
CHAR szText[260] = {0};
// 使用sprintf将读取到的数据放入缓冲区szText
sprintf(szText, "WIDTH:%d, HEIGHT:%d", nWidth, nHeight);
// 定义一个按钮句柄,下面的主要就是当窗口不管是变大,变小
// 按钮都是在中间的位置
if (g_hButton != NULL)
{
// 总宽度减去按钮宽度除以2就能保证移动的宽度均等
int nX = (nWidth - 100)/2;
// 总高度减去按钮宽度除以2就能保证移动的宽度均等
int nY = (nHeight - 100)/2;
MoveWindow(g_hButton, nX, nY, 100, 100, TRUE);
/*
关于上面函数MoveWindow的参数解释:
nX -- > 表示当前打开的主窗口的宽度
nY -- > 表示当前打开的主窗口的高度
前面那个100 -- > 表示是按钮的宽度
后面那个100 -- > 表示是按钮的高度
*/
}
}
/************************************************************************/
/*
WM_SYSCOMMAND
系统命令消息,当点击系统菜单和按钮的
时候就会收到消息
可以在这个消息中,提示用户保存数据等。
wParam - 系统命令类型
LOWORD(lParam) - 屏幕X坐标
HIWORD(lParam) - 屏幕Y坐标
*/
/************************************************************************/
BOOL OnSysCommand( HWND hWnd,
UINT nMsg,
WPARAM wParam,
LPARAM lParam)
{
switch(wParam)
{
case SC_CLOSE:
if( IDOK == MessageBox( NULL, "是否将文件存盘?",
"提示", MB_OKCANCEL|MB_ICONWARNING ) )
{
return FALSE;
}
return TRUE;
}
return FALSE;
}
void Message()
{
MSG msg = {0};
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
g_hInst = hInstance;
RegisterWnd("MyWnds");
HWND hWnd = CreateWnd("MyWnds");
DisplayWnd(hWnd);
Message();
return 0;
}
--------------------------------------------------------------------------------
// WM_PAINT 消息的实例
// WinPaint.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
/************************************************************************/
/*
二 WM_PAINT消息
1 WM_PAINT的产生
由于窗口的互相覆盖等,产生需要绘制
的区域,那么会产生WM_PAINT消息.
一般情况下,不直接发送WM_PAINT消息,通过API
声明需要绘制区域,来产生WM_PAINT消息.
例如,可以使用InvalidateRect声明一个需要重新
绘制的区域.
2 WM_PAINT的注意点
2.1 如果一个消息队列中,有多个WM_PAINT消息,
只有最后一个WM_PAINT消息会被处理.
2.2 WM_PAINT消息处理中,要清空需要被绘制的
区域. BeginPaint
3 WM_PAINT的使用
3.1 WM_PAINT开始时,必须调用BeginPaint
3.2 绘制图形
3.3 WM_PAINT处理后,必须调用EndPaint
*/
/************************************************************************/
HINSTANCE g_hInst = NULL;
void OnPaint( HWND hWnd, UINT nMsg,
WPARAM wParam, LPARAM lParam )
{ //WM_PAINT开始时,必须调用
PAINTSTRUCT ps = {0};
HDC hDC = BeginPaint( hWnd, &ps );
CHAR szText[] = "Hello WM_PAINT";
TextOut( hDC, 100, 100, szText, strlen(szText) );
Rectangle( hDC, 200, 200, 300, 300 );
//WM_PAINT处理后,必须调用
EndPaint( hWnd, &ps );
}
LRESULT CALLBACK WndProc( HWND hWnd,
UINT nMsg,
WPARAM wParam,
LPARAM lParam )
{
switch( nMsg )
{
case WM_PAINT:
OnPaint( hWnd, nMsg, wParam, lParam );
break;
case WM_DESTROY:
PostQuitMessage( 0 );
return 0;
}
return DefWindowProc( hWnd, nMsg,
wParam, lParam );
}
BOOL RegisterWnd( LPSTR pszClassName )
{
WNDCLASSEX wce = { 0 };
wce.cbSize = sizeof( wce );
wce.cbClsExtra = 0;
wce.cbWndExtra = 0;
wce.hbrBackground = HBRUSH(COLOR_BTNFACE+1);
wce.hCursor = NULL;
wce.hIcon = NULL;
wce.hIconSm = NULL;
wce.hInstance = g_hInst;
wce.lpfnWndProc = WndProc;
wce.lpszClassName = pszClassName;
wce.lpszMenuName = NULL;
wce.style = CS_HREDRAW|CS_VREDRAW;
ATOM nAtom = RegisterClassEx( &wce );
if( 0 == nAtom )
{
return FALSE;
}
return TRUE;
}
HWND CreateWnd( LPSTR pszClassName )
{
HWND hWnd = CreateWindowEx( 0,
pszClassName, "MyWnd",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, NULL, NULL, g_hInst, NULL );
return hWnd;
}
void DisplayWnd( HWND hWnd )
{
ShowWindow( hWnd, SW_SHOW );
UpdateWindow( hWnd );
}
void Message( )
{
MSG msg = { 0 };
while( GetMessage(&msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
g_hInst = hInstance;
RegisterWnd( "MYWND" );
HWND hWnd = CreateWnd( "MYWND" );
DisplayWnd( hWnd );
Message( );
return 0;
}
--------------------------------------------------------------------------------
// 键盘消息实例
// WinKeyboard.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include
/************************************************************************/
/*
三 键盘消息
1 键盘消息
按键消息
WM_KEYDOWN 当键被按下时产生
WM_KEYUP 当键被释放时产生
WM_SYSKEYDOWN 当系统键被按下时产生 ALT/F10
WM_SYSKEYUP 当系统键释放时产生
字符消息
WM_CHAR 当有字符键被按下时产生
TranslateMessage会将WM_KEYDOWN消息中,
可以显示的按键,转换成WM_CHAR的消息
2 消息参数
WPARAM - 虚拟键码
LPARAM - 相关的按键信息.
3 消息的使用
3.1 当有按键消息时,首先进入系统消息队列,
然后程序的消息循环获取.
3.2 消息的处理
4 键盘消息的顺序
对于可显示字符: WM_KEYDOWN,WM_CHAR,WM_KEYUP
对于不可显示字符: WM_KEYDOWN,WM_KEYUP
对于系统键:WM_SYSKEYDOWN,WM_SYSKEYUP
如果按键一直不释放,会重复产生
WM_KEYDOWN(WM_CHAR)
*/
/************************************************************************/
HINSTANCE g_hInst = NULL;
HANDLE g_hStdOut = NULL;
LRESULT CALLBACK WndProc( HWND hWnd,
UINT nMsg,
WPARAM wParam,
LPARAM lParam )
{
switch( nMsg )
{
// 下面是当从键盘的上下左右按键进行操作的时候会显示
// 被KEYUP和KEYDOWN
case WM_KEYDOWN:
{
CHAR szText[]= "WM_KEYDOWN\r\n";
switch( wParam )
{
// 下面是测试验证键盘的左,右,上,下的按键
case VK_LEFT:
WriteConsole( g_hStdOut, szText,
strlen(szText), NULL, NULL );
break;
case VK_RIGHT:
WriteConsole( g_hStdOut, szText,
strlen(szText), NULL, NULL );
break;
case VK_UP:
WriteConsole( g_hStdOut, szText,
strlen(szText), NULL, NULL );
break;
case VK_DOWN:
WriteConsole( g_hStdOut, szText,
strlen(szText), NULL, NULL );
break;
}
/*
当加入下面这行代码,注释上面KEYDOWN里面的相关
可以测试对于可显示字符: WM_KEYDOWN,WM_CHAR,WM_KEYUP
如果一直按住键盘某一个键不放,会一直显示
KEYDOWN和键盘对应的数字或字符
当最后松手的时候才会显示一个KEYUP
WriteConsole( g_hStdOut, szText,
strlen(szText), NULL, NULL );
*/
}
break;
case WM_KEYUP:
{
// 键盘被按压之后起来的事件
CHAR szText[]= "WM_KEYUP\r\n";
WriteConsole( g_hStdOut, szText,
strlen(szText), NULL, NULL );
}
break;
case WM_SYSKEYDOWN:
{
// 按住F10和ALT不松手的显示
CHAR szText[]= "WM_SYSKEYDOWN\r\n";
WriteConsole( g_hStdOut, szText,
strlen(szText), NULL, NULL );
}
break;
case WM_SYSKEYUP:
{
// 按住F10和ALT松手之后的显示
CHAR szText[]= "WM_SYSKEYUP\r\n";
WriteConsole( g_hStdOut, szText,
strlen(szText), NULL, NULL );
}
break;
case WM_CHAR:
{
// 显示键盘被KEYDOWN之后,打印出对应键盘的字符
CHAR szText[260] = {0};
sprintf( szText, "WM_CHAR: %c\r\n", wParam);
WriteConsole( g_hStdOut, szText,
strlen(szText), NULL, NULL );
}
break;
case WM_DESTROY:
PostQuitMessage( 0 );
return 0;
}
return DefWindowProc( hWnd, nMsg,
wParam, lParam );
}
BOOL RegisterWnd( LPSTR pszClassName )
{
WNDCLASSEX wce = { 0 };
wce.cbSize = sizeof( wce );
wce.cbClsExtra = 0;
wce.cbWndExtra = 0;
wce.hbrBackground = HBRUSH(COLOR_BTNFACE+1);
wce.hCursor = NULL;
wce.hIcon = NULL;
wce.hIconSm = NULL;
wce.hInstance = g_hInst;
wce.lpfnWndProc = WndProc;
wce.lpszClassName = pszClassName;
wce.lpszMenuName = NULL;
wce.style = CS_HREDRAW|CS_VREDRAW;
ATOM nAtom = RegisterClassEx( &wce );
if( nAtom == 0 )
{
return FALSE;
}
return TRUE;
}
HWND CreateWnd( LPSTR pszClassName )
{
HWND hWnd = CreateWindowEx( 0,
pszClassName, "MyWnd",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, NULL, NULL, g_hInst, NULL );
return hWnd;
}
void DisplayWnd( HWND hWnd )
{
ShowWindow( hWnd, SW_SHOW );
UpdateWindow( hWnd );
}
void Message( )
{
MSG msg = { 0 };
while( GetMessage(&msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
void NewConsole( )
{
AllocConsole( );
g_hStdOut =
GetStdHandle( STD_OUTPUT_HANDLE );
CHAR szText[] = "Debug Messages......:\r\n";
WriteConsole( g_hStdOut, szText,
strlen(szText), NULL, NULL );
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
NewConsole( );
g_hInst = hInstance;
RegisterWnd( "MYWND" );
HWND hWnd = CreateWnd( "MYWND" );
DisplayWnd( hWnd );
Message( );
return 0;
}