7-Windows程序设计 -鼠标


  7、 1  鼠标

    

// 7-1-鼠标.cpp : 定义应用程序的入口点。
//

#include "framework.h"
#include "7-1-鼠标.h"

#define MAX_LOADSTRING 100
#define MAXPOINTS 1000
// 全局变量:
HINSTANCE hInst;                                // 当前实例
WCHAR szTitle[MAX_LOADSTRING];                  // 标题栏文本
WCHAR szWindowClass[MAX_LOADSTRING];            // 主窗口类名

// 此代码模块中包含的函数的前向声明:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: 在此处放置代码。

    // 初始化全局字符串
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_MY71, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // 执行应用程序初始化:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }

    HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MY71));

    MSG msg;

    // 主消息循环:
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return (int) msg.wParam;
}



//
//  函数: MyRegisterClass()
//
//  目标: 注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEXW wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MY71));
    wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName    = NULL;//MAKEINTRESOURCEW(IDC_MY71);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassExW(&wcex);
}

//
//   函数: InitInstance(HINSTANCE, int)
//
//   目标: 保存实例句柄并创建主窗口
//
//   注释:
//
//        在此函数中,我们在全局变量中保存实例句柄并
//        创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; // 将实例句柄存储在全局变量中

   HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

//
//  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目标: 处理主窗口的消息。
//
//  WM_COMMAND  - 处理应用程序菜单
//  WM_PAINT    - 绘制主窗口
//  WM_DESTROY  - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;
    static POINT pt[MAXPOINTS];
    static int iCount;
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 分析菜单选择:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_LBUTTONDOWN:
        iCount = 0;
        InvalidateRect(hWnd, NULL, true);
        return 0;
    case WM_MOUSEMOVE:
        if (wParam & MK_LBUTTON)
        {
            pt[iCount].x = LOWORD(lParam);
            pt[iCount++].y = HIWORD(lParam);

            hdc = GetDC(hWnd);
            SetPixel(hdc, LOWORD(lParam), HIWORD(lParam), 0);
            ReleaseDC(hWnd, hdc);
        }
        return 0;
    case WM_LBUTTONUP:
        InvalidateRect(hWnd, NULL, FALSE);
        return 0;
    case WM_PAINT:
        {
           
            hdc = BeginPaint(hWnd, &ps);
            // TODO: 在此处添加使用 hdc 的任何绘图代码...

            SetCursor(LoadCursor(NULL,IDC_WAIT)); //设置鼠标样式
            ShowCursor(TRUE);

            for (size_t i = 0; i < iCount - 1; i++)
                for (size_t j = i + 1; j < iCount; j++)
                {
                    MoveToEx(hdc, pt[i].x, pt[i].y, NULL);
                    LineTo(hdc, pt[j].x, pt[j].y);
                }

    

            SetCursor(FALSE);
            SetCursor(LoadCursor(NULL, IDC_ARROW));
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

   7、 2 鼠标  示例:Checker

// 7-2-鼠标Checker1.cpp : 定义应用程序的入口点。
//

#include "framework.h"
#include "7-2-鼠标Checker1.h"

#define MAX_LOADSTRING 100
#define DIVISIONS 5
// 全局变量:
HINSTANCE hInst;                                // 当前实例
WCHAR szTitle[MAX_LOADSTRING];                  // 标题栏文本
WCHAR szWindowClass[MAX_LOADSTRING];            // 主窗口类名

// 此代码模块中包含的函数的前向声明:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: 在此处放置代码。

    // 初始化全局字符串
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_MY72CHECKER1, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // 执行应用程序初始化:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }

    HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MY72CHECKER1));

    MSG msg;

    // 主消息循环:
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return (int) msg.wParam;
}



//
//  函数: MyRegisterClass()
//
//  目标: 注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEXW wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MY72CHECKER1));
    wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName    = NULL;//MAKEINTRESOURCEW(IDC_MY72CHECKER1);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassExW(&wcex);
}

//
//   函数: InitInstance(HINSTANCE, int)
//
//   目标: 保存实例句柄并创建主窗口
//
//   注释:
//
//        在此函数中,我们在全局变量中保存实例句柄并
//        创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; // 将实例句柄存储在全局变量中

   HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

