AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > C++

C++ 拖引线示例

51自学网 http://www.51zixue.net

2.在窗体对象中加入字段以追踪鼠标动作
要追踪鼠标键是否被按下,必须在窗体对象中加入对象字段。当把一个组件加入窗体时,C++Builder在窗体对象中增加代表该组件的字段,以便可通过其字段名引用组件。也可通过编辑窗体单元头文件中的类型声明将自己的字段加入窗体。

在下例中,窗体需要追踪用户是否按下鼠标键。为此,增加一个布尔型字段且当用户按下鼠标键时设置其值。要在对象中增加字段,需编辑对象的类型定义,在声明最末处public指令后指定字段标识符及类型。C++Builder“拥有”public指令前的任何声明:那是它放置代表控件的字段和响应事件的方法的地方。
下列代码在窗体对象的声明中将一个名为Drawing的bool类型的字段加入窗体。同时还增加了用以存储点的两个POINT类型的字段Origin和MovePt。


现在可用Drawing字段追踪是否开始绘制操作,当用户按下鼠标键时将其设为true,当用户释放鼠标键时设为false:


然后可修改OnMouseMove事件处理程序,只在Drawing为true时进行绘制:


这使得绘制仅发生在按下鼠标键事件和释放事件之间,同时得到追踪鼠标动作的一条随意绘制的线而不是一条直线。问题是每次你移动鼠标,鼠标移动事件处理程序调用LineTo,它移动画笔位置,这样当释放鼠标键,你会失去直线应当开始的点。

3.改善直线绘制
有了可追踪各种点的字段,就可改善应用程序的直线绘制。

(1)追踪起点
当绘制直线时,可用Origin字段追踪直线的起点。Origin应被设为按下鼠标键事件的发生点,释放鼠标键事件处理程序就能使用它来设置直线的起点,
代码如下:


代码中的这些变化可让应用程序重新绘制最后的直线,但不绘制任何中间的动作,也就是应用程序还不支持“拖引线”。

(2)追踪移动
当前的OnMouseMove事件处理程序的问题是它从刚才的鼠标位置绘制直线到当前的鼠标位置,而不是从起始点。可通过移动绘制位置到起始点来改正上述问题,然后绘制到当前点:


上述代码追踪当前的鼠标位置,但是中间的线没有消除,因此几乎看不见最后的线。在此例中还需通过追踪先前的线的位置以在绘制下一条线前消除先前的线。这可用MovePt字段来完成。

MovePt必须被设为每条中间的线的终点,以便可用MovePt和Origin来消除先前的线:


现在就在绘制直线时得到了“拖引线”的效果。通过将画笔的模式设为pmNotXor,可把绘制的直线与背景像素相结合。当消除线后确实将像素设回到它们原来的方式。而在绘制线后通过将画笔模式设回pmCopy(缺省值),可确保画笔准备好在释放鼠标键时做最后的绘制操作。

 
 

上一篇:C++ Builder 实现控件拖放操作  下一篇:C++ Builder 画布的通用属性和方法