zoukankan      html  css  js  c++  java
  • Windows 程序设计--(六)键盘

    6.2 击键消息

    当按下一个键时,Windows把WM_KEYDOWN或者WM_SYSKEYDOWN消息放入有输入焦点的窗口的消息队列;当您释放一个键时,Windows把WM_KEYUP或者WM_SYSKEYUP消息放入消息队列中。

     

     

    键按下

    键释放

    非系统键

    WM_KEYDOWN

    WM_KEYUP

    系统键

    WM_SYSKEYDOWN

    WM_SYSKEYUP

    通常「down(按下)」和「up(放开)」消息是成对出现的。不过,如果您按住一个键使得自动重复功能生效,那么当该键最后被释放时,Windows会给窗口消息处理程序发送一系列WM_KEYDOWN(或者WM_SYSKEYDOWN)消息和一个WM_KEYUP(或者WM_SYSKEYUP)消息。像所有放入队列的消息一样,按键消息也有时间信息。通过呼叫GetMessageTime,您可以获得按下或者释放键的相对时间。

    6.2.1 系统键击和非系统键击

    一般来说和ALT组合的都是系统键击,其它的都是非系统键击。

    #include <Windows.h>
    #include <iostream>
    
    using namespace std;
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
    {
        static TCHAR szAppName[] = TEXT("WNDCLASS NAME");
        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("窗口创建失败!需要Windows NT!(传递消息为UNICODE)"), szAppName, MB_ICONERROR);
    
            return 0;
        }
    
        hwnd = CreateWindow(
            szAppName,
            TEXT("Hk_Mayfly"),
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            100,//宽度
            100,//高度
            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) {
    
        switch (message) {
        case WM_SYSKEYDOWN:
            MessageBox(hwnd, TEXT("系统键击按下!"), TEXT("test!"), NULL);
            return 0;
        case WM_KEYDOWN:
            MessageBox(hwnd, TEXT("非系统键击按下!"), TEXT("test!"), NULL);
            return 0;
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        }
        return DefWindowProc(hwnd, message, wParam, lParam);
    }

    6.2.2 虚拟键代码

    扫描码(通码)和断码的相关信息可以在 https://www.cnblogs.com/Mayfly-nymph/p/11228966.html 找到说明。

    前四个虚拟键码中有三个指的是鼠标键:

     

    十进制

    十六进制

    WINUSER.H标识符

    必需?

    IBM兼容键盘

    1

    01

    VK_LBUTTON

     

    鼠标左键

    2

    02

    VK_RBUTTON

     

    鼠标右键

    3

    03

    VK_CANCEL

    ˇ

    Ctrl-Break

    4

    04

    VK_MBUTTON

     

    鼠标中键

    我们不能在击键消息中检测到鼠标消息。

    虚拟键代码

    Symbolic Constant Name Hexadecimal Value Mouse Or Keyboard Equivalent
    VK_LBUTTON 01 Left mouse button
    VK_RBUTTON 02 Right mouse button
    VK_CANCEL 03 Control-break processing
    VK_MBUTTON 04 Middle mouse button (three-button mouse)
    VK_XBUTTON1 05 Windows 2000: X1 mouse button
    VK_XBUTTON2 06 Windows 2000: X2 mouse button
    — 07 Undefined
    VK_BACK 08 BACKSPACE key
    VK_TAB 09 TAB key
    — 0A–0B Reserved
    VK_CLEAR 0C CLEAR key
    VK_RETURN 0D ENTER key
    — 0E–0F Undefined
    VK_SHIFT 10 SHIFT key
    VK_CONTROL 11 CTRL key
    VK_MENU 12 ALT key
    VK_PAUSE 13 PAUSE key
    VK_CAPITAL 14 CAPS LOCK key
    VK_KANA 15 IME Kana mode
    VK_HANGUEL 15 IME Hanguel mode (maintained for compatibility; use VK_HANGUL)
    VK_HANGUL 15 IME Hangul mode
    — 16 Undefined
    VK_JUNJA 17 IME Junja mode
    VK_FINAL 18 IME final mode
    VK_HANJA 19 IME Hanja mode
    VK_KANJI 19 IME Kanji mode
    — 1A Undefined
    VK_ESCAPE 1B ESC key
    VK_CONVERT 1C IME convert
    VK_NONCONVERT 1D IME nonconvert
    VK_ACCEPT 1E IME accept
    VK_MODECHANGE 1F IME mode change request
    VK_SPACE 20 SPACEBAR
    VK_PRIOR 21 PAGE UP key
    VK_NEXT 22 PAGE DOWN key
    VK_END 23 END key
    VK_HOME 24 HOME key
    VK_LEFT 25 LEFT ARROW key
    VK_UP 26 UP ARROW key
    VK_RIGHT 27 RIGHT ARROW key
    VK_DOWN 28 DOWN ARROW key
    VK_SELECT 29 SELECT key
    VK_PRINT 2A PRINT key
    VK_EXECUTE 2B EXECUTE key
    VK_SNAPSHOT 2C PRINT SCREEN key
    VK_INSERT 2D INS key
    VK_DELETE 2E DEL key
    VK_HELP 2F HELP key
    '0' 30 0 key
    '1' 31 1 key
    '2' 32 2 key
    '3' 33 3 key
    '4' 34 4 key
    '5' 35 5 key
    '6' 36 6 key
    '7' 37 7 key
    '8' 38 8 key
    '9' 39 9 key
    — 3A–40 Undefined
    'A' 41 A key
    'B' 42 B key
    'C' 43 C key
    'D' 44 D key
    'E' 45 E key
    'F' 46 F key
    'G' 47 G key
    'H' 48 H key
    'I' 49 I key
    'J' 4A J key
    'K' 4B K key
    'L' 4C L key
    'M' 4D M key
    'N' 4E N key
    'O' 4F O key
    'P' 50 P key
    'Q' 51 Q key
    'R' 52 R key
    'S' 53 S key
    'T' 54 T key
    'U' 55 U key
    'V' 56 V key
    'W' 57 W key
    'X' 58 X key
    'Y' 59 Y key
    'Z' 5A Z key
    VK_LWIN 5B Left Windows key (Microsoft Natural Keyboard)
    VK_RWIN 5C Right Windows key (Microsoft Natural Keyboard)
    VK_APPS 5D Applications key (Microsoft Natural Keyboard)
    — 5E Reserved
    VK_SLEEP 5F Computer Sleep key
    VK_NUMPAD0 60 Numeric keypad 0 key
    VK_NUMPAD1 61 Numeric keypad 1 key
    VK_NUMPAD2 62 Numeric keypad 2 key
    VK_NUMPAD3 63 Numeric keypad 3 key
    VK_NUMPAD4 64 Numeric keypad 4 key
    VK_NUMPAD5 65 Numeric keypad 5 key
    VK_NUMPAD6 66 Numeric keypad 6 key
    VK_NUMPAD7 67 Numeric keypad 7 key
    VK_NUMPAD8 68 Numeric keypad 8 key
    VK_NUMPAD9 69 Numeric keypad 9 key
    VK_MULTIPLY 6A Multiply key
    VK_ADD 6B Add key
    VK_SEPARATOR 6C Separator key
    VK_SUBTRACT 6D Subtract key
    VK_DECIMAL 6E Decimal key
    VK_DIVIDE 6F Divide key
    VK_F1 70 F1 key
    VK_F2 71 F2 key
    VK_F3 72 F3 key
    VK_F4 73 F4 key
    VK_F5 74 F5 key
    VK_F6 75 F6 key
    VK_F7 76 F7 key
    VK_F8 77 F8 key
    VK_F9 78 F9 key
    VK_F10 79 F10 key
    VK_F11 7A F11 key
    VK_F12 7B F12 key
    VK_F13 7C F13 key
    VK_F14 7D F14 key
    VK_F15 7E F15 key
    VK_F16 7F F16 key
    VK_F17 80H F17 key
    VK_F18 81H F18 key
    VK_F19 82H F19 key
    VK_F20 83H F20 key
    VK_F21 84H F21 key
    VK_F22 85H F22 key
    VK_F23 86H F23 key
    VK_F24 87H F24 key
    — 88–8F Unassigned
    VK_NUMLOCK 90 NUM LOCK key
    VK_SCROLL 91 SCROLL LOCK key
      92–96 OEM specific
    — 97–9F Unassigned
    VK_LSHIFT A0 Left SHIFT key
    VK_RSHIFT A1 Right SHIFT key
    VK_LCONTROL A2 Left CONTROL key
    VK_RCONTROL A3 Right CONTROL key
    VK_LMENU A4 Left MENU key
    VK_RMENU A5 Right MENU key
    VK_BROWSER_BACK A6 Windows 2000: Browser Back key
    VK_BROWSER_FORWARD A7 Windows 2000: Browser Forward key
    VK_BROWSER_REFRESH A8 Windows 2000: Browser Refresh key
    VK_BROWSER_STOP A9 Windows 2000: Browser Stop key
    VK_BROWSER_SEARCH AA Windows 2000: Browser Search key
    VK_BROWSER_FAVORITES AB Windows 2000: Browser Favorites key
    VK_BROWSER_HOME AC Windows 2000: Browser Launch and Home key
    VK_VOLUME_MUTE AD Windows 2000: Volume Mute key
    VK_VOLUME_DOWN AE Windows 2000: Volume Down key
    VK_VOLUME_UP AF Windows 2000: Volume Up key
    VK_MEDIA_NEXT_TRACK B0 Windows 2000: Next Track key
    VK_MEDIA_PREV_TRACK B1 Windows 2000: Previous Track key
    VK_MEDIA_STOP B2 Windows 2000: Stop Media key
    VK_MEDIA_PLAY_PAUSE B3 Windows 2000: Play/Pause Media key
    VK_LAUNCH_MAIL B4 Windows 2000: Launch Mail key
    VK_LAUNCH_MEDIA_SELECT B5 Windows 2000: Select Media key
    VK_LAUNCH_APP1 B6 Windows 2000: Launch Application 1 key
    VK_LAUNCH_APP2 B7 Windows 2000: Launch Application 2 key
    — B8-B9 Reserved
    VK_OEM_1 BA Windows 2000: for the US standard keyboard, the ';:' key
    VK_OEM_PLUS BB Windows 2000: for any country/region, the '+' key
    VK_OEM_COMMA BC Windows 2000: for any country/region, the ',' key
    VK_OEM_MINUS BD Windows 2000: for any country/region, the '-' key
    VK_OEM_PERIOD BE Windows 2000: for any country/region, the '.' key
    VK_OEM_2 BF Windows 2000: for the US standard keyboard, the '/?' key
    VK_OEM_3 C0 Windows 2000: for the US standard keyboard, the '`~' key
    — C1–D7 Reserved
    — D8–DA Unassigned
    VK_OEM_4 DB Windows 2000: for the US standard keyboard, the '[{' key
    VK_OEM_5 DC Windows 2000: for the US standard keyboard, the '|' key
    VK_OEM_6 DD Windows 2000: for the US standard keyboard, the ']}' key
    VK_OEM_7 DE Windows 2000: for the US standard keyboard, the 'single-quote/double-quote' key
    VK_OEM_8 DF  
    — E0 Reserved
      E1 OEM specific
    VK_OEM_102 E2 Windows 2000: either the '<>' key or the '|' key on the RT 102-key keyboard
      E3–E4 OEM specific
    VK_PROCESSKEY E5 Windows 95, Windows NT 4.0, and Windows 2000: IME PROCESS key
      E6 OEM specific
    VK_PACKET E7 Windows 2000: Used to pass Unicode characters as if they were keystrokes. The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. The Unicode character is the high word.
    — E8 Unassigned
      E9–F5 OEM specific
    VK_ATTN F6 Attn key
    VK_CRSEL F7 CrSel key
    VK_EXSEL F8 ExSel key
    VK_EREOF F9 Erase EOF key
    VK_PLAY FA Play key
    VK_ZOOM FB Zoom key
    VK_NONAME FC Reserved for future use
    VK_PA1 FD PA1 key
    VK_OEM_CLEAR FE Clear key

    6.2.4 转移状态

    是否按下了位移键(Shift、Ctrl和Alt)或开关键(Caps Lock、Num Lock和Scroll Lock)。通过呼叫GetKeyState函数,您就能获得此信息。例如:

    iState = GetKeyState (VK_SHIFT) ;

    如果按下了Shift,则iState值为负(即设定了最高位置位)。如果Caps Lock键打开,则从

    iState = GetKeyState (VK_CAPITAL) ;

    6.3 字符消息

    6.3.1 四类字符消息

    字符

    死字符

    非系统字符

    WM_CHAR

    WM_DEADCHAR

    系统字符

    WM_SYSCHAR

    WM_SYSDEADCHAR

    WM_CHAR和WM_DEADCHAR消息是从WM_KEYDOWN得到的;而WM_SYSCHAR和WM_SYSDEADCHAR消息是从WM_SYSKEYDOWN消息得到的(我将简要地讨论一下什么是死字符)。

    6.3.2 消息顺序

    按键

    字符代码

    产生方法

    ANSI C控制字符

    Backspace

    0x08

    Ctrl-H

    

    Tab

    0x09

    Ctrl-I

    Ctrl-Enter

    0x0A

    Ctrl-J

    Enter

    0x0D

    Ctrl-M

    Esc

    0x1B

    Ctrl-[

     
    #include <Windows.h>
    #include <iostream>
    
    using namespace std;
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
    {
        static TCHAR szAppName[] = TEXT("WNDCLASS NAME");
        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("窗口创建失败!需要Windows NT!(传递消息为UNICODE)"), szAppName, MB_ICONERROR);
    
            return 0;
        }
    
        hwnd = CreateWindow(
            szAppName,
            TEXT("Hk_Mayfly"),
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            100,//宽度
            100,//高度
            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) {
    
        switch (message) {
        case WM_CHAR:
            switch (wParam) {
            case 'A':
                MessageBox(hwnd, TEXT("A键被按下!"), TEXT("TEST!"), NULL);
                break;
            case 0x61:
                MessageBox(hwnd, TEXT("a键被按下!"), TEXT("TEST!"), NULL);
                break;
            case '
    ':
                MessageBox(hwnd, TEXT("回车键被按下!"), TEXT("TEST!"), NULL);
                break;
            case '
    ':
                MessageBox(hwnd, TEXT("Enter--换行键被按下!"), TEXT("TEST!"), NULL);
                break;
            }
            
            return 0;
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        }
        return DefWindowProc(hwnd, message, wParam, lParam);
    }

     

    6.3.4 死字符消息

    Windows程序经常忽略WM_DEADCHAR和WM_SYSDEADCHAR消息。

    定义:在某些非U.S.英语键盘上,有些键用于给字母加上音调。因为它们本身不产生字符,所以称之为「死键」。

    工作方式:当使用者按下这个死键时,窗口消息处理程序接收到一个wParam等于音调本身的ASCII或者Unicode代码的WM_DEADCHAR消息。当使用者再按下可以带有此音调的字母键(例如A键)时,窗口消息处理程序会接收到WM_CHAR消息,其中wParam等于带有音调的字母「a」的ANSI代码。

    6.5 插入符号(不是光标)

    当您往程序中输入文字时,通常有一个底线、竖条或者方框来指示输入的下一个字符将出现在屏幕上的位置。这个标志通常称为「光标」,但是在Windows下写程序,您必须改变这个习惯。在Windows中,它称为「插入符号」。「光标」是指表示鼠标位置的那个位图图像。

    键盘操作实例--贪吃球球

    整体思路:

    • 在客户区绘制球球和食物
    • 捕获键盘消息,根据键盘操作改变球球的坐标(位置+大小)
    • 当食物与球球接触,食物消息,更新球球大小,随机产生另一个食物
    #include <Windows.h>
    #include <iostream>
    #include <time.h>
    #include <tchar.h>
    
    #define random(x) (rand()%x)
    
    using namespace std;
    
    bool Flag = TRUE;
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
    {
        static TCHAR szAppName[] = TEXT("WNDCLASS NAME");
        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("窗口创建失败!需要Windows NT!(传递消息为UNICODE)"), szAppName, MB_ICONERROR);
    
            return 0;
        }
    
        hwnd = CreateWindow(
            szAppName,
            TEXT("Hk_Mayfly"),
            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) {
        HDC hdc;
        PAINTSTRUCT ps;
        int i = 0;
        static int cxClient, cyClient, cxFood, cyFood, Count, cyChar;
        static POINT apt[2];
        srand((int)time(NULL));
        static HBRUSH hBrush;
        TCHAR szBuffer[100], szBuffer_A[100];
        TEXTMETRIC tm;
    
        switch (message) {
        case WM_CREATE:
            hdc = GetDC(hwnd);
            GetTextMetrics(hdc, &tm);
            cyChar = tm.tmHeight + tm.tmExternalLeading;
            hBrush = CreateSolidBrush(RGB(255, 0, 0));
            ReleaseDC(hwnd, hdc);
            return 0;
        case WM_SIZE:
            /*
            初始化球球位置为客户区正中心
            */
            if (Flag) {
                cxClient = LOWORD(lParam);
                cyClient = HIWORD(lParam);
    
                apt[0].x = cxClient / 2 - 50;
                apt[0].y = cyClient / 2 - 50;
                apt[1].x = cxClient / 2 + 50;
                apt[1].y = cyClient / 2 + 50;
    
                Flag = FALSE;
            }
            /*
            食物地址随机
            */
            cxFood = random(cxClient);
            cyFood = random(cyClient);
            return 0;
        case WM_KEYDOWN:
            /*
            按键控制球球的移动方向
            */
            switch (wParam) {
            case VK_UP:
                apt[0].y -= 5;
                apt[1].y -= 5;
                break;
            case VK_DOWN:
                apt[0].y += 5;
                apt[1].y += 5;
                break;
            case VK_LEFT:
                apt[0].x -= 5;
                apt[1].x -= 5;
                break;
            case VK_RIGHT:
                apt[0].x += 5;
                apt[1].x += 5;
                break;
            case VK_ESCAPE:
                wsprintf(szBuffer, TEXT("Congratulation!!! You Get %d"), Count);
                MessageBox(hwnd, szBuffer, TEXT("Grade"), 0x4L | 0x40L);
                exit(0);
            }
            /*
            客户区无效化
            */
            InvalidateRect(hwnd, NULL, TRUE);
            return 0;
        case WM_PAINT:
            /*
            判断球球是否吃到食物
            */
            if (apt[0].x <= cxFood - 5 && apt[1].x >= cxFood + 5 && apt[0].y <= cyFood - 5 && apt[1].y >= cyFood + 5) {
                /*
                生成新的食物,且食物不能在球球内
                */
                cxFood = random(cxClient);
                cyFood = random(cyClient);
                while (apt[0].x <= cxFood - 5 && apt[1].x >= cxFood + 5 && apt[0].y <= cyFood - 5 && apt[1].y >= cyFood + 5) {
                    cxFood = random(cxClient);
                    cyFood = random(cyClient);
                }
                /*
                球球长大了
                */
                apt[0].x -= 4;
                apt[1].x += 4;
                apt[0].y -= 4;
                apt[1].y += 4;
                ++Count;
            }
            hdc = BeginPaint(hwnd, &ps);
            SelectObject(hdc, GetStockObject(GRAY_BRUSH));
            //绘制球球
            Ellipse(hdc, apt[0].x, apt[0].y, apt[1].x, apt[1].y);
            SelectObject(hdc, hBrush);
            //绘制食物
            Ellipse(hdc, cxFood - 5, cyFood - 5, cxFood + 5, cyFood + 5);
    
            TextOut(hdc, cxClient - 150, 30 + cyChar * i++, szBuffer_A, wsprintf(szBuffer_A, TEXT("当前分数:%d"), Count));
            TextOut(hdc, cxClient - 150, 30 + cyChar * i++, szBuffer_A, wsprintf(szBuffer_A, TEXT("向上移动:↑")));
            TextOut(hdc, cxClient - 150, 30 + cyChar * i++, szBuffer_A, wsprintf(szBuffer_A, TEXT("向下移动:↓")));
            TextOut(hdc, cxClient - 150, 30 + cyChar * i++, szBuffer_A, wsprintf(szBuffer_A, TEXT("向左移动:←")));
            TextOut(hdc, cxClient - 150, 30 + cyChar * i++, szBuffer_A, wsprintf(szBuffer_A, TEXT("向右移动:→")));
            TextOut(hdc, cxClient - 150, 30 + cyChar * i++, szBuffer_A, wsprintf(szBuffer_A, TEXT("退出:ESC")));
            EndPaint(hwnd, &ps);
            return 0;
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        }
        return DefWindowProc(hwnd, message, wParam, lParam);
    }

    破解贪吃球球

    有兴趣可以看下:点击进入

  • 相关阅读:
    文件传输协议FTP
    过河问题 还是不会 去学请教一下 数学老师 -----
    ----堆栈 STL 函数库 ----有待补充
    UVa 101
    例题 5-1 STL
    课后题 3-3 水题
    第八届河南省省赛 A.挑战密室
    课后题--------求分子量-----Molar mass------
    课后题3-1
    ---------快排-----表排-----基数排序(桶排序)-----
  • 原文地址:https://www.cnblogs.com/Mayfly-nymph/p/11438354.html
Copyright © 2011-2022 走看看