//
//  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目标: 处理主窗口的消息。
//
//  WM_COMMAND  - 处理应用程序菜单
//  WM_PAINT    - 绘制主窗口
//  WM_DESTROY  - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static BOOL fState[DIVISIONS][DIVISIONS];
    static int cxBlock, cyBlock;
    TCHAR szBuffer[10];
    int x, y;  //鼠标左键点击位置
    RECT rect;
    PAINTSTRUCT ps;
    HDC hdc;
    POINT point;
    switch (message)
    {
    case WM_SIZE:
        cxBlock = LOWORD(lParam)/DIVISIONS;    //5 方格的长度
        cyBlock = HIWORD(lParam)/DIVISIONS;       //5 方格的宽度
        return 0;
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 分析菜单选择:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_KEYDOWN:
        GetCursorPos(&point);
        ScreenToClient(hWnd, &point);
        x = max(0, min(DIVISIONS, point.x / cxBlock));
        y = max(0, min(DIVISIONS, point.y / cyBlock));
        switch (wParam)
        {
        case VK_UP:
            y--;
            break;
        case VK_DOWN:
            y++;
            break;
        case VK_LEFT:
            x--;
            break;
        case VK_RIGHT:
            x++;
            break;
        case VK_HOME:
            x = y = 0;
            break;
        case VK_END:
            x = y = DIVISIONS - 1;
            break;
        case VK_RETURN:
        case VK_SPACE:
            SendMessage(hWnd, WM_LBUTTONDOWN, MK_LBUTTON,
                MAKELONG(x * cxBlock, cyBlock * y));
            break;
        default:
            break;
        }
        x = (x + DIVISIONS) % DIVISIONS;
        y = (y + DIVISIONS) % DIVISIONS;

        point.x = x * cxBlock + cxBlock / 2;
        point.y = y * cyBlock + cyBlock / 2;
        ClientToScreen(hWnd, &point);
        SetCursorPos(point.x, point.y);

        return 0;
    case WM_LBUTTONDOWN:
        x = LOWORD(lParam)/cxBlock;
        y = HIWORD(lParam) / cyBlock;
        if (x < DIVISIONS && y < DIVISIONS)
        {
            fState[x][y] ^= 1;
            rect.left = x * cxBlock;
            rect.top = y * cyBlock;
            rect.right = (x + 1) * cxBlock;
            rect.bottom = (x + 1) * cyBlock;
            InvalidateRect(hWnd, &rect, FALSE);
        }
        else
            MessageBeep(0);
        return 0;
    case WM_PAINT:
        {
            hdc = BeginPaint(hWnd, &ps);
            // TODO: 在此处添加使用 hdc 的任何绘图代码...
            for (size_t x = 0; x < DIVISIONS; x++)
                for (size_t y = 0; y < DIVISIONS; y++)
                {
                    Rectangle(hdc, x * cxBlock, y * cyBlock,
                        (x + 1)*cxBlock, (y + 1)*cyBlock);
                    if (fState[x][y])
                    {
                    
                        _sntprintf(szBuffer, 10, TEXT("x,y,%d,%d"), x, y);
                        MoveToEx(hdc, x * cxBlock, y * cyBlock, NULL);
                        LineTo(hdc, (x + 1)*cxBlock, (y + 1)*cyBlock);
                        MoveToEx(hdc, x *cxBlock, (y + 1)*cyBlock, NULL);
                        LineTo(hdc, (x + 1)*cxBlock, y*cyBlock);
                        SetTextColor(hdc, RGB(255, 0, 0));
                        TextOut(hdc, x * cxBlock+(cxBlock/2.5) , y * cyBlock +(cyBlock/4), szBuffer, lstrlen(szBuffer));
                        SetTextColor(hdc, RGB(0, 0, 0));
                    }
                }
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

   7、 3 使用子窗口和键盘 创建 Checker

    

// 7-3-使用子窗口实现Checker1.cpp : 定义应用程序的入口点。
//

#include "framework.h"
#include "7-3-使用子窗口实现Checker1.h"

#define MAX_LOADSTRING 100
#define DIVISIONS 5
// 全局变量:
HINSTANCE hInst;                                // 当前实例
WCHAR szTitle[MAX_LOADSTRING];                  // 标题栏文本
WCHAR szWindowClass[MAX_LOADSTRING];            // 主窗口类名
TCHAR szChildClass[] = TEXT("Checker_Child");   //子窗口名称
int idFocus = 0;

// 此代码模块中包含的函数的前向声明:
ATOM                MyRegisterClass(HINSTANCE hInstance);
ATOM                MyRegisterChildClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM); //主窗口过程
LRESULT CALLBACK    ChildWndProc(HWND, UINT, WPARAM, LPARAM);//子窗口过程
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: 在此处放置代码。

    // 初始化全局字符串
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_MY73CHECKER1, szWindowClass, MAX_LOADSTRING);

    //注册主窗口
    MyRegisterClass(hInstance);

    //注册子窗口
    MyRegisterChildClass(hInstance);

    // 执行应用程序初始化:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }

    HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MY73CHECKER1));

    MSG msg;

    // 主消息循环:
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return (int) msg.wParam;
}



