Dim newBrush AsLong, oldBrush As Long
newBrush =CreateSolidBrush(Color)
oldBrush =SelectObject(hdc, newBrush)
DeleteObjectoldBrush
上述代码中参数Color为画刷颜色值。
Draw 函数原型为:Private SubICustomChart_Draw(ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, values()As Double, ByVal normValue As Double, ByVal sizeValue As Double),系统按Shape文件记录集顺序依次调用此函数绘制各图元渲染图形。如果渲染字段为多个,那么我们需要在此函数中依次绘制各字段的渲染图形。在该函数参数中,X、Y是当前图元的横纵坐标;values()是各渲染字段的值,value(i)即为该图元所对记录第i+1个渲染字段值,此值将被作为柱条高度或饼图的半径的参考。
ResetDC 函数原型为:rivate Sub ICustomChart_ResetDC(ByValhdc As Long),用来恢复设备描述表设置,SelectObject和DeleteObject Windows API函数将被调用来实现上述功能。
在以上三个函数的实现中,我们使用了Windows API函数,下面对其做简要介绍。API是Application Programming Interface(应用程序编程接口)的缩写,API函数可分为窗口管理、图形设备接口函数、系统服务函数、国际特性、网络服务等几类,存放在DLL(Dynamic Link Library,动态链接库)中。在VB中,不能直接调用API函数,必须遵循“先声明后使用”的原则,否则会提示“子程序或函数未定义”的错误信息。
1) API函数的声明要用到Declare语句,如果该API函数有返回值,则其声明为Function,如果没有返回值,可以将其声明为Sub;
2)在Declare语句中,Lib关键字用来指明该API函数属于哪个DLL;
3)VB以地址方式传递参数,而许多API要求以值传递方式传递参数。如果调用的API函数以值传递,则需在参数声明前加上ByVal关键字。
遵循如上原则,我们使用到的API函数声明如下:
Private DeclareFunction CreatePen& Lib 'gdi32' (ByVal nPenStyle As Long, nWidthAs Long, ByVal crColor As Long)
Private DeclareFunction SelectObject& Lib 'gdi32' (ByVal hdc As Long, ByValhObject As Long)
Private DeclareFunction DeleteObject& Lib 'gdi32' (ByVal hObject As Long)
Private DeclareFunction CreateSolidBrush& Lib 'gdi32' (ByVal crColor As Long)
4. 自定义图形绘制方法
4.1 绘制柱状图
绘制柱状图实现于Draw函数之内,系统为图层中每一个图元绘制渲染图形时都调用一次Draw函数,如果地多个字段同时渲染,则在Draw函数体内一次绘制完成。Draw函数的X、Y参数即为当前图元的坐标位置。首先定义一个MapObjects的矩形对象pRect,设用户设定其宽度为iBarWidth,高度为iBarHeight,通过如下语句设置:
pRect.left = X
pRect.bottom = Y
pRect.top =pRect.bottom - iBarHeight
pRect.right =pRect.left + m_dblBarWidth
需要注意的是,此时图上坐标系,纵轴方向是竖直向下的,因此计算矩形对象各顶点坐标时,需考虑与正常坐标系统的差别。如果我们对多个字段进行柱状图渲染,可能需要对各柱条的排列位置予以设置,此时考虑柱条个数并使其排列于当前图元适当位置即可。最终采用Windows API函数中FillRect函数实现矩形的填充,FrameRect函数绘制矩形边框。该函数的调用方式为 :
FillRect hdc,pRect, newBrush
FrameRect hdc,pRect, newBrush
其中,hdc为DC的句柄也是Draw函数的参数,newBrush为我们自定义的画刷。FillRect 与FrameRect函数同样需要声明,方式如下:
Private DeclareFunction FillRect& Lib 'user32' (ByVal hdc As Long, lpRect AsRectangle, ByVal hBrush As Long)
Private DeclareFunction FrameRect& Lib 'user32' (ByVal hdc As Long, lpRect AsRectangle, ByVal hBrush As Long)
4.2 绘制饼状图
与柱条图相同,每绘制一个图元饼图系统调用一次Draw函数,并且函数中X,Y参数即是该图元坐标位置。发表论文。假定需要绘制的饼图半径设定为Radius,在油井综合柱状图的饼图中,根据累积产油量及累积产水量数值所占的总和比例来确定其在饼图是所占的比例大小。我们首先介绍一下绘制饼图的API函数Pie。该函数用来绘制椭圆或其一部分,函数原型如下:
Pie hdc, X1, Y1,X2, Y2, x3, y3, x4, y4
如图1所示,(X1, Y1),( X2, Y2) 为椭圆外接矩形的左上点和右下点的坐标。以椭圆中心为起点的向(X3,Y3)、(X4,Y4)方向延伸分别构成射线L1和射线L2,以椭圆中以为圆点,以L1起以逆时针方向旋转至L2,在椭圆上扫过的面即为当前绘绘制的图形,即图1中的红色区域。

图1 椭圆绘制区示意
由于累积产油和累积产水两项指标总和绘制为半圆,圆半径为Radius,因此各自所占的比例由其数值比例决定。若累油、累水分别为第一、二个渲染字段,则在Draw函数中其值分别为Value(0)和Value(1),设其开始和终止绘制的角度BeginAngle和EndAngle分别为:
BeginAngle =0
EndAngle = Value(0)/( Value(0)+Value(1))*180
同样由于纵坐标轴方向是向下的,因此:
x3 = X - radius *Cos(( /180)*EndAngle)
y3 = Y - radius *Sin(( /180)*EndAngle))
x4 = X - radius *Cos(( /180)*BeginAngle))
y4 = Y - radius *Sin(( /180)*BeginAngle))
2/3 首页 上一页 1 2 3 下一页 尾页 |