鱼C论坛

 找回密码
 立即注册
查看: 2834|回复: 1

键盘控制鼠标移动这个程序是怎么实现鼠标刚开始移动很慢,然后再加速移动的

[复制链接]
发表于 2021-8-7 19:32:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
WINDOWS程序设计P237上的程序,书上说键盘控制鼠标要开始缓慢移动,然后再加速移动,在WM_KEYDOWN消息总,lParam指出了键盘按键消息是否是重复击键的结果,说这个程序出色地利用了这个消息
但是这个程序在KEYDOWN消息响应中,没有出现任何对lParam的操作啊,为什么要这样说?是操作系统自己实现的吗?
#include <windows.h>
#define DIVISIONS 5

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
        PSTR szCmdLine, int iCmdShow)
{
        static TCHAR szAppName[] = TEXT("KeyView1");
        HWND         hwnd;
        MSG          msg;
        WNDCLASS     wndclass;


        wndclass.style = CS_HREDRAW | CS_VREDRAW;
        wndclass.lpfnWndProc = WndProc;
        wndclass.cbClsExtra = 0;
        wndclass.cbWndExtra = 0;
        wndclass.hInstance = hInstance;
        wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
        wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
        wndclass.lpszMenuName = NULL;
        wndclass.lpszClassName = szAppName;


        if (!RegisterClass(&wndclass))
        {
                MessageBox(NULL, TEXT("This program requires Windows NT!"),
                        szAppName, MB_ICONERROR);
                return 0;
        }


        hwnd = CreateWindow(szAppName, TEXT("Keyboard Message Viewer #1"),
                WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT, CW_USEDEFAULT,
                CW_USEDEFAULT, CW_USEDEFAULT,
                NULL, NULL, hInstance, NULL);


        ShowWindow(hwnd, iCmdShow);
        UpdateWindow(hwnd);


        while (GetMessage(&msg, NULL, 0, 0))
        {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
        }
        return msg.wParam;
}


LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        static BOOL fState[DIVISIONS][DIVISIONS];
        static int cxBlock, cyBlock;
        HDC hdc;
        int x, y;
        PAINTSTRUCT ps;
        POINT point;
        RECT rect;
        switch (message)
        {
        case WM_SIZE:
                cxBlock = LOWORD(lParam) / DIVISIONS;
                cyBlock = HIWORD(lParam) / DIVISIONS;
                return 0;
        case WM_SETFOCUS:
                ShowCursor(TRUE);
                return 0;
        case WM_KILLFOCUS:
                ShowCursor(FALSE);
                return 0;
        case WM_KEYDOWN:
                GetCursorPos(&point);
                ScreenToClient(hwnd, &point);

                x = max(0, min(DIVISIONS - 1, point.x / cxBlock));
                y = max(0, min(DIVISIONS - 1, 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_NCLBUTTONDOWN, MK_LBUTTON, MAKELONG(x * cxBlock, y * cyBlock));
                        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 = (y + 1) * cyBlock;

                        InvalidateRect(hwnd, &rect, FALSE);
                }
                else
                {
                        MessageBeep(0);
                }
        case WM_PAINT:
        {
               
                hdc = BeginPaint(hwnd, &ps);

                for(x=0;x<DIVISIONS;x++)
                        for (y = 0; y < DIVISIONS; y++)
                        {
                                Rectangle(hdc, x * cxBlock, y * cyBlock, (x + 1) * cxBlock, (y + 1) * cyBlock);
                                if (fState[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);
                                }
                        }
                EndPaint(hwnd, &ps);
                return 0;
        }
        case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
        }
   

        return DefWindowProc(hwnd, message, wParam, lParam);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-16 22:52:30 From FishC Mobile | 显示全部楼层
他好像指的是CHECKER1.C这个程序,而不是下面的那个程序。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 22:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表