第六章 Windows应用程序对键盘与鼠标的响应 P121 6-8

基于键盘与鼠标应用的程序设计

一、实验目的

1.掌握键盘与鼠标在应用程序中的消息响应机制。

 

二、实验内容及步骤

 实验任务

1.熟悉键盘的消息响应;

2.熟悉鼠标的消息响应;

 实验内容

   设计一个窗口,再该窗口中练习键盘的响应,要求如下:

(1)单机键盘上的向上箭头时,窗口中显示“You had hitted the up key”;

(2)单击Shift键时,窗口中显示“You had hitted the Shift key”;

(3)单击Ctrl键时,窗口中显示“You had hitted the Ctrl key”;

(4)单击Ctrl+A键时,窗口中显示“You had hitted the Ctrl A key”;

(5)单击Shift+B键时,窗口中显示“You had hitted the Shift B key”;

程序代码:

#include<windows.h>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam);
BOOL InitWindowsClass(HINSTANCE hInstance);
BOOL InitWindows(HINSTANCE hInstance,int nCmdShow); 
HWND hWndMain;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,

  int nCmdShow)
{
MSG Message;
if(!InitWindowsClass(hInstance))    return FALSE;
 
if(!InitWindows(hInstance,nCmdShow))  return FALSE;


while(GetMessage(&Message,0,0,0))//消息循环
{
           TranslateMessage(&Message);
           DispatchMessage(&Message);
}
return Message.wParam;
}


