CorelDraw插件开发教程(4):用户界面

  • 0

CorelDraw插件开发教程(4):用户界面

Category:COREL插件 Tags : 

 刘肖健创意之代码 1周前

CorelDraw插件开发教程(4):用户界面

 

刘肖健

浙江工业大学工业设计研究院

 

5.   用户界面制作

前面编写的代码都没有用户界面,子程序直接运行给出结果。用户界面可以让用户输入参数来控制程序运行,比如生成圆的个数。

这节沿用上节的案例简单介绍一下窗体,以及按钮、文本框、标签三个常见控件的用法。其他控件将在后续案例中用到时逐一介绍。

5.1  用户界面:窗体

VBA的用户界面称为“窗体”,英文名称叫Form。

创建一个新窗体的方法是:右击工程名,从下拉菜单中选择“插入/用户窗体”,如下图所示。

完成后,工程目录下会出现一个新的默认窗体对象:

窗体出现在右侧代码区:

窗体的各项属性出现在左下方的属性窗口中:

窗体的默认名称是“UserForm1”,这也是出现在工程资源管理器中的名称。这个名称可以在属性窗口中更改,除了要符合VBA的命名规则外,不能与已有的对象名或关键字重名,否则系统会提示出错。也可以使用中文命名,但最好用英文,以防万一。

显示在窗体标题栏中的字,它的属性名叫“Caption”,可以在属性窗口的Caption那栏修改。在属性窗口可以设置窗体的各种属性,如长宽、背景色、背景图、字体字号、滚动条……等等。

现在我把窗体改名为“myForm1”,标题栏改为“随机圆 v1.0”。

先来看看窗体的打开效果。

打开窗体的指令是:

 

myForm1.Show

 

如果你的窗体名不是myForm1而是别的名字,则替换成你的窗体名即可。

我们把显示Helloworld的指令替换成显示窗体,对Open子程序中的代码做如下更改:

 

Private Sub Document_Open()

‘MsgBox “Hello world !”

myForm1.show

End Sub

 

显示Hello world的语句MsgBox “Hello world !”并没有删除,只是在前面加了一个单引号,将其改为不执行的注释内容。在后面增加了显示窗体的语句。

重新打开Helloworld.cdr,可以看到弹出的窗体。

我们发现,这时CorelDraw啥也不能做了,除非把这个窗体关掉。这种窗体叫“模式对话框”。如果希望窗体在打开的时候还能正常进行其他操作,就要把它改为“非模式对话框”,具体方法是在属性窗口中把它的“ShowModal”属性改为False。

VBA默认的窗体没有最大和最小化按钮。要加上这两个按钮需要编写一些代码,后面再细讲。

5.2  控件:按钮

窗体上的按钮、文本框、单选框、复选框、下拉菜单、图片、标签、滚动条等,都叫“控件”。

可以通过工具箱为窗体添加控件。工具箱如下图所示:

工具箱是悬浮在IDE界面上的,如果不小心关闭了,可以点击工具栏上的

按钮或 “视图/工具箱”菜单令其重新出现。

下面在窗体上做一个按钮:把工具箱里的按钮控件

直接拖到myForm1中,或者先点击按钮控件,再在myForm1中拖拽出满意的大小。

点选中刚建立的按钮,左下方的属性窗口会切显示当前选中的控件的属性:

把按钮名称和Caption(按钮上显示的字)分别改为“DrawCircles”和“画随机圆”。

点击按钮所产生的行为称为“按钮事件”。现在这个按钮是空的,对话框显现时点击它什么也不会发生。为一个按钮添加事件方法是双击该按钮,会看到生成了如下一个空的子程序:

 

Private Sub DrawCircles_Click()

 

End Sub

 

这个子程序的名称是“DrawCircles_Click”,这个是自动定义的,不能改。

把我们希望这个按钮做的事情写在这个子程序里,点击按钮时就会执行它们了。把刚才写好的画圆程序代码复制过来(只复制中间部分,不包括头尾两行的子程序定义语句):

 

Private Sub DrawCircles_Click()

Dim i As Integer

Dim s1 As Shape

Dim x As Double, y As Double, r As Double

For i = 1 To 100

x =ActivePage.LeftX + Rnd * ActivePage.SizeWidth ‘圆心x坐标

y =ActivePage.BottomY + Rnd * ActivePage.SizeHeight ‘圆心y坐标

r = 0.02 *ActivePage.SizeWidth + Rnd * (0.08 * ActivePage.SizeWidth)