//
//  函数: MyRegisterClass()
//
//  目标: 注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEXW wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MY73CHECKER1));
    wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName    = NULL;//MAKEINTRESOURCEW(IDC_MY73CHECKER1);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassExW(&wcex);
}

//
//  函数: MyRegisterChildClass()
//
//  目标: 注册子窗口类。
//
ATOM MyRegisterChildClass(HINSTANCE hInstance)
{
    WNDCLASSEXW wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = ChildWndProc; //子窗口过程
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = sizeof(long); //保存子窗口数据 字段 1 or  0
    wcex.hInstance = hInstance;
    wcex.hIcon = NULL; //LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MY73CHECKER1));
    wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wcex.lpszMenuName = NULL;//MAKEINTRESOURCEW(IDC_MY73CHECKER1);
    wcex.lpszClassName = szChildClass;
    wcex.hIconSm = NULL; //LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassExW(&wcex);
}



//
//   函数: InitInstance(HINSTANCE, int)
//
//   目标: 保存实例句柄并创建主窗口
//
//   注释:
//
//        在此函数中,我们在全局变量中保存实例句柄并
//        创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; // 将实例句柄存储在全局变量中
   //主窗口、父窗口
   HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}





//
//  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目标: 处理主窗口的消息。
//
//  WM_COMMAND  - 处理应用程序菜单
//  WM_PAINT    - 绘制主窗口
//  WM_DESTROY  - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static    HWND hwndChild[DIVISIONS][DIVISIONS];
    PAINTSTRUCT ps;
    HDC hdc;
    int x, y,cxBlock, cyBlock;
    switch (message)
    {
    case WM_CREATE: //创建主窗口
        //创建25个子窗口
        for (x = 0; x < DIVISIONS; x++)
            for (y = 0; y < DIVISIONS; y++)
                hwndChild[x][y] = CreateWindowW(szChildClass, NULL, WS_CHILDWINDOW | WS_VISIBLE,
                    0, 0, 0, 0, hWnd, (HMENU)(y << 8 | x), hInst,NULL);


                ////主窗口、父窗口
                //HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
                //    CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);


        return 0;
    case WM_SIZE:
        cxBlock = LOWORD(lParam) / DIVISIONS;
        cyBlock = HIWORD(lParam) / DIVISIONS;
        for (x = 0; x < DIVISIONS; x++)
            for (y = 0; y < DIVISIONS; y++)
                MoveWindow(hwndChild[x][y], x *cxBlock, y * cyBlock, cxBlock, cyBlock, TRUE);
        return 0;
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 分析菜单选择:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_KEYDOWN:
        x = idFocus & 0xFF;
        y = idFocus >> 8;

        switch (wParam)
        {
        case VK_UP:        y--;                    break;
        case VK_DOWN:    y++;                    break;
        case VK_LEFT:    x--;                    break;
        case VK_RIGHT:    x++;                    break;
        case VK_HOME:   x = y = 0;                break;
        case VK_END:    x = y = DIVISIONS - 1;    break;
        default:
            break;
        }

        x = (x + DIVISIONS) % DIVISIONS;
        y = (y + DIVISIONS) % DIVISIONS;

        idFocus = y << 8 | x;
        SetFocus(GetDlgItem(hWnd, idFocus));

        return 0;
    case WM_SETFOCUS:
        SetFocus(GetDlgItem(hWnd, idFocus));
        return 0;
    case WM_PAINT:
        {
            hdc = BeginPaint(hWnd, &ps);
            // TODO: 在此处添加使用 hdc 的任何绘图代码...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}



//
//  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目标: 处理子窗口的消息。
//
//  WM_COMMAND  - 处理应用程序菜单
//  WM_PAINT    - 绘制主窗口
//  WM_DESTROY  - 发送退出消息并返回
//
//
LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;
    RECT rect;
    switch (message)
    {
    case WM_CREATE:
        SetWindowLong(hWnd, 0, 0);
        break;
    case WM_KEYDOWN:
        if (wParam != VK_RETURN && wParam != VK_SPACE)
        {
            SendMessage(GetParent(hWnd), message, wParam, lParam);
            return 0;
        }
    case WM_LBUTTONDOWN:
        SetWindowLong(hWnd, 0, 1^GetWindowLong(hWnd,0));
        SetFocus(hWnd); //强制当前子窗口获得焦点
        InvalidateRect(hWnd, NULL, FALSE);
        return 0;
    case WM_SETFOCUS:  //获取窗口焦点
        idFocus = GetWindowLong(hWnd, GWL_ID);  //得到子窗口的ID
    case WM_KILLFOCUS:
        InvalidateRect(hWnd, NULL, TRUE);
        return 0;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        GetClientRect(hWnd, &rect);
        Rectangle(hdc, 0, 0, rect.right, rect.bottom);

        if (GetWindowLong(hWnd, 0))
        {
            MoveToEx(hdc, 0, 0, NULL);
            LineTo(hdc, rect.right, rect.bottom);
            MoveToEx(hdc, 0, rect.bottom, NULL);
            LineTo(hdc, rect.right, 0);
        }

        if (hWnd == GetFocus())
        {
            rect.left += rect.right / 10;
            rect.right -= rect.left;
            rect.top += rect.bottom / 10;
            rect.bottom -= rect.top;

            SelectObject(hdc, GetStockObject(NULL_BRUSH));
            SelectObject(hdc, CreatePen(PS_DASH, 0, 0));
            Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom);
            DeleteObject(SelectObject(hdc, GetStockObject(BLACK_BRUSH)));

        }

        EndPaint(hWnd, &ps);
        return 0;
    default:
        break;
    }

    return DefWindowProc(hWnd,message,wParam,lParam);
}



// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

   7、  4  捕获鼠标

    

// 7-4-捕获鼠标.cpp : 定义应用程序的入口点。
//

#include "framework.h"
#include "7-4-捕获鼠标.h"

#define MAX_LOADSTRING 100

// 全局变量:
HINSTANCE hInst;                                // 当前实例
WCHAR szTitle[MAX_LOADSTRING];                  // 标题栏文本
WCHAR szWindowClass[MAX_LOADSTRING];            // 主窗口类名

// 此代码模块中包含的函数的前向声明:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: 在此处放置代码。

    // 初始化全局字符串
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_MY74, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // 执行应用程序初始化:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }

    HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MY74));

    MSG msg;

    // 主消息循环:
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return (int) msg.wParam;
}



//
//  函数: MyRegisterClass()
//
//  目标: 注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEXW wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MY74));
    wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName    = NULL;//MAKEINTRESOURCEW(IDC_MY74);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassExW(&wcex);
}

//
//   函数: InitInstance(HINSTANCE, int)
//
//   目标: 保存实例句柄并创建主窗口
//
//   注释:
//
//        在此函数中,我们在全局变量中保存实例句柄并
//        创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; // 将实例句柄存储在全局变量中

   HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

void DrawBoxOutline(HWND hWnd, POINT ptBeg, POINT ptEnd)
{
    HDC hdc;
    hdc = GetDC(hWnd);
    SetROP2(hdc, R2_NOT);
    SelectObject(hdc, GetStockObject(NULL_BRUSH));
    Rectangle(hdc, ptBeg.x, ptBeg.y, ptEnd.x, ptEnd.y);
    ReleaseDC(hWnd, hdc);
}


//
//  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目标: 处理主窗口的消息。
//
//  WM_COMMAND  - 处理应用程序菜单
//  WM_PAINT    - 绘制主窗口
//  WM_DESTROY  - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;
    static POINT ptBeg, ptEnd,ptBoxBeg,ptBoxEnd;
    static BOOL fBolcking;
    switch (message)
    {    
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 分析菜单选择:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_LBUTTONDOWN:
        //记录鼠标的位置
        ptBeg.x = ptEnd.x = LOWORD(lParam);
        ptBeg.y = ptEnd.y = HIWORD(lParam);

        DrawBoxOutline(hWnd,ptBeg,ptEnd);
        SetCapture(hWnd);

        SetCursor(LoadCursor(NULL, IDC_CROSS));

        fBolcking = TRUE;
        return 0;
    case WM_MOUSEMOVE:
        if (fBolcking)
        {
            SetCursor(LoadCursor(NULL, IDC_CROSS));
            DrawBoxOutline(hWnd,ptBeg,ptEnd);

            ptEnd.x = LOWORD(lParam);
            ptEnd.y = HIWORD(lParam);

            DrawBoxOutline(hWnd, ptBeg, ptEnd);
        }
        return 0;
    case WM_LBUTTONUP:
        if (fBolcking)
        {
            DrawBoxOutline(hWnd, ptBeg, ptEnd);
            ptBoxBeg = ptBeg;
            ReleaseCapture();
            ptBoxEnd.x = LOWORD(lParam);
            ptBoxEnd.y = HIWORD(lParam);
            SetCursor(LoadCursor(NULL, IDC_ARROW));
            fBolcking = FALSE;
            InvalidateRect(hWnd, NULL, TRUE);
        }
        return 0;
    case WM_PAINT:
        {
            hdc = BeginPaint(hWnd, &ps);
            // TODO: 在此处添加使用 hdc 的任何绘图代码...

            SetROP2(hdc, R2_NOT);
            SelectObject(hdc, GetStockObject(NULL_BRUSH));
            Rectangle(hdc, ptBoxBeg.x, ptBoxBeg.y, ptBoxEnd.x, ptBoxEnd.y);
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

    7、  5  鼠标滚轮

// 4_4_例子Sysmets.cpp : 定义应用程序的入口点。
//

#include "pch.h"
#include "framework.h"
#include "4_4_例子Sysmets.h"
#include "data.h"

#define MAX_LOADSTRING 100

// 全局变量:
HINSTANCE hInst;                                // 当前实例
WCHAR szTitle[MAX_LOADSTRING];                  // 标题栏文本
WCHAR szWindowClass[MAX_LOADSTRING];            // 主窗口类名

// 此代码模块中包含的函数的前向声明:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: 在此处放置代码。

    // 初始化全局字符串
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_MY44SYSMETS, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // 执行应用程序初始化:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }

    HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MY44SYSMETS));

    MSG msg;

    // 主消息循环:
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return (int) msg.wParam;
}