long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)
{
HDC hDC;   //定义指向设备上下文的句柄
PAINTSTRUCT ps; //定义指向包含绘图信息的结构体变量
    HPEN hPen;                             //定义画笔句柄
HBRUSH hBrush;                          //定义画刷句柄

//以下定义输出的字符串
static char cUp[]="You had hitted the UP key";
static char cCtrl[]="You had hitted the Ctrl key";
static char cShift[]="You had hitted the SHIFT key";
static char cCtrl_A[]="You had hitted the CTRL A key";
static char cShift_B[]="You had hitted the SHIFT B key";

//下面定义并初始化按键标志变量
static BOOL nUpKeyDown=FALSE,
           nShiftKeyDown=FALSE,
           nCtrlKeyDown=FALSE,
           nCtrlAKeyDown=FALSE,
           nShiftBKeyDown=FALSE;
switch(iMessage)
{
case WM_KEYDOWN:
           {
                    switch(wParam)
                    {
                    case VK_UP:               //当按上箭头键时,变量置为真

                 nUpKeyDown = TRUE;                   break;
                    case VK_SHIFT:                               //当按Shift键时,变量置为真
                             nShiftKeyDown = TRUE;   break;

                    case VK_CONTROL:                    //当按Control键时,变量置为真
                             nCtrlKeyDown = TRUE;     break;
                    default:                                    break;
                    }
           }

           break;
case WM_KEYUP:
InvalidateRect(hWnd,NULL,FALSE);      //人为    方框覆盖       // InvalidateRect(hWnd,NULL,1);刷新用户区
// InvalidateRect(hWnd,NULL,0);不擦除背景  
break;
case WM_CHAR:
           if(wParam==(65&VK_CONTROL))     
           {
         if(nCtrlKeyDown == TRUE)
                    {
         nCtrlAKeyDown = TRUE;   
nCtrlKeyDown = FALSE;
            }
           }

           else if(wParam==98||wParam==66)        //当按下b键时
           {
              if(nShiftKeyDown == TRUE)                //检查Shift键是否处于按下状态。
                    {
                             nShiftBKeyDown = TRUE;  //当Shift键按下时,变量置为真
                             nShiftKeyDown = FALSE;

                    }
           
           break;
case WM_PAINT:                                                      //处理绘图消息.
          hDC=BeginPaint(hWnd,&ps);
           hBrush = (HBRUSH)GetStockObject(WHITE_BRUSH); //创建 白画刷。
           hPen = (HPEN)GetStockObject(WHITE_PEN);                 //创建白画笔。
           SelectObject(hDC,hPen);                                   //选入白画刷
           SelectObject(hDC,hBrush);                      //选入白画笔
           SetTextColor(hDC,RGB(255,0,0));                   //设置字体颜色为红色。

 

 

 

           //输出信息。     
if(nUpKeyDown == TRUE)
           {
               Rectangle(hDC,0,0,300,200);
                    TextOut(hDC,0,0,cUp,strlen(cUp));
                    nUpKeyDown = FALSE;
           }


           else if(nCtrlAKeyDown == TRUE)
         {

                    Rectangle(hDC,0,0,300,200);
                    TextOut(hDC,0,100,cCtrl_A,strlen(cCtrl_A))
                    nCtrlAKeyDown = FALSE;
                    nCtrlKeyDown = FALSE;
           }


           else if(nCtrlKeyDown == TRUE&&nCtrlAKeyDown == FALSE)
           {
                    Rectangle(hDC,0,0,300,200);
                    TextOut(hDC,0,60,cCtrl,strlen(cCtrl));
                    nCtrlKeyDown = FALSE;
          }

          else if(nShiftBKeyDown == TRUE
         {
                    Rectangle(hDC,0,0,300,200);
                    TextOut(hDC,0,0,cShift_B,strlen(cShift_B));
                    nShiftBKeyDown = FALSE;
                    nShiftKeyDown = FALSE;   }

           else if(nShiftBKeyDown == FALSE&&nShiftKeyDown == TRUE)
           {
                    Rectangle(hDC,0,0,300,200);
                   TextOut(hDC,0,0,cShift,strlen(cShift));
                    nShiftKeyDown = FALSE;  

           }

         else        //删除画笔和画刷
           {
            printf("Input Error !
");
            break;
}
                   DeleteObject(hPen);
                    DeleteObject(hBrush);
                    EndPaint(hWnd,&ps);
               break;

case WM_DESTROY:

 

           PostQuitMessage(0);   

 

return 0;

 

default:      

 

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

 

}

 

return 0;

 

}

 

BOOL InitWindows(HINSTANCE hInstance,int nCmdShow)

 

{

 

HWND hWnd;

 

hWnd=CreateWindow("6_3", 

 

                          "键盘实例程序",

 

                           WS_OVERLAPPEDWINDOW,

 

                           CW_USEDEFAULT,

 

                        0,

 

                           CW_USEDEFAULT,

 

                        0,

 

                        NULL,

 

                           NULL,

 

                           hInstance,

 

                           NULL);

 

if(!hWnd)  

 

return FALSE;

 

hWndMain=hWnd;

 

ShowWindow(hWnd,nCmdShow);        

 

UpdateWindow(hWnd);

 

return TRUE;

 

}

 

BOOL InitWindowsClass(HINSTANCE hInstance)  

 

{        

 

WNDCLASS WndClass;

 

    WndClass.cbClsExtra=0;

 

WndClass.cbWndExtra=0;

 

    WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH)); WndClass.hCursor=LoadCursor(NULL,IDC_ARROW); WndClass.hIcon=LoadIcon(NULL,"END");

 

WndClass.hInstance=hInstance;

 

WndClass.lpfnWndProc=WndProc;

 

WndClass.lpszClassName="6_3";

 

WndClass.lpszMenuName=NULL;

 

WndClass.style=CS_HREDRAW|CS_VREDRAW;

 

return RegisterClass(&WndClass);

 

    WndClass.style=0;

 

}

 

  

程序运行结果

 

 

 

三、实验结果

  通过本次试验我了解了基于键盘与鼠标应用的程序设计,熟悉了键盘的消息响应以及鼠标的消息响应,了解了关于窗口的相关操作。

原文地址:https://www.cnblogs.com/wangprince2017/p/9236043.html