论文部分内容阅读
摘 要:本文针对各类课件因窗口大小的调整或屏幕分辨率的不同而出现的有关界面方面的问题,提出了用高级语言制作课件时解决这类问题的技术和方法,并给出了用VB编写的范例课件。
关键词:课件界面;控件对象集合;VB范例
中图分类号:G434 文献标识码:A 文章编号:1673-8454(2008)14-0044-03
一、引言
界面是课件的脸面,课件是否好用、能否被用户所接受,界面起着很重要的作用。然而,课件的界面常常因窗口大小的调整而发生变化,以至于出现捉襟见肘、比例失调甚至“献丑”的窘境;也正因如此,许多课件开发者又采用较为保守的设计思想,将课件界面设计成禁止用户调整大小。此外,课件界面的完整性、美观程度与屏幕分辨率的设置也有一定的关系,课件开发者所使用的电脑的屏幕分辨率往往就是课件运行的最佳屏幕分辨率,并在使用说明书中明确告知用户。如果用户的屏幕不在“最佳状态”情况会如何呢?若运行在较低的屏幕分辨率下,课件窗口可能会超出屏幕范围而出现界面不完整的现象,以至于某些对象在屏幕之外而无法操作;若运行在较高的屏幕分辨率下,课件界面比例缩小而影响美观。这些情况均给用户带来诸多不便。究其根源还在于开发者只重视了课件初始界面的设计,而对课件窗口缩放或屏幕分辨率调整后所出现的缺陷或估计不足或缺乏对策。
目前,显示器正在从4∶3的标准屏幕向16∶9的宽屏过渡,今后将面临的界面问题会愈加突出。能否让课件界面的大小及屏幕分辨率随用户的需求自由改变,而课件界面中的各个对象随窗口和屏幕同缩放,做到课件界面始终如一、美丽如初呢?为此,笔者进行了有益的尝试,探索出了用高级语言制作课件时解决这类问题的技术和方法。文中就有关设计思想和实现技术做了详细介绍,并给出了用最常用的课件编程语言VB编写的范例课件。
二、设计思想
为了保证课件界面始终如一、能自适应各种屏幕分辨率和各种窗口大小,必须做到让窗口中各个对象的位置、大小、字号、图像等属性随窗口同缩放,而且当窗口的尺寸超过屏幕尺寸时能自动对窗口的大小进行调整。为此,在课件启动时需将课件原始窗口的大小以及窗口中各个对象的位置、大小及字号等记录下来。
然后在改变窗口大小的Resize事件中进行判断和调整:当窗口宽度改变时,窗口的放大率k=窗口当前宽度÷窗口原始宽度,为保证窗口的纵横比例不变,窗口的当前高度应调整到窗口原始高度的k倍;反之,当窗口高度改变时,窗口的放大率k=窗口当前高度÷窗口原始高度,同样需将窗口的当前宽度调整到窗口原始宽度的k倍;如果窗口的宽度和高度同时改变,则按窗口的宽度改变来处理即可。
最后,为保证窗口中的各个对象同比例缩放,对象的大小(Width、Height属性)、位置(Left、Right属性)及字号(FontSize属性)等属性值也应在其原始值的基础上乘以k。
三、实现技术
为了实现上述设计思想及相应的功能,需要用一个N行5列的二维全局数组来记录窗体及所有控件的Left、Top、Width、Height和FontSize属性,其中N=控件总数 1(另加窗体)。为了使程序具有普适性,该数组的行数N由程序自动计算并确定下来,即数组是动态的;对于没有相关属性的控件,程序可通过容错的途径来解决。
1. 对象原始数据的获取
每一个窗体中的所有控件组成了一个控件对象集合Controls,借助该集合不仅可以统计出窗体中控件的总数,而且还可以直接访问所有的控件。获取原始数据的具体方法为:在窗体加载时先统计出窗体中控件的个数,并由此定义二维动态数组的行数,然后通过控件对象集合及控件索引依次取出所有控件(含窗体)的相关属性并保存在数组中。其VB代码如下:
Dim a() As Single, CC As Integer, k As Single, t As Single
Private Sub Form_Load()
Dim O As Object, n As Integer
CC = Controls.Count ’控件的个数
ReDim a(0 To CC, 1 To 5) As Single
On Error Resume Next ’容错
For n = 0 To CC
If n = CC Then Set O = Me Else Set O = Controls(n)
a(n, 1) = O.Left
a(n, 2) = O.Top
a(n, 3) = O.Width
a(n, 4) = O.Height
a(n, 5) = O.FontSize
Set O = Nothing
Next n
End Sub
2. 对象相应属性的重新调整
每当窗体的大小被改变时,窗体中所有控件的大小、位置和字号等属性需要根据放大率k进行重新调整;此外,如果窗体界面中有直接输出的文本信息,窗体的字号也要放大k倍。为了实现这一功能,要从二维动态数组中先取出对象的原始属性值,然后借助控件对象集合及控件索引来设置所有控件的当前属性值。为此,可定义一个名为ResizeControls的通用过程,并放在窗体的Resize事件中进行调用。
Private Sub ResizeControls()
Dim n As Integer
On Error Resume Next ’容错
For n = 0 To CC - 1
Controls(n).Move a(n, 1) * k, a(n, 2) * k
Controls(n).FontSize = a(n, 5) * k
Controls(n).Width = a(n, 3) * k
Controls(n).Height = a(n, 4) * k
Next n
FontSize = a(n, 5) * k ’窗体字号
End Sub
3. 特殊情况的处理
课件启动时,如果屏幕分辨率较低应避免窗口的尺寸超出屏幕的范围。
窗口最大化时会以屏幕的尺寸为依据进行双向调整,这样就破坏了原有窗口的纵横比例。如果想让窗口最大化但又不想破坏原窗口的比例,那么在最大化按钮被单击时,首先要取消最大化状态,然后依据窗口的宽高比与屏幕的宽高比之间的大小关系使窗口偏大的一边与屏幕对齐,另一边则按比例放大。
当窗口的高度被调整到非常小,甚至只剩标题栏的高度时,应以窗口的最小宽度(有最大化等按钮时,其值约为1680 Twips)为准调整窗口的高度。
上述情况的处理以及设计思想的实现可在以下调整窗口大小的Resize事件中得以体现。
Private Sub Form_Resize()
Static LastWidth As Integer, MiniHeight As Integer
If Width > Screen.Width Or Height > Screen.Height Then WindowState = vbMaximized
If WindowState = vbMinimized Then Exit Sub
If WindowState = vbMaximized Then
WindowState = vbNormal
Move 0, 0
If Screen.Width / Screen.Height >= a(CC, 3) / a(CC, 4) Then
Height = Screen.Height
Else
Width = Screen.Width
End If
End If
MiniHeight = a(CC, 4) / a(CC, 3) * 1680 Height - ScaleHeight
If Height < MiniHeight Then Height = MiniHeight ’最小窗口也成比例
If LastWidth <> Width Then ’宽度变化
k = Width / a(CC, 3)
Height = a(CC, 4) * k Height - ScaleHeight
Else ’高度变化
k = ScaleHeight / a(CC, 4)
Width = a(CC, 3) * k
End If
If LastWidth = Width Then Exit Sub
LastWidth = Width
Call ResizeControls
Call HSB_Change ’执行本范例程序所需
End Sub
4. 其它问题的应对策略
如果在课件界面中要动态绘制图形,绘图时应以绘图对象的相对尺寸为坐标,这样可以保证绘图对象大小变化时其刻度数不变,从而使绘出的图形在窗口大小变化时也能同比例缩放。
如果界面中要显示图像,可采用以下方法来实现缩放。
方法一:用图像控件Image作为对象。Image控件有拉伸属性Stretch,只要将其设置成True后显示在其中的图像就会随图像框的伸缩而自动拉伸,始终呈现给用户的是一幅完整的图像。
方法二:用PaintPicture方法。先将图像添加到一个Image控件,并将其Visible属性设置成False,在Resize事件中从该控件中取出图像并用PaintPicture方法粘满所要显示的对象(以下范例中使用的就是这种方法)。
四、VB范例课件
为了验证有关设计思想和实现技术,本文提供了这款模拟小球在有阻尼的情况下弹跳运动的课件。其数学模型为y=A.|cos(t)|.e-t/B,课件运行窗口如图1所示。
1. 界面设计
启动VB后在窗体中添加以下控件:图像框Img(Stretch=True、Visible=False,并添加一幅图片)、文本框Txt(MultiLine=True,并设置好文本)、图片框Pic(Align=2)、形状Shp(设置成圆并填充成红色)、计时器Timer1(Interval=10)、框架Frame1以及放入框架中的滚动条HSB(Min=1,Max=100)和有关的标签。
2. 编写代码
为实现本课件的功能,除上述三段通用代码外,还需要编写以下代码:
Private Sub HSB_Change()
Lab2.Caption = "-t/"
关键词:课件界面;控件对象集合;VB范例
中图分类号:G434 文献标识码:A 文章编号:1673-8454(2008)14-0044-03
一、引言
界面是课件的脸面,课件是否好用、能否被用户所接受,界面起着很重要的作用。然而,课件的界面常常因窗口大小的调整而发生变化,以至于出现捉襟见肘、比例失调甚至“献丑”的窘境;也正因如此,许多课件开发者又采用较为保守的设计思想,将课件界面设计成禁止用户调整大小。此外,课件界面的完整性、美观程度与屏幕分辨率的设置也有一定的关系,课件开发者所使用的电脑的屏幕分辨率往往就是课件运行的最佳屏幕分辨率,并在使用说明书中明确告知用户。如果用户的屏幕不在“最佳状态”情况会如何呢?若运行在较低的屏幕分辨率下,课件窗口可能会超出屏幕范围而出现界面不完整的现象,以至于某些对象在屏幕之外而无法操作;若运行在较高的屏幕分辨率下,课件界面比例缩小而影响美观。这些情况均给用户带来诸多不便。究其根源还在于开发者只重视了课件初始界面的设计,而对课件窗口缩放或屏幕分辨率调整后所出现的缺陷或估计不足或缺乏对策。
目前,显示器正在从4∶3的标准屏幕向16∶9的宽屏过渡,今后将面临的界面问题会愈加突出。能否让课件界面的大小及屏幕分辨率随用户的需求自由改变,而课件界面中的各个对象随窗口和屏幕同缩放,做到课件界面始终如一、美丽如初呢?为此,笔者进行了有益的尝试,探索出了用高级语言制作课件时解决这类问题的技术和方法。文中就有关设计思想和实现技术做了详细介绍,并给出了用最常用的课件编程语言VB编写的范例课件。
二、设计思想
为了保证课件界面始终如一、能自适应各种屏幕分辨率和各种窗口大小,必须做到让窗口中各个对象的位置、大小、字号、图像等属性随窗口同缩放,而且当窗口的尺寸超过屏幕尺寸时能自动对窗口的大小进行调整。为此,在课件启动时需将课件原始窗口的大小以及窗口中各个对象的位置、大小及字号等记录下来。
然后在改变窗口大小的Resize事件中进行判断和调整:当窗口宽度改变时,窗口的放大率k=窗口当前宽度÷窗口原始宽度,为保证窗口的纵横比例不变,窗口的当前高度应调整到窗口原始高度的k倍;反之,当窗口高度改变时,窗口的放大率k=窗口当前高度÷窗口原始高度,同样需将窗口的当前宽度调整到窗口原始宽度的k倍;如果窗口的宽度和高度同时改变,则按窗口的宽度改变来处理即可。
最后,为保证窗口中的各个对象同比例缩放,对象的大小(Width、Height属性)、位置(Left、Right属性)及字号(FontSize属性)等属性值也应在其原始值的基础上乘以k。
三、实现技术
为了实现上述设计思想及相应的功能,需要用一个N行5列的二维全局数组来记录窗体及所有控件的Left、Top、Width、Height和FontSize属性,其中N=控件总数 1(另加窗体)。为了使程序具有普适性,该数组的行数N由程序自动计算并确定下来,即数组是动态的;对于没有相关属性的控件,程序可通过容错的途径来解决。
1. 对象原始数据的获取
每一个窗体中的所有控件组成了一个控件对象集合Controls,借助该集合不仅可以统计出窗体中控件的总数,而且还可以直接访问所有的控件。获取原始数据的具体方法为:在窗体加载时先统计出窗体中控件的个数,并由此定义二维动态数组的行数,然后通过控件对象集合及控件索引依次取出所有控件(含窗体)的相关属性并保存在数组中。其VB代码如下:
Dim a() As Single, CC As Integer, k As Single, t As Single
Private Sub Form_Load()
Dim O As Object, n As Integer
CC = Controls.Count ’控件的个数
ReDim a(0 To CC, 1 To 5) As Single
On Error Resume Next ’容错
For n = 0 To CC
If n = CC Then Set O = Me Else Set O = Controls(n)
a(n, 1) = O.Left
a(n, 2) = O.Top
a(n, 3) = O.Width
a(n, 4) = O.Height
a(n, 5) = O.FontSize
Set O = Nothing
Next n
End Sub
2. 对象相应属性的重新调整
每当窗体的大小被改变时,窗体中所有控件的大小、位置和字号等属性需要根据放大率k进行重新调整;此外,如果窗体界面中有直接输出的文本信息,窗体的字号也要放大k倍。为了实现这一功能,要从二维动态数组中先取出对象的原始属性值,然后借助控件对象集合及控件索引来设置所有控件的当前属性值。为此,可定义一个名为ResizeControls的通用过程,并放在窗体的Resize事件中进行调用。
Private Sub ResizeControls()
Dim n As Integer
On Error Resume Next ’容错
For n = 0 To CC - 1
Controls(n).Move a(n, 1) * k, a(n, 2) * k
Controls(n).FontSize = a(n, 5) * k
Controls(n).Width = a(n, 3) * k
Controls(n).Height = a(n, 4) * k
Next n
FontSize = a(n, 5) * k ’窗体字号
End Sub
3. 特殊情况的处理
课件启动时,如果屏幕分辨率较低应避免窗口的尺寸超出屏幕的范围。
窗口最大化时会以屏幕的尺寸为依据进行双向调整,这样就破坏了原有窗口的纵横比例。如果想让窗口最大化但又不想破坏原窗口的比例,那么在最大化按钮被单击时,首先要取消最大化状态,然后依据窗口的宽高比与屏幕的宽高比之间的大小关系使窗口偏大的一边与屏幕对齐,另一边则按比例放大。
当窗口的高度被调整到非常小,甚至只剩标题栏的高度时,应以窗口的最小宽度(有最大化等按钮时,其值约为1680 Twips)为准调整窗口的高度。

