Win32-消息机制-消息队列-消息循环-消息发送-消息组成-消息分类-消息结构-WM_PAINT消息-键盘消息


// 创建一个窗口

// 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;
}