Pwin95下用Visual Basic绘制和打印大型工程用图件

四川石油地质调查处教育科 张智群

  工程应用程序一般都需要绘制和打印图件,特别是很多时候需要绘制和打印大型图件。Pwin95下用Visual Basic绘制和打印小型图件是非常方便的,但是绘制和打印大型工程图件时,有些问题值得大家注意。

一、PictureBox(绘图板)能绘制多大的图形

  出于各种考虑,我们一般都是采用PictureBox(绘图板)来绘图。在PictureBox上到底能绘制出多大的图形呢?

  首先是PictureBox本身能有多大? 尽管你可以给PictureBox.Width或PictureBox Height属性一个很大的值,根据您的PictureBox的Container对象的Scalemode选择的不同,这可能 会引发溢出故障,但是实际上无论Scalemode选择什么,Visual Basic的16位版本和32位版本的PictureBox的最大屏幕绘图能力都是16384个像素点宽与16384个像素点高(0~16383)。例 如,设想您选择Forml的Scale-mode为Pixel(3),当语句:Picture.Width=16388执行后,不会引 发溢出故障;但是当你检查Picture.Width的值时,却是16383。若是想执行语句Picture.Width=32764,则会引发溢出故障。

  按照目前大多数工程应用中的打印设备每英寸150~400个点的分辨率来考虑,上述绘图能力相当于可以绘制出1~3米大小的精密工程件。从此可以看出Pwin95下用Visual Basic已 经可以方便地绘制出满足许多应用要求的大型工程图件。

二、在绘图板上小心绘制大型图件

  在这个最大为16384×16384个像素点的图版上绘制大型工程图件时,16位版本和32位版本的方式是有些差异的,使用时需要特别注意。

  在Visual Basic的16位版本中,例如,尽管在语句:

  object.Line Step (x1,y1)-Step(x2,y2),color,BF的说明中,参数x1,y1,x2,y2都是Single,但是实际上有一定的限定。无论PictureBox选择何种ScaleMode,其对应的实际像素点数都不能超过16384×16384个(0~16383),即不能超出PictureBox所允许的最大宽和高的像素点数。根据故障处理方式选择的不同,超出这个限制的语句将出错或什么也绘制不出来(不仅仅是超出部分绘制不出来)。PictureBox的Container对象ScaleMode属性、PictureBox的Width & Height属性、PictureBox自身ScaleMode属性,以及绘图语句的坐标参数(x,y)等4个 因素共同决定一条绘图语句在绘图板上的实际绘图范围,因此若是发现绘不出图、绘出的图像异常或引发故障,需要仔细检查出4个因素中是哪一个有问题,才能迅速排除故障。

  在Visual Basic的32位版本中,尽管采用超限剪辑的方式处理了大多数16位版本中引发故障的问题,使得Visual Basic的32位版本对绘制大型工程图件有更大的适应能力,但是若发 现异常,还是应当按上述的考虑方式来排除故障。

三、想办法在绘图板上随意写字

  尽管各种文字描述和数据都希望用图形来生动地表示,但是工程图件总是离不开一定的标记和文字说明,特别是大型工程图件,一般都得在这里或那里添加一些说明文字。

  对于小型图件,通过选择PictureBox的适当字体、字号,通过CurrentX和CurrentY属性设 定文字输出的左上角位置,用PictureBox的Print方法就可以输出文字。

  对于大型图件,在Visual Basic的16位版本中,用上述方法不能在大范围内输出显示文字 。问题的关键是:无论您将PictureBox的ScaleMode设置成何种方式,PictureBox的CurrentX和CurrentY属性在用Print输出文字时都将转换为Twips单位来使用,而且Cur-rentX和CurrentY的数据类型还是整数,即它们的最大值都不得超过32767。以典型的14英寸VGA 640×480分辨率的监视器为例,这相当于用PictureBox的Print方法最大可以在32768/15(Screen.TwipsperpixelX)=2184个像素点的(最宽&最高)位置上输出文字,超出这个范围将引发溢出故障。尽管2184个像素点比640或480大3~4倍,但却比16384个像素点的最大绘图能力小了8倍。因此,在Visual Basic的16位版本中,我们不是用PictureBox的Print方法来显示输出和打印文字,而是采用Windows API调用TextOut和Ext-TextOut函数来显示输出和打印文字。使用TextOut和ExtTextOut函数,其最宽及最高位置的文字显示输出和打印能力,能够与PictureBox的绘图能力相匹配,但在使用时要注意两点:一是要将PictureBox上的开始输出显示位置换算成像素点位置;二是要注意实际输出不能超出PictureBox的范围,否则将引发溢出故障。

  对于大型图件,在Visual Basic的32位版本中情况要好一些,其PictureBox的CurrentX和 CurrentY的数据类型已经是长整数(Long),Print方法的文字输出显示范围已经与PictureBox的最大绘图能力相匹配。但是还是有一点小差异:对于实际绘图或文字输出超限,对于绘图方法(Line、Circle、PSet),TextOut和ExtTextOut的API调用,是用剪辑的方式处理的,即超限部分被剪辑掉了;而Print方法则引发溢出故障。

四、图形映象打印

  若采用的是大型的打印输出设备,可以简单地采用调用Printer的PaintPicture方法,一次映象打印将绘制在PictureBox上的图形打印出来。PaintPic-ture调用方法的语法如下:

Printer.PaintPicture PictureBox.Image,-

Printer.StartX, Printer.StartY, Printer.Width, Printer.Height,-

PictureBox.StarX, PictureBox.StartY, PictureBox.Width, PictureBox.Height,Opcode&

  若是让Printer与PictureBox的Scale-Mode一致,则将获得一致的打印结果。这里所说的 一致的打印结果,若是选择Scale-Mode为3(Pixel),则点阵对应;其它方式,则是大小对应。点 阵对应具有完整的精度,大小对应具有视觉上的大小一致。

  PictureBox.Image仅仅是您绘制的图形,Pic-tureBox上的其它图形控件并不属于Image对象,不能直接在上述语句中打印出来。对于屏幕上几个PictureBox包容或重叠显示达到的复杂特殊效果,可以分别几次调用Printer的PaintPicture方法,将图形建立到Printer对象上 ,然后一齐调用Printer的EndDoc方法,将图形打印出来。

  若是欲打印存储在文件中的.bmp、.ico、.rle、.wmf文件图像,可以用LoadPicture( )函数将它们先装入到某个PictureBox的Picture属性对象中,再用PrintPicture方法打印出图 。

  适当选择调用PaintPicture方法的Printer和Pic-tureBox的StartX、StartY和Width、Height参数,还可以实现简单的缩放、对折和翻转效果。

  若是您采用普通打印输出设备,不能一次打印出大型的图像,需要根据实际使用纸张的大 小,将图像分成几块,分块调用PaintPicture方法将其打印出来,然后再把打印出来的数块图像粘贴拼接起来。为了便于粘贴拼接,分块打印时一般应当有一点重叠。

  需要注意的是,在工程绘图中一般都将Picture-Box的AutoRedraw属性设置为True,以便滚动浏览和打印绘出的图件,这需要占用大量的内存。工程图件一般是黑白的,需要彩色时尽 量使用16色,须知内存占用随色彩数增加而迅速增大。多配置一些存储器是加快程序运行的有力措施。我们使用的一台P5/90 Micron PC就配置了64MB RAM,另外还设置了几百MB的固定 磁盘缓冲区,绘制和打印大型图件的速度和效果还是比较满意的。

back.gif (1185 字节)