CorelDraw插件开发教程(5):判断&循环
Category:COREL插件CorelDraw插件开发教程(5):判断&循环
刘肖健
浙江工业大学工业设计研究院
6. 判断:选择色彩模式
这节通过色彩模式的选择来了解判断语句的用法。
仍然沿用上节的案例,我们给用户界面再增加两个单选按钮,让用户选择RGB或CMYK色模式来填充圆。
6.1 控件:单选按钮,选择填充色模式
在工具箱里点“Frame”按钮
在界面上建立一个Frame控件,并将其Caption属性修改为“填充色模式”。Frame控件只是画个框把一些其他控件圈在里面。
然后在Frame控件里面添加两个单选按钮
分别命名为fillRGB和fillCMYK,它们的Caption属性则分别改为“RGB”和“CMYK”。
两个单选按钮默认状态都是“未选中”,现在将RGB按钮的默认状态改为“选中”。从fillRGB的属性窗口中找到Value变量,将其默认的“False”值改为“True”:
试运行一下会发现,RGB和CMYK两个单选按钮的状态会交替切换,即选中RGB时,CMYK为“未选中”状态,反之亦然。
修改程序代码如下:
Private Sub DrawCircles_Click()
Dim i As Integer, s1 As Shape, x As Double, y AsDouble, r As Double
For i = 1 To nCircles.Value
‘圆心x坐标、y坐标
x =ActivePage.LeftX + Rnd * ActivePage.SizeWidth
y =ActivePage.BottomY + Rnd * ActivePage.SizeHeight
r = minR.Value* ActivePage.SizeWidth + Rnd * ( maxR.Value – minR.Value ) *ActivePage.SizeWidth
Set s1 =ActiveLayer.CreateEllipse2(x, y, r, r, 90#, 90#, False)
If fillRGB.Value=True then
‘填RGB色
s1.Fill.UniformColor.RGBAssignRnd * 255, Rnd * 255, Rnd * 255
else
‘填CMYK色
s1.Fill.UniformColor.CMYKAssign Rnd * 100, Rnd* 100, Rnd * 100, Rnd * 100
End If
Next
End Sub
为节省空间,几个定义变量的语句写在了一行,前面用一个Dim即可。
“If……Then”语句的用法细节可以查看帮助文档。
赋CMYK色的方法可以查看“CMYKAssign”函数的帮助得到细节指导。CMYK色的四个分量是取0~100的值,而不是0~255,这个要注意。
色彩跟RGB有不小的差异,主要是整体色调都偏黑。把CMYK的最后一个变量改为0:
s1.Fill.UniformColor.CMYKAssignRnd * 100, Rnd * 100, Rnd * 100, 0
即不用黑色,则生成的圆色彩与RGB色相同了。
6.2 控件:复选框,选择要不要CMYK的黑色
我们把“加CMYK黑色”的选择权交给用户,这个功能可以通过复选框实现。
利用工具箱里的复选框工具
创建一个复选框控件:
代码作如下修改:
Private Sub DrawCircles_Click()
Dim i As Integer, s1 As Shape, x As Double, y AsDouble, r As Double
For i = 1 To nCircles.Value
x =ActivePage.LeftX + Rnd * ActivePage.SizeWidth
y =ActivePage.BottomY + Rnd * ActivePage.SizeHeight
r = minR.Value* ActivePage.SizeWidth + Rnd * (maxR.Value – minR.Value) * ActivePage.SizeWidth
Set s1 =ActiveLayer.CreateEllipse2(x, y, r, r, 90#, 90#, False)
IffillRGB.Value = True Then
‘填RGB色
s1.Fill.UniformColor.RGBAssignRnd * 255, Rnd * 255, Rnd * 255
Else ‘填CMYK色
‘有黑色
If withBlack.Value = True Then
s1.Fill.UniformColor.CMYKAssign Rnd *100, Rnd * 100, Rnd * 100, Rnd * 100
Else ‘无黑色
s1.Fill.UniformColor.CMYKAssign Rnd *100, Rnd * 100, Rnd * 100, 0
End If
End If
Next
End Sub
上述代码中,If语句中嵌套了另一组If语句(黑体部分),用于判断CMYK模式下是否加黑色,也就是K值是否为零。运行时,选中“加黑色”复选框会得到一个K值为随机数的CMYK色;不选则K值为零。
6.3 有三种选项的情况
再增加一种色彩模式HSB,现在有三种色彩模式可选了:
代码作如下修改:
Private Sub DrawCircles_Click()
Dim i As Integer, s1 As Shape, x As Double, y AsDouble, r As Double
For i = 1 To nCircles.Value
x =ActivePage.LeftX + Rnd * ActivePage.SizeWidth
y =ActivePage.BottomY + Rnd * ActivePage.SizeHeight
r =minR.Value * ActivePage.SizeWidth + Rnd * (maxR.Value – minR.Value) *ActivePage.SizeWidth
Set s1 =ActiveLayer.CreateEllipse2(x, y, r, r, 90#, 90#, False)
If fillRGB.Value = True Then ‘填RGB色
s1.Fill.UniformColor.RGBAssignRnd * 255, Rnd * 255, Rnd * 255
ElseIf fillHSB.Value = True Then ‘填HSB色
s1.Fill.UniformColor.HSBAssign Rnd * 360,Rnd * 255, Rnd * 255
Else ‘填CMYK色
If withBlack.Value = True Then ‘有黑色
s1.Fill.UniformColor.CMYKAssignRnd * 100, Rnd * 100, Rnd * 100, Rnd * 100
Else ‘无黑色
s1.Fill.UniformColor.CMYKAssignRnd * 100, Rnd * 100, Rnd * 100, 0
End If
End If
Next
End Sub
黑体部分是新增的代码,它判断是否使用HSB模式的进行填色,如果是,则执行后面的HSBAssign函数为图形对象s1填色。
“If……Then……ElseIf……Else”语句的语法规则与使用方法请查阅VBA帮助文档,参考示例代码学习细节信息。
7. 循环与计算:画一行排列整齐的圆
这节来做一个在循环中进行计算的案例,因为与上述画随机圆的情况不太一样,大部分循环并不是把一个动作一成不变地重复多次,而是在重复的过程中有变化,并且是规律性变化,有时变化规律还相当复杂。
7.1 实现规律的图形位置变化
这个案例是画一系列半径相等的圆,圆的数量由用户给定,要求这些圆排成一行,与左右邻圆相切,并且把当前页面从左到右撑满。
在原有的界面上增加一个Frame控件,它的Caption改为“画一行圆”。在Frame内放置一个输入画圆数量的标签和输入框,以及一个执行按钮。
“画圆数量”输入框上面有一个了,其实可以用上面的,不过我习惯了控件专用化,也就是说,一个输入框只服务一项功能,所以重设了一个数量参数,将其命名为nCircles2。“Go!”按钮控件的名称是DrawCircleRow,由于Frame上已经提示了“画一行圆”,所以按钮上的Caption就简单些,直接写“Go!”明确提示它是最终的执行按钮。
双击“Go!”按钮,建立子程序框架,在里面写入如下代码:
Private Sub DrawCircleRow_Click()
Dim i As Integer, s1 As Shape, x As Double, y AsDouble, r As Double
r = 0.5 * ActivePage.SizeWidth / nCircles2.Value ‘圆半径
For i = 1 To nCircles2.Value
x =ActivePage.LeftX + (i – 1) * 2 * r + r ‘圆心x坐标
y =ActivePage.BottomY + ActivePage.SizeHeight / 2 ‘圆心y坐标
Set s1 =ActiveLayer.CreateEllipse2(x, y, r, r, 90#, 90#, False)
s1.Fill.UniformColor.RGBAssign Rnd * 255, Rnd * 255, Rnd * 255 ‘填RGB随机色
Next
End Sub
上述代码中,每个圆的半径都是一样的,所以先把半径r计算出来。其实每个圆心坐标的y值也是一样的,因为我们发现y的计算公式里没有出现循环变量i(x的计算公式里有)。但是计算y值的语句放在了循环里,每次画圆都要算一遍,浪费了计算时间。所以应该把计算y的语句移除循环,放在半径r计算语句的后面。
7.2 实现规律的图形色彩变化
圆的位置有规律了,也可以让色彩有点规律。代码修改如下:
Private Sub DrawCircleRow_Click()
Dim i As Integer, s1 As Shape, x As Double, y AsDouble, r As Double
r = 0.5 * ActivePage.SizeWidth / nCircles2.Value ‘圆半径
y = ActivePage.BottomY + ActivePage.SizeHeight / 2 ‘圆心y坐标
For i = 1 To nCircles2.Value
x =ActivePage.LeftX + (i – 1) * 2 * r + r ‘圆心x坐标
Set s1 =ActiveLayer.CreateEllipse2(x, y, r, r, 90#, 90#, False)
s1.Fill.UniformColor.RGBAssign (i /nCircles2.Value) * 255, (1 – i / nCircles2.Value) * 255, (1 – i /nCircles2.Value) * 255 ‘填RGB随机色
Next
End Sub
上述代码的主要改动是把循环内的Rnd换成了(i/nCircles2.Value)或(1-i/nCircles2.Value),0它们可以计算出~1之间的数,是RGB三个色彩分量得到0~255之间的值。