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


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

原文地址:https://www.cnblogs.com/FWFC/p/8194013.html