6.1.10 拖引线示例 这一小节中详细说明在一个图形应用程序中拖引线(rubberbanding)效果的实现,拖引线用来追踪用户在运行时绘制图形时鼠标的运动。这节中的代码来自EXAMPLES/DOC/GRAPHEX目录中的一个应用程序示例。该应用程序响应鼠标点击和拖动以在一个窗口的画布中绘制直线和形状:按下一个鼠标键开始绘制,释放该键结束绘制。
首先,用示例代码显示出如何在主窗体的表面绘制。后一个例子说明在位图上绘制。 本节包括: · 响应鼠标。 · 在窗体对象中加入一个字段以追踪鼠标动作。 · 改善直线绘制。
1.响应鼠标 应用程序可响应鼠标动作:按下鼠标键,移动鼠标及释放鼠标键。同时也可响应一次单击(包括按下到释放的全过程),单击也可能由某种击键动作产生(例如在一个模态对话框中按下回车键)。
这部分内容包括: · 一个鼠标事件中包含什么。 · 响应按下鼠标键操作。 · 响应释放鼠标键操作。 · 响应移动鼠标操作。
(1)一个鼠标事件中包含什么 VCL有三个鼠标事件:OnMouseDown事件、OnMouseMove事件及OnMouseUp事件。 当VCL应用程序检测到一个鼠标动作时,它调用为相应的事件定义的无论什么事件处理程序,并传递5个参数。用这些参数中包含的信息可定制对鼠标事件的响应。5个参数如表6-4所示:
大部分情况下,只需要鼠标事件处理程序中返回的坐标,但有时也需要检查Button参数以判定是哪个鼠标键引发了事件。
注意C++Builder在判定哪个鼠标键被按下时与MicrosoftWindows使用相同的标准。这样,若交换了缺省的“主”及“次”鼠标键(鼠标右键为当前的“主”鼠标键),点击主(右)键将把mbLeft作为Button参数的值。
(2)响应按下鼠标键操作 当用户按下一个鼠标键时,当前鼠标指针所指的对象发生一个OnMouseDown事件。然后对象可响应该事件。要响应按下鼠标键操作,给OnMouseDown事件分配一个事件处理程序。 VCL会为窗体中的按下鼠标事件产生一个空的处理程序:
这里可加入在按下鼠标键的位置上显示一些文本的代码,代码调用画布的TextOut方法并传入X和Y参数以显示文本。 下列代码在窗体中按下鼠标键的位置显示字符串“Here!”:
应用程序运行时,当鼠标光标在窗体中时按下鼠标键,会在按下鼠标键的位置显示字符串“Here!”。
下列代码将会把当前绘图位置设为用户按下鼠标键的位置坐标:
按下鼠标会设置当前的画笔位置,设置直线起点。要绘制到用户释放按钮处的直线,需响应释放鼠标键事件。
(3)响应释放鼠标键操作 当用户释放鼠标键时,OnMouseUp事件发生。该事件通常发送给当用户按下鼠标键时鼠标光标在其之上的对象,释放鼠标键不需要光标还在同一个对象上。这可用于,例如,画一条好像延伸到窗体边界之外的直线。要响应释放键操作,需为OnMouseUp事件定义一个处理程序。 下面是一个简单的OnMouseUp事件处理程序,它绘制一条到释放鼠标键的点的直线:
这段代码让用户通过按下、拖动和释放鼠标绘制直线。在这种情况中,在鼠标键被释放前用户看不见所绘制的直线。
(4)响应移动鼠标操作 当用户移动鼠标时,一个OnMouseMove事件周期性地发生。事件通常发送给用户按下鼠标键时鼠标光标下面的对象。这样就可在鼠标移动时通过绘制临时的直线给用户一些相关反馈。要响应移动鼠标操作,为OnMouseMove事件定义一个事件处理程序。下例当用户保持按下鼠标键时在窗体中绘制形状,这能给用户提供一些反馈。OnMouseMove事件处理程序绘制一条直线到发生OnMouseMove事件的位置:
使用这段代码,甚至在鼠标键按下之前,在窗体中移动鼠标都会引起跟随鼠标的绘制操作。甚至在当没按下鼠标键时,鼠标移动事件也会发生。若要追踪是否有鼠标键被按下,需在窗体对象中加入一个对象字段。
<  
1/2 1 2 下一页 尾页 |