第9章鼠标程序编程基础精选PPT.ppt
第9章鼠标程序编程基础第1页,本讲稿共15页9.1鼠标概述 鼠标作为一种定位输入设备,在Windows中得到了广泛的应用。通过鼠标的键击、双击和拖动功能,用户可以很容易地操作基于Windows图形界面的应用程序。常见鼠标有单键、双键、三键等几种类型,以重视与网络浏览的五健鼠标在Windows 2000系统中也得到支持。nButtons=GetSystemMetrics(SM_CMOUSEBUTTONS);/可以反回当前鼠标上键的个数SwapMouseButton(TRUE);/用于交互鼠标左键和右键的功能SystemParametersInfo(SPI_SETMOUSESPEED,0,20,0);/可以获取和设置鼠标的速度uTime=GetDoubleClickTime();/获取鼠标的双击间隔SetDoubleClickTime(300);/设置鼠标的双击间隔第2页,本讲稿共15页9.1.3鼠标消息 当鼠标事件发生后,系统将产生的鼠标消息发送到相应的应用程序的消息队列。一般来讲,鼠标消息只会发送给热点下面的程序窗口,而不管该窗口是否是活动的。鼠标消息有两类:客户区鼠标消息非客户区鼠标消息与鼠标有关的操作鼠标键双击捕获鼠标鼠标响应程序实例 MouseClick.c 第3页,本讲稿共15页9.1.4 显示区鼠标消息 Windows 2000系统中,共定义了13种客户区鼠标消息:鼠标键按下释放双击左键WM_LBUTTONDOWNWM_LBUTTONUPWM_LBUTTONDBLCLK中键WM_MBUTTONDOWNWM_MBUTTONUPWM_MBUTTONDBLCLK右键WM_RBUTTONDOWNWM_RBUTTONUPWM_RBUTTONDBLCLKX键WM_XBUTTONDOWNWM_XBUTTONUPWM_XBUTTONDBLCLK鼠标移动WM_MOUSEMOVEx=LOWORD(lParam);/鼠标发生时的x坐标位置y=HIWORD(lParam);/鼠标发生时的y坐标位置第4页,本讲稿共15页9.1.4 显示区鼠标消息 鼠标消息的wParam中则存放着鼠标虚拟键的组合:MK_LBUTTONMK_MBUTTONMK_RBUTTONMK_SHIFTMK_CONTROL例如:判别当某鼠标按下同时SHIFT组合键是否也同时按下了?if(wParam&MK_SHIFT)!=0)cout“Shift键也同时按下了”;if(wParam&MK_LBUTTON)!=0&(wParam&MK_CONTROL)!=0)cout“鼠标左键和Ctrl键同时按下了”第5页,本讲稿共15页9.1.6 鼠标消息的处理例子 CONNECT第6页,本讲稿共15页9.3 非显示区域鼠标消息 对应于每条客户区,鼠标消息都有一条非客户区鼠标消息,只不过消息的名称稍有不同如WM_LBUTTONDOWN对应于WM_NCLBUTTONDOWN。另外,包含在非客户区鼠标消息lParam参数中的坐标信息是基于屏幕坐标系的,即坐标原点在窗口屏幕的左上角。第7页,本讲稿共15页9.4 显示区域中的名种测试程序 9.4.1 命中测试程序CHECKER19.4.3 在CHECKER1种加入键盘界面后的程序CHECKER2第8页,本讲稿共15页9.5 子窗口的基本概念9.5.1 用子窗口实现CHECKER程序CHECKER3表9-5 CreateWindow 的11个参数参数主窗口子窗口窗口类“Checker3”“Checker3_Child”窗口标题“Check3.”NULL窗口式样WS_OVERLAPPEDWINDOWWS_CHILDWINDOW|WS_VISIBLE水平地址CW_USEDEFAULT0垂直地址CW_USEDEFAULT0宽度CW_USEDEFAULT0高度CW_USEDEFAULT0父窗口代码NULLHwnd功能表代号NULL(HMENU)(y8|x)子窗口ID执行实体代号hInstance(HINSTANCE)(GetWindowLong(hwnd,GWL_HINSTANCE)额外参数NULLNULL第9页,本讲稿共15页9.5 子窗口的基本概念可以通过下面的调用来获得一个特定子窗口的ID:idChild=GetWindowLong(hwndChild,GWL_ID);其中,hwndChild是子窗口的句柄,GWL_ID识别字表示函数返回子窗口的ID.如果知道父窗口的句柄,和子窗口的ID,则下面函数可以获得子窗口的句柄:hwndChild=GetDlgItem(hwndParent,idChild);第10页,本讲稿共15页9.6鼠标键双击(补充)在默认的情况下,Win32应用程序并不支持鼠标键的双击,只有在注册窗口类时注明该窗口类具有CS_DBLCLKS风格后才支持。wndclass.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;例如:双击鼠标左键会产生下面的一系列鼠标消息:(1)WM_LBUTTONDOWN(2)WM_LBUTTONUP(3)WM_LBUTTONDBLCLK(4)WM_LBUTTONUP在默认情况下,系统设定的双击时间间隔是500毫秒,使用函数SetDoubleClickTime可以改变这一值。第11页,本讲稿共15页捕获鼠标 在通常情况下,只有当鼠标光标位于某一窗口的客户区或者非客户区时,该窗口的窗口过程才能接收到鼠标消息,甚至当鼠标热点不在此窗口上方时,也能捕获到鼠标消息,这就涉及到鼠标捕获的问题。SetCapture(hWnd);指定另外一个窗口捕获鼠标或者使用ReleaseCapture函数,都会使窗口失去对鼠标消息的捕获。ReleaseCapture();函数GetCapture能返回正在捕获鼠标消息的窗口句柄:if(hWnd=GetCapture()第12页,本讲稿共15页9.7 计时器(补充)在Windows应用程序中,计时器是性能非常好的一种输入设备,它按照预定的时间间隔向用户的程序发送一条计时器消息。1 SetTimer 此函数用于设置和指定时间的间隔值UINT_PTR SetTimer(HWND hWnd,UINT_PTR nIDEvent,UINT uElapse,TIMERPROC lpTimerFunc);2 KillTimer 清楚建立的计时器,并清空程序消息队列中的WM_TIMER消息。BOOL KillTimer(HWND hWnd,UINT_PTR uIDEvent);第13页,本讲稿共15页9.7.1 计时器和计数器消息 在Windows应用程序中,计时器是性能非常好的一种输入设备,它按照预定的时间间隔向用户的程序发送一条计时器消息。计时器是基于硬件计时器中断的,有系统分配和管理的装置。每到一定的时间间隔,系统就会把计时器消息WM_TIMER发送到与计时器相关联的窗口的消息队列中。计时器消息WM_TIMER按指定的时间间隔发送到程序的消息队列中,其参数wParam是计时器唯一的标识符(整型值),lParam参数为零。另外,与WM_PAINT消息相似,Windows也不能持续向消息队列中放入多个WM_TIMER消息,而是将多余的WM_TIMER消息组合成一个消息。因此,在有些情况下,程序可能丢失某些WM_TIMER消息。当然,程序可以同时拥有多于一个的计时器。第14页,本讲稿共15页9.7 计时器实例程序(补充)计时器程序实例 RunningBall.c 演示计时器的设置和消息处理。第15页,本讲稿共15页