//
//  函数: MyRegisterClass()
//
//  目标: 注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEXW wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MY44SYSMETS));
    wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = NULL;//MAKEINTRESOURCEW(IDC_MY44SYSMETS);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassExW(&wcex);
}

//
//   函数: InitInstance(HINSTANCE, int)
//
//   目标: 保存实例句柄并创建主窗口
//
//   注释:
//
//        在此函数中,我们在全局变量中保存实例句柄并
//        创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; // 将实例句柄存储在全局变量中

   HWND hWnd = CreateWindowW(szWindowClass, TEXT("Get System Metrics NO.1"), WS_OVERLAPPEDWINDOW | WS_VSCROLL,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

//
//  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目标: 处理主窗口的消息。
//
//  WM_COMMAND  - 处理应用程序菜单
//  WM_PAINT    - 绘制主窗口
//  WM_DESTROY  - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        static int cxChar, cxCaps, cyChar, iVScrollPos,cyClient;
        PAINTSTRUCT ps;
        HDC hdc;
        TCHAR szBuffer[10];
        TEXTMETRIC tm;
        size_t y;
        SCROLLINFO si;
        size_t iVertPos;
        size_t iPaintBeg, iPaintEnd;

        ULONG ulScroolLines;    //总行数
        static int iDeltaPerLine; //每一行滚动的距离
        static int iAccumDelta;  //累计器
    case WM_CREATE:
        {
            hdc = GetDC(hWnd);
            GetTextMetrics(hdc,&tm);
            cxChar = tm.tmAveCharWidth;

            //变宽的字体是小写字体的1.5倍
            cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2;

            //字体的高度 + 外部的间距(字体设计的人推荐的加)
            cyChar = tm.tmHeight + tm.tmExternalLeading;

            ReleaseDC(hWnd, hdc);
            iVScrollPos = 0;

            //SetScrollRange(hWnd, SB_VERT, 0, NUMLINES - 1, FALSE);
            //SetScrollPos(hWnd, SB_VERT, iVScrollPos, TRUE);

            SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &ulScroolLines, 0);
            if (ulScroolLines)
                iDeltaPerLine = WHEEL_DELTA / ulScroolLines;
            else
                iDeltaPerLine = 0;
            return 0;
        }
    case WM_SIZE:
        //客户区的高度
        cyClient = HIWORD(lParam);

        si.cbSize = sizeof(si);
        si.fMask = SIF_RANGE | SIF_PAGE;
        //客户区一页有多少行
        si.nPage = cyClient / cyChar;
        si.nMin = 0;
        si.nMax = NUMLINES;

        SetScrollInfo(hWnd, SB_VERT, &si, true);
        break;
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 分析菜单选择:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_PAINT:
        {
           hdc = BeginPaint(hWnd, &ps);
            // TODO: 在此处添加使用 hdc 的任何绘图代码...
           si.cbSize = sizeof(si);
           si.fMask = SIF_POS;
           GetScrollInfo(hWnd, SB_VERT, &si);
           iVertPos = si.nPos;

           //无效区域开始位置
           iPaintBeg = max(0, iVertPos + ps.rcPaint.top/cyChar);

           //无效区域结束位置
           iPaintEnd = min(NUMLINES - 1, iVertPos + ps.rcPaint.bottom / cyChar);

           for (int i = iPaintBeg; i <= iPaintEnd; ++i)
           {
               y = cyChar * (i - iVertPos);
                TextOut(hdc, 0, y, sysmetrics[i].szLabel, lstrlen(sysmetrics[i].szLabel));
                TextOut(hdc, 22 * cxCaps, y, sysmetrics[i].szDesc, lstrlen(sysmetrics[i].szDesc));

                SetTextAlign(hdc, TA_RIGHT | TA_TOP);
                TextOut(hdc, 22 * cxCaps + 40 * cxChar, y, szBuffer, wsprintf(szBuffer, TEXT("%5d"), GetSystemMetrics(sysmetrics[i].iIndex)));
                SetTextAlign(hdc, TA_LEFT | TA_TOP);
           }
            EndPaint(hWnd, &ps); 
        }
        break;

    case WM_MOUSEWHEEL:   //鼠标滚轮

        //滚动一行,标准距离 40
        if (iDeltaPerLine == 0)
            break;

        //累加
        iAccumDelta += (short)HIWORD(wParam);

        while (iAccumDelta >= iDeltaPerLine)
        {
            SendMessage(hWnd, WM_VSCROLL, SB_LINEUP, 0);
            iAccumDelta -= iDeltaPerLine;
        }

        while (iAccumDelta < iDeltaPerLine)
        {
            SendMessage(hWnd, WM_VSCROLL, SB_LINEDOWN, 0);
            iAccumDelta += iDeltaPerLine;
        }



        return 0;
    case WM_VSCROLL:
        si.cbSize = sizeof(si);
        si.fMask = SIF_ALL;
        GetScrollInfo(hWnd,SB_VERT,&si);
        iVertPos = si.nPos;
        switch (LOWORD(wParam))
        {
        case SB_TOP:
            si.nPos = si.nMin;
            break;
        case SB_BOTTOM:
            si.nPos = si.nMax;
            break;
        case SB_LINEUP:
            //iVScrollPos -= 1; 
            si.nPos -= 1;
            break;
        case SB_LINEDOWN:
            //iVScrollPos += 1;
            si.nPos += 1;
            break;
        case SB_PAGEUP:
            //iVScrollPos -= cyClient / cyChar;
            si.nPos -= si.nPage;
            break;
        case SB_PAGEDOWN:
            //iVScrollPos += cyClient / cyChar;
            si.nPos += si.nPage;
            break;

        //case SB_THUMBPOSITION:
        case SB_THUMBTRACK:
            //iVScrollPos = HIWORD(wParam);
            si.nPos = si.nTrackPos;
            break;
        default:
            break;
        }
        si.fMask = SIF_POS;
        SetScrollInfo(hWnd, SB_VERT, &si, TRUE);
        GetScrollInfo(hWnd, SB_VERT, &si);

        if (si.nPos != iVertPos)
        {
            //刷新滚动窗口客户区的内容
            ScrollWindow(hWnd, 0, cyChar*(iVertPos - si.nPos), NULL, NULL);
            UpdateWindow(hWnd);
        }


        //iVScrollPos = max(0, min(iVScrollPos, NUMLINES - 1));


        //if (iVScrollPos != GetScrollPos(hWnd,SB_VERT))
        //{
        //    SetScrollPos(hWnd, SB_VERT, iVScrollPos, true);
        //    InvalidateRect(hWnd, NULL, TRUE);
        //    UpdateWindow(hWnd);
        //}
        
        break;
    case WM_KEYDOWN:
        switch (wParam)
        {
        case VK_DOWN:
            SendMessage(hWnd, WM_VSCROLL, SB_LINEDOWN, 0);
            break;
        case VK_UP:
            SendMessage(hWnd, WM_VSCROLL, SB_LINEUP, 0);
            break;
        case VK_HOME:
            SendMessage(hWnd, WM_VSCROLL, SB_TOP, 0);
            break;
        case VK_END:
            SendMessage(hWnd, WM_VSCROLL, SB_BOTTOM, 0);
            break;
        case VK_PRIOR:
            SendMessage(hWnd, WM_VSCROLL, SB_PAGEUP, 0);
            break;
        case VK_NEXT:
            SendMessage(hWnd, WM_VSCROLL, SB_PAGEDOWN, 0);
            break;
        default:
            break;
        }
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}
#pragma once
//data.h    头文件内容

