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

C++ Builder 在图形中绘制

51自学网 http://www.51zixue.net
6.1.7 在图形中绘制
应用程序中不需要任何组件来处理图形对象,可以构造、绘制、保存并释放图形对象而不必在屏幕绘制任何东西。事实上,应用程序很少直接在窗体中绘制。通常应用程序会在图形对象上操作,然后使用VCL图像控制组件在窗体上显示图形对象。

当把应用程序的绘制操作改为操作图像控件中的图形后,图形对象的打印、剪贴板、加载和保存的操作就变得很轻易。图形对象可以是位图文件、图元文件、图标或任何其他已安装的图形类,如JPEG图形。

注意因为是在非屏幕图像上绘制,例如在TBitmap画布上,所以图像直到控件把它从位图对象复制到控件画布后才会显示。也就是说,当绘制位图并把它们分配给图像控件时,图像只在控件有机会处理绘制信息时才会出现。若直接在控件的画布上绘制,图形对象会立即显示。

1.制作可滚动的图形
图形并不需要与窗体的大小相同:它可以比窗体更小或更大。通过在窗体中加入一个滚动框并把图形图像放入其中,就可以显示比窗体大,或甚至比屏幕大的图形。要添加一个可滚动的图形,先要添加一个TScrollBox组件,接着再添加图像控件。

2.添加图像控件
图像控件是一个容器组件,它能够显示位图组件。图像控件可用于存放不必一直显示的位图,或应用程序需用来生成其他图形的位图。
注意5.4节中说明了如何在控件中使用图形。

(1) 放置控件
可以把图像控件放在窗体的任何位置。若使用了图像控件的可调整大小以适应图片的特性,只需设置其左上角的位置。若图像控件是一个不可见的存放位图的容器,就可以像放置其他不可见组件一样将它任意放置。
先把图像控件放在一个对齐窗体客户区的滚动框中,这可确保滚动框可根据需要添加滚动条,以便访问图像在屏幕以外的部分,然后再设置图像控件的属性。

(2) 设置位图的初始大小
当加入一个图像控件时,它只是个容器。然而,可以在设计时设置图像控件的Picture属性以添加静态图形。也可以在运行时从文件加载图片,参见6.1.8节。要在应用程序启动时创建一个空白的位图,

1) 给图像组件所在窗体的OnCreate事件添加事件处理程序。
2) 创建位图对象,并将其分配给图像控件的Picture属性。
下例中,图像组件在应用程序的主窗体Form1中,所以将代码加到Form1的OnCreate事件处理程序中:


把位图指定给图片的Graphic属性使得图片对象拥有位图的所有权。图片对象在使用完位图后将其自动释放,所以可不必自行释放位图对象。可以将另一位图分配给图片对象(参阅6.1.8节中的“替换图片”),这时图片对象会释放旧位图并假定新位图的所有权。

如果现在运行应用程序,会在窗体客户区中看到一块白色区域,它表示位图。若调整窗口的大小到客户区不能完整显示整个图像,就会看到滚动框自动地显示滚动条,以便显示图像的其余部分。但若想在图像上绘制则不会得到任何结果,因为实际绘制操作是在图像和滚动框之后的窗体中进行的。

(3)在位图上绘制
要在位图上绘制,需用图像控件的画布并把鼠标事件处理程序添加给图像控件的适当事件。通常会使用区域操作方式(填充、矩形、折线等),这些是快速有效的绘图方法。需要访问单个的像素点时,较有效的绘制图像方法是使用位图的ScanLine属性。通常的用途是把位
图的像素格式设为24位,然后把由ScanLine所返回的指针当成RGB数组来处理。否则,就需要知道ScanLine属性的原始格式。

下例说明如何使用ScanLine属性一次获取一行像素点。
 
 
上一篇:加载和保存图形文件  下一篇:C++ Builder 在应用程序中处理多个绘图对象