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);
    }


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

  • 相关阅读:
    python项目实战三个小实例
    Python关键字及其用法
    python目录和文件的列表清单
    python文件的分类
    python文件操作r+,w+,a+,rb+,
    Python初探list
    python列表1
    office之Excel 你会用 Ctrl + E 吗?
    java用swing画可以行走的乌龟
    python删除列表元素
  • 原文地址:https://www.cnblogs.com/FWFC/p/8194013.html
Copyright © 2011-2022 走看看