#define NUMLINES ((int) (sizeof sysmetrics / sizeof sysmetrics [0]))

struct
{
    int     iIndex;
    TCHAR * szLabel;
    TCHAR * szDesc;
}
sysmetrics[] =
{
     SM_CXSCREEN,              TEXT("SM_CXSCREEN"),
                              TEXT("Screen width in pixels"),
     SM_CYSCREEN,             TEXT("SM_CYSCREEN"),
                              TEXT("Screen height in pixels"),
     SM_CXVSCROLL,            TEXT("SM_CXVSCROLL"),
                              TEXT("Vertical scroll width"),
     SM_CYHSCROLL,            TEXT("SM_CYHSCROLL"),
                              TEXT("Horizontal scroll height"),
     SM_CYCAPTION,            TEXT("SM_CYCAPTION"),
                              TEXT("Caption bar height"),
     SM_CXBORDER,             TEXT("SM_CXBORDER"),
                              TEXT("Window border width"),
     SM_CYBORDER,             TEXT("SM_CYBORDER"),
                              TEXT("Window border height"),
     SM_CXFIXEDFRAME,         TEXT("SM_CXFIXEDFRAME"),
                              TEXT("Dialog window frame width"),
     SM_CYFIXEDFRAME,         TEXT("SM_CYFIXEDFRAME"),
                              TEXT("Dialog window frame height"),
     SM_CYVTHUMB,             TEXT("SM_CYVTHUMB"),
                              TEXT("Vertical scroll thumb height"),
     SM_CXHTHUMB,             TEXT("SM_CXHTHUMB"),
                              TEXT("Horizontal scroll thumb width"),
     SM_CXICON,               TEXT("SM_CXICON"),
                              TEXT("Icon width"),
     SM_CYICON,               TEXT("SM_CYICON"),
                              TEXT("Icon height"),
     SM_CXCURSOR,             TEXT("SM_CXCURSOR"),
                              TEXT("Cursor width"),
     SM_CYCURSOR,             TEXT("SM_CYCURSOR"),
                              TEXT("Cursor height"),
     SM_CYMENU,               TEXT("SM_CYMENU"),
                              TEXT("Menu bar height"),
     SM_CXFULLSCREEN,         TEXT("SM_CXFULLSCREEN"),
                              TEXT("Full screen client area width"),
     SM_CYFULLSCREEN,         TEXT("SM_CYFULLSCREEN"),
                              TEXT("Full screen client area height"),
     SM_CYKANJIWINDOW,        TEXT("SM_CYKANJIWINDOW"),
                              TEXT("Kanji window height"),
     SM_MOUSEPRESENT,         TEXT("SM_MOUSEPRESENT"),
                              TEXT("Mouse present flag"),
     SM_CYVSCROLL,            TEXT("SM_CYVSCROLL"),
                              TEXT("Vertical scroll arrow height"),
     SM_CXHSCROLL,            TEXT("SM_CXHSCROLL"),
                              TEXT("Horizontal scroll arrow width"),
     SM_DEBUG,                TEXT("SM_DEBUG"),
                              TEXT("Debug version flag"),
     SM_SWAPBUTTON,           TEXT("SM_SWAPBUTTON"),
                              TEXT("Mouse buttons swapped flag"),
     SM_CXMIN,                TEXT("SM_CXMIN"),
                              TEXT("Minimum window width"),
     SM_CYMIN,                TEXT("SM_CYMIN"),
                              TEXT("Minimum window height"),
     SM_CXSIZE,               TEXT("SM_CXSIZE"),
                              TEXT("Min/Max/Close button width"),
     SM_CYSIZE,               TEXT("SM_CYSIZE"),
                              TEXT("Min/Max/Close button height"),
     SM_CXSIZEFRAME,          TEXT("SM_CXSIZEFRAME"),
                              TEXT("Window sizing frame width"),
     SM_CYSIZEFRAME,          TEXT("SM_CYSIZEFRAME"),
                              TEXT("Window sizing frame height"),
     SM_CXMINTRACK,           TEXT("SM_CXMINTRACK"),
                              TEXT("Minimum window tracking width"),
     SM_CYMINTRACK,           TEXT("SM_CYMINTRACK"),
                              TEXT("Minimum window tracking height"),
     SM_CXDOUBLECLK,          TEXT("SM_CXDOUBLECLK"),
                              TEXT("Double click x tolerance"),
     SM_CYDOUBLECLK,          TEXT("SM_CYDOUBLECLK"),
                              TEXT("Double click y tolerance"),
     SM_CXICONSPACING,        TEXT("SM_CXICONSPACING"),
                              TEXT("Horizontal icon spacing"),
     SM_CYICONSPACING,        TEXT("SM_CYICONSPACING"),
                              TEXT("Vertical icon spacing"),
     SM_MENUDROPALIGNMENT,    TEXT("SM_MENUDROPALIGNMENT"),
                              TEXT("Left or right menu drop"),
     SM_PENWINDOWS,           TEXT("SM_PENWINDOWS"),
                              TEXT("Pen extensions installed"),
     SM_DBCSENABLED,          TEXT("SM_DBCSENABLED"),
                              TEXT("Double-Byte Char Set enabled"),
     SM_CMOUSEBUTTONS,        TEXT("SM_CMOUSEBUTTONS"),
                              TEXT("Number of mouse buttons"),
     SM_SECURE,               TEXT("SM_SECURE"),
                              TEXT("Security present flag"),
     SM_CXEDGE,               TEXT("SM_CXEDGE"),
                              TEXT("3-D border width"),
     SM_CYEDGE,               TEXT("SM_CYEDGE"),
                              TEXT("3-D border height"),
     SM_CXMINSPACING,         TEXT("SM_CXMINSPACING"),
                              TEXT("Minimized window spacing width"),
     SM_CYMINSPACING,         TEXT("SM_CYMINSPACING"),
                              TEXT("Minimized window spacing height"),
     SM_CXSMICON,             TEXT("SM_CXSMICON"),
                              TEXT("Small icon width"),
     SM_CYSMICON,             TEXT("SM_CYSMICON"),
                              TEXT("Small icon height"),
     SM_CYSMCAPTION,          TEXT("SM_CYSMCAPTION"),
                              TEXT("Small caption height"),
     SM_CXSMSIZE,             TEXT("SM_CXSMSIZE"),
                              TEXT("Small caption button width"),
     SM_CYSMSIZE,             TEXT("SM_CYSMSIZE"),
                              TEXT("Small caption button height"),
     SM_CXMENUSIZE,           TEXT("SM_CXMENUSIZE"),
                              TEXT("Menu bar button width"),
     SM_CYMENUSIZE,           TEXT("SM_CYMENUSIZE"),
                              TEXT("Menu bar button height"),
     SM_ARRANGE,              TEXT("SM_ARRANGE"),
                              TEXT("How minimized windows arranged"),
     SM_CXMINIMIZED,          TEXT("SM_CXMINIMIZED"),
                              TEXT("Minimized window width"),
     SM_CYMINIMIZED,          TEXT("SM_CYMINIMIZED"),
                              TEXT("Minimized window height"),
     SM_CXMAXTRACK,           TEXT("SM_CXMAXTRACK"),
                              TEXT("Maximum draggable width"),
     SM_CYMAXTRACK,           TEXT("SM_CYMAXTRACK"),
                              TEXT("Maximum draggable height"),
     SM_CXMAXIMIZED,          TEXT("SM_CXMAXIMIZED"),
                              TEXT("Width of maximized window"),
     SM_CYMAXIMIZED,          TEXT("SM_CYMAXIMIZED"),
                              TEXT("Height of maximized window"),
     SM_NETWORK,              TEXT("SM_NETWORK"),
                              TEXT("Network present flag"),
     SM_CLEANBOOT,            TEXT("SM_CLEANBOOT"),
                              TEXT("How system was booted"),
     SM_CXDRAG,               TEXT("SM_CXDRAG"),
                              TEXT("Avoid drag x tolerance"),
     SM_CYDRAG,               TEXT("SM_CYDRAG"),
                              TEXT("Avoid drag y tolerance"),
     SM_SHOWSOUNDS,           TEXT("SM_SHOWSOUNDS"),
                              TEXT("Present sounds visually"),
     SM_CXMENUCHECK,          TEXT("SM_CXMENUCHECK"),
                              TEXT("Menu check-mark width"),
     SM_CYMENUCHECK,          TEXT("SM_CYMENUCHECK"),
                              TEXT("Menu check-mark height"),
     SM_SLOWMACHINE,          TEXT("SM_SLOWMACHINE"),
                              TEXT("Slow processor flag"),
     SM_MIDEASTENABLED,       TEXT("SM_MIDEASTENABLED"),
                              TEXT("Hebrew and Arabic enabled flag"),
     SM_MOUSEWHEELPRESENT,    TEXT("SM_MOUSEWHEELPRESENT"),
                              TEXT("Mouse wheel present flag"),
     SM_XVIRTUALSCREEN,       TEXT("SM_XVIRTUALSCREEN"),
                              TEXT("Virtual screen x origin"),
     SM_YVIRTUALSCREEN,       TEXT("SM_YVIRTUALSCREEN"),
                              TEXT("Virtual screen y origin"),
     SM_CXVIRTUALSCREEN,      TEXT("SM_CXVIRTUALSCREEN"),
                              TEXT("Virtual screen width"),
     SM_CYVIRTUALSCREEN,      TEXT("SM_CYVIRTUALSCREEN"),
                              TEXT("Virtual screen height"),
     SM_CMONITORS,            TEXT("SM_CMONITORS"),
                              TEXT("Number of monitors"),
     SM_SAMEDISPLAYFORMAT,    TEXT("SM_SAMEDISPLAYFORMAT"),
                              TEXT("Same color format flag")
};

相关