CorelDraw插件开发教程(5):判断&循环

  • 0

CorelDraw插件开发教程(5):判断&循环

Category:COREL插件 Tags : 

 刘肖健创意之代码 1周前

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之间的值。

http://mip.i3geek.com

Leave a Reply

搜索

分类目录

公 告

本网站学习论坛:

www.zhlisp.com

lisp中文学习源码:

https://github.com/zhlisp/

欢迎大家来到本站,请积极评论发言;

加QQ群学习交流。