摘要针对因窗口大小的调整而出现的各类问题,本文提出了解决这类问题的技术、方法及有关的注意事项,并给出了用VB编写的范例程序。
关键词软件界面;同比例缩放;实现技术;VB;对象变量
1引言
界面是软件的脸面!软件是否好用、能否被用户所接受,界面起着很重要的作用。然而,在我们所使用的各类软件中,常常出现软件界面因窗口大小的调整而发生变化,以至于出现捉襟见肘、比例失调甚至“献丑”的窘境;也正因如此,许多软件开发者又采用较为保守的设计思想,将软件界面设计成Fixed,禁止用户调整大小;还有一些软件在改变显示分辨率后出现界面不完整的现象,如Windows的显示属性对话框,当显示分辨率从1024×768调整到640×480时,无法看到界面底部的三个关键按钮:“确定”、“取消”和“应用”;除非重新启动计算机!这一切均给用户带来诸多不便,究其根源还在于开发者只重视了软件初始界面的设计,而对软件窗口缩放后所出现的缺陷或估计不足或缺乏对策。能否让软件界面的大小随用户的需求自由改变,而界面中的各个对象随窗口同缩放,做到软件界面始终美丽如初呢?为此,笔者进行了有益的探索,并在VB中得以实现。
2实现技术
为了保证软件界面始终如一、自适应各种窗口大小,必须做到窗口中的各个对象以及对象的字号、图像等属性随窗口同缩放。为此,在软件启动时首先要用全局数组将原始窗口的大小以及窗口中各个对象的大小、位置及字号等记录下来。然后在窗口的Resize事件中进行判断和调整:当窗口宽度改变时,窗口的放大率K=现窗口宽度÷原始窗口宽度,为保证窗口的比例不变,窗口的高度应调整到原始窗口高度的K倍;反之,当窗口高度改变时,窗口的放大率K=现窗口高度÷原始窗口高度,同样需将窗口的宽度调整到原始窗口宽度的K倍;如果窗口的宽高同时改变,则视为窗口的宽度改变即可。最后,为保证窗口中的各个对象同比例缩放,对象的大小(Width、Height属性)、位置(Left、Right属性)及字号(FontSize属性)也应在其原始值的基础上乘以K。
为了实现上述功能,用一个二维的全局数组记录每一个对象的Left、Top、Width、Height和FontSize属性,然后以对象变量和二维数组的行索引为参数定义两个通用过程GetData和SetData,前者用于获取对象的原始属性值,后者用于设置对象的新属性值。
此外,还要注意以下几个问题:
(1)软件启动时,如果窗口的宽度大于屏幕的宽度或窗口的高度大于屏幕的高度时,应使其与屏幕同宽或同高,以避免出现类似于Windows的显示属性对话框在分辨率变化时所出现的尴尬局面。
(2)一般应用软件的窗口在最大化时会以屏幕的尺寸为依据进行双向调整,这样就会破坏原有窗口的比例。如果想让窗口最大化但又不想破坏窗口的比例,那么在最大化按钮被单击时,首先使窗口的左上角与屏幕的左上角重合,然后使窗口的一边与屏幕同宽或同高,另一边则按比例放大;究竟要将哪一边调整到屏幕的尺寸要看窗口的宽高比值:若窗口偏宽(窗口宽高比>屏幕宽高比),那么应以屏幕宽度为准作为窗口的宽度,否则应以屏幕高度为准作为窗口的高度;这样可以保证比例不变,而窗口尽可能最大化。
(3)当窗口的高度被调整到非常小,甚至只剩标题栏的高度时,应以窗口的最小宽度(有最大化等按钮时,其值约为1700Twip)为准调整窗口的高度。
(4)对于界面中所显示的图像,最好用图像控件Image作为对象,因为此类控件一般都有拉伸属性Stretch,只要将其设置成True后显示在其中的图像就会随图像框的伸缩而自动拉伸,始终呈现给用户的是一幅完整的图像。
3范例程序3.1界面设计
启动VB后在窗体中添加四个控件:一个图像框控件Img(先将拉伸属性Stretch设置成True,然后用Picture属性添加一幅图片)、一个标签控件Lab(将AutoSize属性设置成True,并设置好标题)、一个文本框控件Txt(将MultiLine属性设置成True,并设置好文本)和一个按钮控件Cmd(将标题改为“界面增幅10%”,单击此按钮时窗口及各个对象放大10%)。软件界面如图1所示。3.2编写代码
DimLastWidth%''''窗体上一次的宽度
Dima%(1To5,1To5)''''对象的原始数据
DimkAsSingle''''窗口的放大率
PrivateSubGetData(OAsObject,nAsInteger)
OnErrorResumeNext
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
Ifn=1Thena(1,4)=O.ScaleHeight:LastWidth=a(1,4)
EndSub
PrivateSubSetData(OAsObject,nAsInteger)
OnErrorResumeNext
O.Left=a(n,1)*k
O.Top=a(n,2)*k
O.Width=a(n,3)*k
O.Height=a(n,4)*k
O.FontSize=a(n,5)*k
EndSub
PrivateSubForm_Load()
GetDataFrm,1
GetDataImg,2
GetDataLab,3
GetDataTxt,4
GetDataCmd,5
IfMe.Width>Screen.WidthOrMe.Height>Screen.HeightThenMe.WindowState=2
EndSub
PrivateSubForm_Resize()
IfMe.WindowState=1ThenExitSub''''最小化
IfMe.WindowState=2Then''''最大化
Me.WindowState=0
Me.Move0,0
IfScreen.Width/Screen.Height>=a(1,3)/a(1,4)Then
Me.Height=Screen.Height
Else
Me.Width=Screen.Width
EndIf
EndIf
IfLastWidth<>Me.WidthThen''''宽度变化
k=Me.Width/a(1,3)
Me.Height=a(1,4)*k+395
Else''''高度变化
k=Me.ScaleHeight/a(1,4)
Me.Width=a(1,3)*k
EndIf
SetDataImg,2
SetDataLab,3
SetDataTxt,4
SetDataCmd,5
IfMe.Height<=a(1,4)/a(1,3)*1680Then
Me.Height=a(1,4)/a(1,3)*1680+395
EndIf''''保证最小窗口也成比例
LastWidth=Me.Width
EndSub
PrivateSubCmd_Click()
Me.Width=Me.Width*1.1
EndSub
3.3运行情况
程序运行后,不管是拉伸边框、单击放大10%按钮,还是单击最大化按钮,窗口中的四个对象同比例进行缩放,屏幕上始终看到的是一个如图1所示的完整的比例不变的界面。
4结束语
本文虽然给出的范例程序是基于VB编写的,但文中所谈的技术和方法同样适用于VC++、Delphi、C++Builder等面向对象的编程语言。
参考文献
[1]张立科.VisualBasic6.0程序设计参考手册[M].北京:人民邮电出版社,2003年
[2]美StevenHolzner.VisualBasic技术内幕[M].北京:机械工业出版社,1999年