Set s1 =ActiveLayer.CreateEllipse2(x, y, r, r, 90#, 90#, False)

s1.Fill.UniformColor.RGBAssign Rnd * 255, Rnd * 255, Rnd * 255  ‘填色

Next

End Sub

 

把光标移入上述子程序内部,点

按钮(左边的三角形)重新测试一下。下面是我们制作的新界面:

窗体出现后点击按钮“画随机圆”,会得到跟刚才不一样的100个圆。

5.3   控件:文本输入框、标签

现在在窗体上增加一个文本输入框,让用户输入一个数字,指示程序画多少个圆。

把工具箱里的文本框

拖到窗体中,拖拽出满意大小。

文本框控件的默认名称是TextBox1,将其改为nCircles,即要画圆的数量,这是我命名的一个习惯,小写的n开头的都表示整数。可以为其指定一个默认值。在文本框的属性窗口找到Value属性,将其设置为50,作为默认值。

为了让用户知道这个文本框的含义,需要在前面写几个提示字,比如“画圆数量”。可以用“标签”控件来完成这个任务。从工具箱里把标签控件

拖到文本框前面,修改为合适大小。标签的默认内容是“Label1”,将其属性窗口的Caption属性更改为“画圆数量”。

现在文本框nCircles里的数字变量值有了一个正式的名称:nCircles.Value。在窗体myForm1中的任何事件、子程序都可以使用这个变量来获取用户输入的数字。

为了让这个变量起作用,我们把上节代码中的For i=1 to 100改为 For i=1 tonCircles.Value,其他不变:

 

Private Sub DrawCircles_Click()

Dim i As Integer

Dim s1 As Shape

Dim x As Double, y As Double, r As Double

For i = 1 To nCircles.Value

x =ActivePage.LeftX + Rnd * ActivePage.SizeWidth

y =ActivePage.BottomY + Rnd * ActivePage.SizeHeight

r = 0.02 *ActivePage.SizeWidth + Rnd * (0.08 * ActivePage.SizeWidth)

Set s1 =ActiveLayer.CreateEllipse2(x, y, r, r, 90#, 90#, False)

s1.Fill.UniformColor.RGBAssign Rnd * 255, Rnd * 255, Rnd * 255

Next

End Sub

 

重新运行程序,会得到如下对话框:

点击按钮“画随机圆”,在当前页面中得到50个圆。修改50为其他数字,会得到相应数量的圆。

如果想让用户指定圆的最小半径与最大半径,可以再增加两个文本框:

最小半径和最大半年的文本框控件名分别为minR和maxR,则它们的变量名分别为minR.Value和maxR.Value。程序变为:

 

Private Sub DrawCircles_Click()

Dim i As Integer

Dim s1 As Shape

Dim x As Double, y As Double, 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)

s1.Fill.UniformColor.RGBAssign Rnd * 255, Rnd * 255, Rnd * 255

Next

End Sub

 

运行结果如下图所示:

5.4  控件的事件

“事件”(Event)是指一个控件上可以发生的事情,以子程序(Sub)的形式定义。不同类型的控件的事件有所不同。

比如对按钮控件,它的事件包括单击、双击、左键按下、左键抬起、鼠标划过、回车等。

双击一个新建立的按钮,会自动为该按钮创建一个“单击”事件,如上节的代码。

如果要为按钮建立其他的事件,可以按如下步骤进行:

1)进入对话框的代码窗口,可以双击对话框令其显示,然后点击工程资源管理器窗口右上角的查看代码按钮(并列三个按钮的第一个),则切换到代码窗口:

第二个按钮是“查看对象”,也就是切换到对话框的设计界面。第三个按钮是切换文件夹显示状态,默认是以类似资源管理器的树状文件夹组织形式排列各类资源,窗体、模块、类模块等放在单独的文件夹里;点击该按钮会切换到统一排列方式,文件夹拆散,各类资源按字母顺序统一排列。

2)点开代码窗口左上角的控件列表下拉框,这里列出了所有已定义过的控件,从中找到要处理的控件,如DrawCircles按钮:

3)点开代码窗口右上角的事件列表下拉框,这里列出了所有该控件可以接受的事件,从中找到要添加的事件,如按键事件:

按键事件的名称为KeyPress,当DrawCircles按钮处于焦点状态时,用户按下键盘上的任何一个键,都会触发这个事件。

单击按钮事件的名称为Click——它以黑体显示,表示该事件已经被定义过。

4)点击要添加的事件(如KeyPress),会在代码窗口生成一个新的子程序(Sub)来定义该事件:

 

Private Sub DrawCircles_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

 

End Sub

 

括号内的参数可以不用管,基本用不到。

5)在按钮事件子程序的Sub和End Sub之间添加响应动作,即用户按键时需要做的事情。这里就让它简单地弹出一个对话框告诉用户他按下了哪个键,以及该键的“键码”,即该键对应的ASCII编码值。

 

Private Sub DrawCircles_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

MsgBox “键码 ” & KeyAscii & ” 对应按键:” & Chr(KeyAscii)

End Sub

 

KeyPress事件的KeyAscii参数是用户按下的键的ASCII码值,Chr()函数的作用是把ASCII码转换为键盘上的字符,让用户知道按下了哪个键,因为ASCII码是一系列的数字编号,用户并不知道他们分别对应的是键盘上的什么键。

6)运行程序,测试事件。

程序运行后,界面出现。首先要把“焦点”转换到DrawCircles按钮上。

比较上图两个按钮的视觉状态区别,现在焦点是在“画随机圆”按钮上,它上面有个虚线框。如果焦点不在指定的按钮上,可以通过多次按tab键让焦点在各个控件上切换,直至切换到正确的控件上。也可以在控件上点鼠标右键来迅速完成焦点切换。

此时按下键盘上的任何一个键,比如“d”或“D”,会得到如下对话框:

现在我们知道了“d”键的ASCII码值是100,“D” 键的ASCII码值是68。

http://mip.i3geek.com

Leave a Reply

搜索

分类目录

公 告

本网站学习论坛:

www.zhlisp.com

lisp中文学习源码:

https://github.com/zhlisp/

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

加QQ群学习交流。