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

一、实验目的

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;

}

程序运行结果

三、实验结果

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

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

  1. 第六章 Windows应用程序对键盘与鼠标的响应

  2. Windows应用程序对键盘与鼠标的响应

      编写程序: 设计一个窗口, 当单击鼠标左键时, 窗口中显示"LEFT BUTTON"; 当单击鼠标右键时, 窗口中显示"RIGHT BUTTON"; 当单击 ...

  3. 鸟哥的linux私房菜——第十六章学习(程序管理与 SELinux 初探)

    第十六章.程序管理与 SE Linux 初探 在 Linux 系统当中:"触发任何一个事件时,系统都会将他定义成为一个程序,并且给予这个程序一个 ID ,称为 PID,同时依据启发这个程序的 ...

  4. WPF嵌入Unity3D之后,unity3D程序的键盘和鼠标事件无法触发(3D程序的焦点无法激活)的解决方案

    目前最通用的客户端调用3D的方式,就是WPF程序通过Process启动Unity3D的exe进程,直接上代码: //开启3D进程 internal void Create3DProcess(strin ...

  5. vc程序设计--对键盘与鼠标的响应(1)

    // WindowsProject2.cpp : 定义应用程序的入口点. // /** * 当按下CTRL键时输出信息:CTRL键被压下 * 当按下K键时输出信息:K键被压下 * 当按下CTRL+K键 ...

  6. 【windows核心编程】 第六章 线程基础

    Windows核心编程 第六章 线程基础 欢迎转载 转载请注明出处:http://www.cnblogs.com/cuish/p/3145214.html 1. 线程的组成 ①    一个是线程的内核 ...

  7. 第六章第一个linux个程序:统计单词个数

    第六章第一个linux个程序:统计单词个数 从本章就开始激动人心的时刻——实战,去慢慢揭开linux神秘的面纱.本章的实例是统计一片文章或者一段文字中的单词个数.  第 1 步:建立 Linu x 驱 ...

  8. 利用钩子函数来捕捉键盘响应的windows应用程序

    一:引言: 你也许一直对金山词霸的屏幕抓词的实现原理感到困惑,你也许希望将你的键盘,鼠标的活动适时的记录下来,甚至你想知道木马在windows操作系统是怎样进行木马dll的加载的…..其实这些都是用到 ...

  9. 《算法》第六章部分程序 part 8

    ▶ 书中第六章部分程序,加上自己补充的代码,包括单纯形法求解线性规划问题 ● 单纯形法求解线性规划问题 // 表上作业法,I 为单位阵,y 为对偶变量,z 为目标函数值 // n m 1 // ┌── ...

随机推荐

  1. linux下文件解压

    这几天要学THINKPHP框架了,于是从网上下载了一个压缩包,后缀是.zip的,解压方法为 unzip ###.zip 随便把linux下的.rar方法也写下来,这两个都不常见. unrar    e ...

  2. 替换国内yum源以及pip源

    因为一些原因,不论是网络还是啥啥啥的原因,国外的源访问时不时的很慢,这时候我们就可以将国外的源替换为国内源,提高下载速度. yum源替换 环境:centos7(如果你的发行版本不是这个,此方法不保证能 ...

  3. Jmeter 接口测试间的引用

    Jmeter做接口测试,几乎里面所有的业务实现都依赖登录,我竟然傻不垃圾的每个CASE都写了登录  ......请原谅我的笨 右键 线程组 --> 添加  --> 逻辑控制器 --> ...

  4. MySql 中的 FIND_IN_SET 的使用和相关问题

    MySql 中的 FIND_IN_SET 的使用和相关问题 QQ 群里有人讨论如果在 category_ids 中打开 12 的分类,而 category_ids 中的 ID 是以 逗号分开的. 使用 ...

  5. Centos下telnet的安装和配置

    Centos下telnet的安装和配置 首先为Centos配置地址(192.168.0.1/24) 一.查看本机是否有安装telnetrpm -qa | grep telnetrpm -q telne ...

  6. 试玩mpvue,用vue的开发模式开发微信小程序

    mpvue,美团开源的vue文件转换成小程序的文件格式,今天玩了一下练练手 mpvue文档地址: http://mpvue.com/mpvue/#_1 暂时有几个点需要注意的: 1.新增页面需要重新启 ...

  7. 【linux】查看linux版本和内核版本

    查看linux版本:uname -r 查看linux版本内核:lsb_release -a

  8. 【python】使用Python中的urlparse、urllib抓取和解析网页

    一.解析URL 函数urlparse(urlstring [, default_scheme [, allow_fragments]])的作用是将URL分解成不同的组成部分,它从urlstring中取 ...

  9. 安装memcached服务 和 php 安装memcache扩展

    这是所有的命令,至于哪个命令是干嘛的自己悟去吧  ,顺便穿插一些知识点 安装libevent cd /home/ wget  http://www.monkey.org/~provos/libeven ...

  10. 峰Spring4学习(6)spring AOP的应用例子

    一.AOP简介: 二.AOP实例: 三.使用的例子 需求:在student添加的前后,打印日志信息: 0)spring AOP需要引用的jar包: 1)StudentService.java接口: p ...