zoukankan      html  css  js  c++  java
  • 第6章 键盘——KeyView1

    #define _CRT_SECURE_NO_WARNINGS
    #define _CRT_NON_CONFORMING_SWPRINTFS
    #include<Windows.h>
    #include<tchar.h>
    
    LRESULT CALLBACK WindowProc(HWND,UINT,WPARAM,LPARAM);
    
    int WINAPI WinMain(
        HINSTANCE hInstance,
        HINSTANCE hPrevInstance,
        LPSTR lpCmdLine,
        int iCmdShow
        )
    {
        TCHAR szAppName[] = TEXT("KeyView1");
        HWND hwnd;
        MSG msg;
        WNDCLASSEX wndClass;
    
        wndClass.cbSize = sizeof(WNDCLASSEX);
        wndClass.cbClsExtra = 0;
        wndClass.cbWndExtra = 0;
        wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
        wndClass.hCursor = LoadCursor(NULL,IDC_ARROW);
        wndClass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
        wndClass.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
        wndClass.hInstance = hInstance;
        wndClass.lpfnWndProc = WindowProc;
        wndClass.lpszClassName = szAppName;
        wndClass.lpszMenuName = NULL;
        wndClass.style = CS_VREDRAW|CS_HREDRAW|CS_OWNDC;
    
        if(!RegisterClassEx(&wndClass))
        {
            MessageBox(NULL,TEXT("it requires Windows NT!"),TEXT("TIPS"),0);
            return -1;
        }
    
        hwnd = CreateWindow(
            szAppName,TEXT("KeyView1 Window"),
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
            NULL,NULL,hInstance,NULL
            );
    
        ShowWindow(hwnd,iCmdShow);
        UpdateWindow(hwnd);
    
        while(GetMessage(&msg,0,0,0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    
        return msg.wParam;
    }
    
    LRESULT CALLBACK WindowProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
    {
        static TCHAR szHeading[] = TEXT("Message     Key         Char     Repeat Scan Ext Alt Prev Tran");
        static TCHAR szUndLine[] = TEXT("_______     ___         ____     ______ ____ ___ ___ ____ ____");
        static TCHAR szMessage[][20] = {
            TEXT("WM_KEYDOWN"),TEXT("WM_KEYUP"),
            TEXT("WM_CHAR"),TEXT("WM_DEADCHAR"),
            TEXT("WM_SYSKEYDOWN"),TEXT("WM_SYSKEYUP"),
            TEXT("WM_SYSCHAR"),TEXT("WM_SYSDEADCHAR")
        };
        static TCHAR szYesNo[][5] = {
            TEXT("NO"),TEXT("YES")
        };
        static TCHAR szDownUp[][6] = {
            TEXT("UP"),TEXT("DOWN")
        };
        static TCHAR szFormat[] = TEXT("%11s %2d %8s %6X %c %6d %4d %3s %3s %4s %4s");
        static int cxClient,cyClient,cxChar,cyChar,cyLines;
        static PMSG pmsg;
        TCHAR szBuffer[100],szKeyName[32];
        HDC hdc;
        PAINTSTRUCT ps;
        TEXTMETRIC tm;
        RECT rect;
        int iType;
        switch(message)
        {
        case WM_CREATE:
        case WM_DISPLAYCHANGE:
            GetClientRect(hwnd,&rect);
            hdc = GetDC(hwnd);
            SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));
            SetBkMode(hdc,TRANSPARENT);
            GetTextMetrics(hdc,&tm);
            cxChar = tm.tmAveCharWidth;
            cyChar = tm.tmHeight+tm.tmExternalLeading;
            ReleaseDC(hwnd,hdc);
            cxClient = rect.right;
            cyClient = rect.bottom;
        case WM_SIZE:
            if(message == WM_SIZE)
            {
                cxClient = LOWORD(lParam);
                cyClient = HIWORD(lParam);
            }
            cyLines = cyClient / cyChar;
            if(pmsg)
                free(pmsg);
            pmsg = (PMSG)malloc(sizeof(MSG)*cyLines);
            if(!pmsg)
            {
                MessageBox(NULL,TEXT(" Fail to malloc!"),TEXT("TIPS"),0);
                return -1;
            }
            memset(pmsg,0,sizeof(MSG)*cyLines);
            break;
        case WM_KEYDOWN:
        case WM_KEYUP:
        case WM_CHAR:
        case WM_DEADCHAR:
        case WM_SYSKEYDOWN:
        case WM_SYSKEYUP:
        case WM_SYSCHAR:
        case WM_SYSDEADCHAR:
            for(int i = cyLines - 2;i >= 0 ;i--)
            {
                pmsg[i+1] = pmsg[i];
            }
            pmsg[0].lParam = lParam;
            pmsg[0].message = message;
            pmsg[0].wParam = wParam;
            GetClientRect(hwnd,&rect);
            rect.top = cyChar;
            ScrollWindow(hwnd,0,cyChar,&rect,&rect);
            break;
        case WM_PAINT:
            hdc = BeginPaint(hwnd,&ps);
            TextOut(hdc,0,0,szHeading,_tcslen(szHeading));
            TextOut(hdc,0,0,szUndLine,_tcslen(szUndLine));
            for(int i = 0;i<cyLines;i++)
            {
                if(pmsg[i].wParam == 0)break;
                iType = pmsg[i].message == WM_CHAR||pmsg[i].message == WM_DEADCHAR||pmsg[i].message == WM_SYSCHAR||pmsg[i].message == WM_SYSDEADCHAR;
                GetKeyNameText(pmsg[i].lParam,szKeyName,sizeof(szKeyName)/sizeof(TCHAR));
                TextOut(
                    hdc,0,(i+1)*cyChar,
                    szBuffer,
                    _stprintf(szBuffer,szFormat,
                    szMessage[pmsg[i].message - WM_KEYFIRST],pmsg[i].wParam,iType?TEXT(" "):szKeyName,pmsg[i].wParam,iType?pmsg[i].wParam:TEXT(' '),LOWORD(pmsg[i].lParam),HIWORD(pmsg[i].lParam)&0xFF,szYesNo[pmsg[i].lParam&0x00800000],szYesNo[pmsg[i].lParam&0x20000000],szDownUp[pmsg[i].lParam&0x40000000],szDownUp[pmsg[i].lParam&0x80000000])
                    );
            }
            EndPaint(hwnd,&ps);
            break;
        case WM_DESTROY:
            if(pmsg)
                free(pmsg);
            PostQuitMessage(0);
            break;
        }
        return DefWindowProc(hwnd,message,wParam,lParam);
    }


    代码是自己写的,和书上的不大一样,但大同小异。

  • 相关阅读:
    【郑轻邀请赛 G】密室逃脱
    【郑轻邀请赛 C】DOBRI
    【郑轻邀请赛 F】 Tmk吃汤饭
    【郑轻邀请赛 I】这里是天堂!
    【郑轻邀请赛 B】base64解密
    【郑轻邀请赛 A】tmk射气球
    【郑轻邀请赛 H】 维克兹的进制转换
    解决adb command not found以及sdk环境配置
    adb shell 命令详解,android, adb logcat
    Unexpected exception 'Cannot run program ... error=2, No such file or directory' ... adb'
  • 原文地址:https://www.cnblogs.com/FWFC/p/8194013.html
Copyright © 2011-2022 走看看