zoukankan      html  css  js  c++  java
  • Windows应用程序对键盘与鼠标的响应

     

    编写程序: 设计一个窗口, 当单击鼠标左键时, 窗口中显示"LEFT BUTTON"; 当单击鼠标右键时, 窗口中显示"RIGHT BUTTON"; 当单击向上箭头键时, 窗口中显示"UP Key"; 当单击Ctrl键时, 窗口中显示"CTRL Key"; 当单击 Ctrl+A 键时, 窗口中显示"CTRL+A Key":

    程序主要代码如下:

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

    {

        int wmId, wmEvent;

        PAINTSTRUCT ps;

        HDC hDC;

        //TCHAR szHello[MAX_LOADSTRING];

        //LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);

        static char cLEFT[]="LEFT BUTTON";

        static char cRIGHT[]="RIGHT BUTTON";

        static char cUp[]="UP key";

        static char cCTRL[]="CTRL key";

        static char cCTRLA[]="CTRL+A key";

        static BOOL nUpKeyDown=FALSE, nCtrlKeyDown=FALSE, nCtrlAKeyDown=FALSE,nLeftDown=FALSE,nRightDown=FALSE;

        int xOrg,yOrg;

        switch (message)

        {

            case WM_KEYDOWN:

            {

                switch(wParam)

                {

                case VK_UP:

                    nUpKeyDown=TRUE;

                    break;

                case VK_CONTROL:

                    nCtrlKeyDown=TRUE;

                    break;

                

                default:

                    break;

                }

            }

                break;

     

            case WM_KEYUP:

                InvalidateRect(hWnd,NULL,TRUE);    //刷新用户区。

                break;

            case WM_CHAR:

                {

                        if(wParam==(65&VK_CONTROL))    

                        {

                            if(nCtrlKeyDown == TRUE)

                            {

                                nCtrlAKeyDown = TRUE;

                                nCtrlKeyDown = FALSE;

                            }

                        }

                        

                    }

                    break;

            case WM_LBUTTONDOWN:

                nLeftDown=TRUE;

                InvalidateRect(hWnd,NULL,TRUE);    //刷新用户区。

                break;

            case WM_RBUTTONDOWN:

                nRightDown=TRUE;

                InvalidateRect(hWnd,NULL,TRUE);    //刷新用户区。

                break;

     

            case WM_COMMAND:

                wmId = LOWORD(wParam);

                wmEvent = HIWORD(wParam);

                // Parse the menu selections:

                switch (wmId)

                {

                    case IDM_ABOUT:

                     DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);

                     break;

                    case IDM_EXIT:

                     DestroyWindow(hWnd);

                     break;

                    default:

                     return DefWindowProc(hWnd, message, wParam, lParam);

                }

                break;

            case WM_PAINT:

                hDC = BeginPaint(hWnd, &ps);

                // TODO: Add any drawing code here...

                RECT rt;

                GetClientRect(hWnd, &rt);

                xOrg=(rt.left+rt.right)/2;

                yOrg=(rt.top +rt.bottom)/2;

                if(nUpKeyDown == TRUE)

                {

                    TextOut(hDC,xOrg,yOrg,cUp,strlen(cUp));

                    nUpKeyDown = FALSE;

    (续前表)

    }

                else if(nCtrlAKeyDown == TRUE)

                {

                    TextOut(hDC,xOrg,yOrg,cCTRLA,strlen(cCTRLA));

                    nCtrlAKeyDown = FALSE;

                    nCtrlKeyDown = FALSE;

                }

                else if(nCtrlKeyDown == TRUE&&nCtrlAKeyDown == FALSE)

                {

                    TextOut(hDC,xOrg,yOrg,cCTRL,strlen(cCTRL));

                    nCtrlKeyDown = FALSE;

                }

                else if(nLeftDown == TRUE)

                {

                    TextOut(hDC,xOrg,yOrg,cLEFT,strlen(cLEFT));

                    nLeftDown = FALSE;

                }

                else if(nRightDown == TRUE)

                {

                    TextOut(hDC,xOrg,yOrg,cRIGHT,strlen(cRIGHT));

                    nRightDown = FALSE;

                }

          

                //DrawText(hdc, lpString, _tcsclen(lpString), &rt, DT_CENTER);

                EndPaint(hWnd, &ps);

                break;

            case WM_DESTROY:

                PostQuitMessage(0);

                break;

            default:

                return DefWindowProc(hWnd, message, wParam, lParam);

    }

    return 0;

    }

     

    编译并调试程序

    程序运行结果运行结果如下图:

    单击鼠标左键

    单击鼠标右键

    单击向上箭头

    单击Ctrl键

    单击Ctrl+A

    刚开始刷新客户区时使用

    InvalidateRect(hWnd,NULL,FALSE);

    结果导致背景客户区背景不更新,输出的文本重叠,了解了InvalidateRect()的使用方式后,将语句改为

    InvalidateRect(hWnd,NULL,TRUE);

    即成功解决了问题;

  • 相关阅读:
    人脸识别算法初次了解
    白话经典算法系列之二 直接插入排序的三种实现
    常见浏览器兼容性问题与解决方式
    MP3的频率、比特率、码率与音质的关系
    程序猿接私活经验总结,来自csdn论坛语录
    Java虚拟机工作原理具体解释
    簡單SQL存儲過程實例
    全栈JavaScript之路(七)学习 Comment 类型节点.
    strdup函数的使用方法
    POJ 2823 Sliding Window 【单调队列】
  • 原文地址:https://www.cnblogs.com/leftshine/p/5698617.html
Copyright © 2011-2022 走看看