上述情况的处理以及设计思想的实现可在以下调整窗口大小的Resize事件中得以体现。
Private Sub Form_Resize()
Static LastWidth As Integer, MiniHeight As Integer
If Width > Screen.Width Or Height > Screen.Height Then WindowState = vbMaximized
If WindowState = vbMinimized Then Exit Sub
If WindowState = vbMaximized Then
WindowState = vbNormal
Move 0, 0
If Screen.Width / Screen.Height >= a(CC, 3) / a(CC, 4) Then
Height = Screen.Height
Else
Width = Screen.Width
End If
End If
MiniHeight = a(CC, 4) / a(CC, 3) * 1680 Height - ScaleHeight
If Height < MiniHeight Then Height = MiniHeight ’最小窗口也成比例
If LastWidth <> Width Then ’宽度变化
k = Width / a(CC, 3)
Height = a(CC, 4) * k Height - ScaleHeight
Else ’高度变化
k = ScaleHeight / a(CC, 4)
Width = a(CC, 3) * k
End If
If LastWidth = Width Then Exit Sub
LastWidth = Width
Call ResizeControls
Call HSB_Change ’执行本范例程序所需
End Sub
4. 其它问题的应对策略
如果在课件界面中要动态绘制图形,绘图时应以绘图对象的相对尺寸为坐标,这样可以保证绘图对象大小变化时其刻度数不变,从而使绘出的图形在窗口大小变化时也能同比例缩放。
如果界面中要显示图像,可采用以下方法来实现缩放。
方法一:用图像控件Image作为对象。Image控件有拉伸属性Stretch,只要将其设置成True后显示在其中的图像就会随图像框的伸缩而自动拉伸,始终呈现给用户的是一幅完整的图像。
方法二:用PaintPicture方法。先将图像添加到一个Image控件,并将其Visible属性设置成False,在Resize事件中从该控件中取出图像并用PaintPicture方法粘满所要显示的对象(以下范例中使用的就是这种方法)。
四、VB范例课件
为了验证有关设计思想和实现技术,本文提供了这款模拟小球在有阻尼的情况下弹跳运动的课件。其数学模型为y=A.|cos(t)|.e-t/B,课件运行窗口如图1所示。
1. 界面设计
启动VB后在窗体中添加以下控件:图像框Img(Stretch=True、Visible=False,并添加一幅图片)、文本框Txt(MultiLine=True,并设置好文本)、图片框Pic(Align=2)、形状Shp(设置成圆并填充成红色)、计时器Timer1(Interval=10)、框架Frame1以及放入框架中的滚动条HSB(Min=1,Max=100)和有关的标签。
2. 编写代码
为实现本课件的功能,除上述三段通用代码外,还需要编写以下代码:
Private Sub HSB_Change()
Lab2.Caption = "-t/"