• 7Windows程序设计 鼠标


      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;
    }
    View Code

        

       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;
    }
    View Code

        

       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;
    }
    View Code

        

       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;
    }
    View Code

        

        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;
    }
    View Code
    #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")
    };
    View Code

        

  • 相关阅读:
    msmms (二) sms与mms 简述!
    msmms (一) sms与mms区别
    RTSP RTSP(Real Time Streaming Protocol),RFC2326,实时流传输协议,是TCP/IP协议体系中的一个应用层协议
    GPRS GPRS(General Packet Radio Service)是通用分组无线服务技术的简称,它是GSM移动电话用户可用的一种移动数据业务,属于第二代移动通信中的数据传输技术
    CrtCtl (客户端认证的证书、私钥)的控制
    ID
    Pb (数据存储单位)
    PDP 有多种定义,具体哪一种还需研究!!!!
    CNN 美国有线电视新闻网 wapCNN WAP 指无线应用通讯协议 ---- 美国有线电视新闻网 的无线应用
    CMWAP CMWAP是手机上网使用的接入点的名称
  • 原文地址:https://www.cnblogs.com/httpcc/p/16250293.html
Copyright © 2020-2023  润新知