第六章 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;
}
程序运行结果:





三、实验结果
通过本次试验我了解了基于键盘与鼠标应用的程序设计,熟悉了键盘的消息响应以及鼠标的消息响应,了解了关于窗口的相关操作。
第六章 Windows应用程序对键盘与鼠标的响应 P121 6-8的更多相关文章
- 第六章 Windows应用程序对键盘与鼠标的响应
- Windows应用程序对键盘与鼠标的响应
编写程序: 设计一个窗口, 当单击鼠标左键时, 窗口中显示"LEFT BUTTON"; 当单击鼠标右键时, 窗口中显示"RIGHT BUTTON"; 当单击 ...
- 鸟哥的linux私房菜——第十六章学习(程序管理与 SELinux 初探)
第十六章.程序管理与 SE Linux 初探 在 Linux 系统当中:"触发任何一个事件时,系统都会将他定义成为一个程序,并且给予这个程序一个 ID ,称为 PID,同时依据启发这个程序的 ...
- WPF嵌入Unity3D之后,unity3D程序的键盘和鼠标事件无法触发(3D程序的焦点无法激活)的解决方案
目前最通用的客户端调用3D的方式,就是WPF程序通过Process启动Unity3D的exe进程,直接上代码: //开启3D进程 internal void Create3DProcess(strin ...
- vc程序设计--对键盘与鼠标的响应(1)
// WindowsProject2.cpp : 定义应用程序的入口点. // /** * 当按下CTRL键时输出信息:CTRL键被压下 * 当按下K键时输出信息:K键被压下 * 当按下CTRL+K键 ...
- 【windows核心编程】 第六章 线程基础
Windows核心编程 第六章 线程基础 欢迎转载 转载请注明出处:http://www.cnblogs.com/cuish/p/3145214.html 1. 线程的组成 ① 一个是线程的内核 ...
- 第六章第一个linux个程序:统计单词个数
第六章第一个linux个程序:统计单词个数 从本章就开始激动人心的时刻——实战,去慢慢揭开linux神秘的面纱.本章的实例是统计一片文章或者一段文字中的单词个数. 第 1 步:建立 Linu x 驱 ...
- 利用钩子函数来捕捉键盘响应的windows应用程序
一:引言: 你也许一直对金山词霸的屏幕抓词的实现原理感到困惑,你也许希望将你的键盘,鼠标的活动适时的记录下来,甚至你想知道木马在windows操作系统是怎样进行木马dll的加载的…..其实这些都是用到 ...
- 《算法》第六章部分程序 part 8
▶ 书中第六章部分程序,加上自己补充的代码,包括单纯形法求解线性规划问题 ● 单纯形法求解线性规划问题 // 表上作业法,I 为单位阵,y 为对偶变量,z 为目标函数值 // n m 1 // ┌── ...
随机推荐
- VirtualBox只能生成32位虚拟机
/************************************************************************* * VirtualBox只能生成32位虚拟机 * ...
- 都是用 DllImport?有没有考虑过自己写一个 extern 方法?
你做 .NET 开发的时候,一定用过 DllImport 这个特性吧,这货是用于 P/Invoke (Platform Invoke, 平台调用) 的.这种 DllImport 标记的方法都带有一个 ...
- android如何改变应用程序安装后显示的图标
修改 res目录下所有ic_launcher.png 为你想显示的图标
- Python3.x datetime模块
1.时间间隔(timedelta) 指定时间长度之间计算差值 #!/usr/bin/env python __author__ = 'realtiger' """ @ve ...
- mongodb启用Profiling定位问题
建议使用方法三,最简单且容易查看 一:如果mongodb已经运行了很长时间,此时查看mongod.log很大,没法打开查看相应信息 #ps -ef|grep mongod 找到相应的mongod的进程 ...
- const_cast
函数原型: const_cast < type-id > ( expression ) 去掉const属性:const_cast<int*> (&num),常用,因为不 ...
- Web验证方式(4)--JWT
OAuth协议中说到的AccessToken可以是以下两种: 1.任意只起到标识作用的字符串:这种情况下Resource Server处理请求时需要去找Authorization Server获取用户 ...
- Axis开发Web Service
可以自动生成代码的 一.Axis环境的安装 1.安装环境 J2SE SDK 1.4,Tomcat 5.0,eclipse 3.2. 2.到 http://xml.apache.org 网站下载Axis ...
- 全是干货!UI设计的30条黄金准则!
http://www.wex5.com/portfolio-items/js-1/ 全是干货!UI设计的30条黄金准则! 总的来说,好的UI界面有几个特征:简洁.便利.目标明确.人性化.字面上看这 ...
- emacs之配置8,gdb调试设置
emacsConfig/gdb-setting.el (global-set-key [(f5)] 'gud-go) (global-set-key [(f7)] 'gud-step) (global ...