第六章 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 !\n");

 

            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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值