键盘和鼠标编程
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 具体过程如下: • (1) 拖曳操作开始 • 大 多 数 的 组 件 具 有 DragMode 属 性 , 表 示 开 始 拖 曳 操 作 的 方 式 。 DragMode 属 性 的 缺 省 值 为 dmManual, 也 就 是 要 在 被 拖 动 组 件 的 OnMouseDown事件的处理过程中调用BeginDrag过程才开始拖曳操作。 如果将 DragMode 属性设置为 dmAutomation,则鼠标左键在被拖动组 件上按下后就自动开始拖曳操作。 • (2) 接受拖曳操作 • 当拖动一个组件经过第二个组件的时候,第二个组件会产生一个 OnDragOver事件。在该事件的处理过程中有一个布尔类型的参数,该 参数的设置直接影响是否产生OnDragDrop事件。 • 一般情况下,在OnDragOver事件的处理过程中,根据参数Source判断 拖曳操作的源。如果是可以接受的源,则将Accept参数设置为True; 否则,将其设置为False。 • (3) 处理拖曳操作 • 在第二个组件的OnDragDrop事件的处理过程中,根据拖曳操作的源做 一些相应的处理。 • (4) 拖曳操作结束 • 拖曳操作完成后释放鼠标左键,会在第一个组件中产生一个 OnEndDrag事件,可以根据参数Target的数值进行相应的处理。如果 参数Target的值为nil,则表示拖曳操作没有被接受;如果Target的值不 为nil,则Target的值就是接受拖曳操作的组件。
2.OnKeyPress
• 当按下键盘上的一个字符键,如字母键、 数字键等会产生一个 OnKeyPress 事件, 但是单独按下功能键(F1~F12)、Ctrl键、 Shift 键或 Alt 键等,不会产生 OnKeyPress 事件。
• 下面的一段代码说明了OnKeyPress事件的用法: • procedureTForm1.FormKeyPress(Sender:TObject ;varKey:Char); • begin • //显示按下的键 • MessageDlg(' 你 按 下 了 ' + Key+' 键 。 ',mtInformation,[mbOK],0); • End;
键盘和鼠标编程
• 事件可分为用户事件和系统事件两类。用户事 件比较好理解,它用于响应应用程序的用户的 动作。单击鼠标,就会调用一个 OnMouseDown事件。移动鼠标,就会响应一 个OnMouseMove事件。敲击键盘,会响应一个 OnKeyDown事件。系统事件是由操作系统产生 的。典型的系统事件是定时器的OnTimer事件。 不管事件以何种方式调用,Delphi总是先看事 件处理器是否添加了代码,如果有代码,代码 将被执行,否则什么也不发生。
• (4)选中Memo组件并在对象编辑器中为其添 加OnDragOver事件和OnDragDrop事件的处理 • 过程如下: • procedureTForm1.Memo1DragOver(Sender,Sourc e:TObject;X,Y:Integer; • State:TDragState;varAccept:Boolean); • begin • ifSourceIsTEditthen • Accept:=True;//可以接受拖动操作 • • end;
• 在事件驱动编程中,Delphi处清楚事件 发生的顺序非常重要。清楚了事件发生 的顺序后可以避免出现一些竟想不到的 结果。例如,单击按钮,首先响应的是 OnEnter事件,然后响应OnMouseDown事 件,最后触发的是Onclick事件。
检测功能键
• 在 组 件 的 OnKeyDown、OnKeyUp、 OnMouseDown 和 OnMouseUp等事件的处理过程 中 , 有 一 个 TShiftState 类 型 的 变 量 Shift, TShiftState类型定义如下: • typeTShiftState=setof(ssShift,ssAlt,ssCtrl,ssLeft,ss Right,ssMiddle,ssDouble); • 所以根据Shift的值就可以判断当键盘上的键按 下时Shift、Alt和Ctrl键的状态,或者按下鼠标左 键、中键时的状态或者是否双击了按键。当然, 如果有OnMouseDown事件发生了,而又不是按 下左键和中键,则按下的一定是右键
模拟按下键盘上的某个键
• 有时在一些应用程序中,也需要模拟在 键盘上按下某个键的过程,这可以通过 向特定对象发送按键事件来实现。
• 例4-1 模拟按下键盘上的某个键 • ( 1 )创建一个新的工程,在窗体中添加一个 Edit 组件、一个 Button组件和一个定时器组件(位于System标签页)。 • ( 2 )并添加 Button 组件的 OnClick 事件、 Timer 组件的 OnTimer 事 件的处理过程如下: • procedureTForm1.Button1Click(Sender:TObject); • //模拟在Edit1组件中按下了字母a键 • begin • PostMessage(Edit1.Handle,WM_KEYDOWN,65,0); • end; • procedureTForm1.Timer1Timer(Sender:TObject); • //模拟在窗体Form1中按下了Tab键 • begin • PostMessage(Form1.Handle,WM_KEYDOWN,VK_TAB,0); • end; • (3)运行程序,可以看到窗体的输入焦点在不断地变化,尽管并 没有在键盘上按下Tab键。如果按下Button1按钮,则Edit1组件中 的字符串会自动增加一个字母a。
• procedureTForm1.FormMouseDown(Sender:TObj ect;Button:TMouseButton; • Shift:TShiftState;X,Y:Integer); • begin • if Shift>=[ssLeft]then • caption:='你单击鼠标左键'; • if Shift>=[ssMiddle]then • caption:='你单击鼠标中键'; • if Shift>=[ssDouble]then • caption:='你双击了鼠标'; • if ssRightinShiftthen • caption:='你单击鼠标右键'; • end;
鼠标事件处理
常用鼠标事件
• 1.OnMouseDown • 当按下鼠标上的任一个键,会产生一个 OnMouseDown事件。 • 2.OnMouseMove • 当鼠标的位置发生了改变后会产生一个 OnMouseMove事件。 • 3.OnMouseUp • 当鼠标的某个按键按下,然后松开后会产生一 个OnMouseUp事件。
拖放编程
• • • • •
常用的拖放事件有: 1.OnDragDrop 在拖曳事件开始时会产生一个OnDragDrop事件。 2.OnDragOver 当拖曳对象跨过一个组件时会产生一个 OnDragOver事件。 • 3.OnEndDrag • 当拖曳事件结束后会产生一个 OnEndDrag 事件。
3.OnKeyUp
• 当按下键盘上的任一个键后松开时,都 会产生一个OnKeyUp事件。对于功能键 (F1~F12)、Ctrl键、Shift键或Alt键等, 也会产生一个OnKeyUp事件。
• • • •
• • • • • •
• • • • •
下面的一段代码说明了OnKeyDown事件和OnKeyUp事件的用法: var FormColor:TColor;//用来保存窗体原来的颜色 procedureTForm1.FormKeyDown(Sender:TObject;varKey:Word;Shift :TShiftState); begin //当键按下时先保存窗体的颜色然后再改变窗体的颜色 FormColor:=Form1.Color; Form1.Color:=clAqua; end; procedureTForm1.FormKeyUp(Sender:TObject;varKey:Word;Shift:T ShiftState); begin //当键弹起时恢复窗体的颜色 Form1.Color:=FormColor; end; 程序运行后,在窗体中按下某个键然后松开,窗体的颜色会随之 改变。
• 例4-3 该例程说明了拖动操作的实现过程。 程序运行结果界面如图4-1所示,上面有 一个Edit组件,下面是一个Memo组件。 程序运行后,可以在Edit组件中输入一些 文字,然后将鼠标移动到Edit组件上并按 下左键,拖动到Memo组件并松开左键, 则Edit组件中的文字就被添加到Memo组 件中了。
• procedureTForm1.Memo1DragDrop(Sender ,Source:TObject;X,Y:Integer); • begin • if(SenderIsTMemo)and(SourceIsTEdit)then • // 将 Edit 组件中的内容添加到 Memo 组件 的最后 • ( SenderAsTMemo).Lines.Add((SourceAsT Edit).Text); • end;
例4-2 检测Shift、Alt和Ctrl键是 否按下。
• procedureTForm1.FormKeyDown(Sender:TObject;varKey :Word; • Shift:TShiftState); • begin • if Shift>=[ssShift]then • caption:='你按下了Shift键'; • if Shift>=[ssAlt]then • caption:='你按下了Alt键'; • if Shift>=[ssCtrl]then • caption:='你按下了Ctrl键'; • end;
键盘事件处理
键盘事件
1.OnKeyDown
• 当按下键盘上的任一个键,如字母键、 数字键、功能键(F1~F12)、Ctrl键、 Shift键或Alt键等,都将产生一个 OnKeyDown事件。
• 下面的一段代码说明了OnKeyDown事件的用法: 当打印的时候在窗体中按下 Esc 键后,取消打 印作业。 • procedureTForm1.FormKeyDown(Sender:TObjec t;varKey:Word;Shift:TShiftState); • begin • if(Key=VK_ESCAPE)andPrinter.Printingthen • begin • Printer.Abort;//中止打印 • MessageDlg(' 打 印 中 止 。 ',mtInformation,[mbOK],0); • End; • End;
• ( 3 ) 选 中 Edit 组 件 并 在 对 象 编 辑 器 中 为 其 添 加 OnMouseDown事件的处理过程如下: • procedureTForm1.Edit1MouseDown(Sender:TObject;Butt on:TMouseButton; • Shift:TShiftState;X,Y:Integer); • begin • ifButton=mbLeftthen • //开始进行拖动操作 • (SenderAsTEdit).BeginDrag(False); • end; • 注意:过程BeginDrag具有一个布尔类型的参数,如果 该参数设置为 False,表示当按下鼠标左键并拖动一小 段距离后才进行拖曳操作;如果设置为 True,表示当 按下鼠标左键后立即进行拖曳操作。通常将该参数设 置为False。
[思考与练习]
• • • • 什么是系统事件?什么是用户事件? 键盘有哪些常用事件,什么时候发生? 鼠标有哪些常用事件,什么时候发生? 上机完成本章的所有例题。