在PowerBuilder中所有尺度都是用PowerBuilder单位(PBU)计量的,惟一例外是Window和DataWindow画扳网格尺寸,这是用像素计量。PowerBuilder中的计量使用和Windows中相同的技术,都是基于系统字体。不同的是,Windows中采用系统字体宽度的
1
/
4
和高度的
1
/
8
,而PowerBuilder中采用系统字体宽度的
1
/
32
和高度的
1
/
64
,从而可以提供比Windows中更高的分辨率。但是,用户在PowerBuilder应用程序中调用外部函数来获取对象的尺寸或位置时就应该进行相应的转换。好在PowerBuilder本身也提供了进行单位换算的函数,所以应该尽量使用PowerBuilder本身的单位换算函数。
函数UnitsToPixels()用于将PBU值换算成像素值。它的语法格式是:
UnitsToPixels(units,
type
)
其中,Units是一个整型数值,是要转换成像素值的PBU值;
Type
是一个ConvertType类型的枚举值,可以是:
XUnitsToPixels!表示要转换成水平方向上的像素值;
YUnitsToPixels!表示要转换成垂直方向上的像素值。
函数成功执行将返回转换后的像素值,如果执行错误,则返回-
1
,如果有参数NULL,则返回NULL。
函数PixelsToUnits用于将像素值转换算成PBU值。它的语法格式是:
PixelsToUnits(pixels,
type
)
各个参数的意义和上面函数的完全相同,执行的功能相反,是将指定像素值转换成指定方向上的PBU值。
因为所有窗口在打开时都有居中问题,所以可以使用全局函数解决这个问题,以便在应用中的所有窗口都可以调用该函数。该函数的脚本如下:
//------------------------------------------------
//功能:将窗口移到屏幕的中央
//参数:aw_window 要处理的窗口
//返回值:(none)
//调用举例:gf_window_center(w_pay_mode)
//------------------------------------------------
Environment le_env
integer
li_iscreenHeight,li_screenWidth
long ll_posx,ll_posy
GetEnvironment(le_env)
li_screenHeight = PixelsToUnits(le_env
.
screenHeight,YPixelsToUnits!)
li_screenWidth = PixelsToUnits(le_env
.
screenWidth,XPixelsToUnits!)
if
aw_window
.
width > li_screenWidth
then
ll_posx =
1
else
ll_posy = (li_screenWidth - aw_window
.
width)/
2
end
if
if
aw_window
.
height > li_screenHeight
then
ll_posy =
1
else
ll_posy = (li_screenHeight - aw_window
.
Height)/
2
end
if
aw_window
.
Move(ll_posx,ll_posy)
上面的脚本用函数GetEnvironment获取当前的环境信息,并将其成员变量ScreenWidth和ScreenHeight转换成PBU值,然后减去当前窗口的宽(高),取差值的
1
/
2
即为窗口居中时的起始坐标。
有时窗口的位置要恢复到用户上次使用时的情况,可以借助于ini文件。在窗口关闭时将窗口的位置信息保存在一个特定的ini文件中,当窗口打开时再将这些位置信息读出并用来设置窗口的位置。
当用户对窗口的大小进行调整时,窗口中的控件也应该相应地调整其大小和位置,这样才能保证整个窗口中控件的布局相对不动。可以在调整窗口大小的同时调整窗口中的控件及其相对位置,可以在窗口的Resize事件中编写脚本。首先定义如下实例变量:
integer
ii_width,ii_height
在窗口的open事件中:
ii_width = this
.
width
ii_height = this
.
height
在窗口的Resize事件中:
integer
li_value
DragObject lw_obj
for
li_value =
1
to
upperbound(this
.
control[])
lw_obj = control[li_value]
lw_obj
.
x = lw_obj
.
x * (newwidth / ii_width)
lw_obj
.
width = lw_obj
.
width * (newwidth / ii_width)
lw_obj
.
y = lw_obj
.
y * (newheight / ii_height)
lw_obj
.
height = lw_obj
.
height * (newheight / ii_height)
next
ii_width = newwidth
ii_height = newheight
其中,NewWidth和NewHeight是窗口Resize事件的参数,可以直接使用。NewWidth/ii_width是横向变动比例,NewHeight/ii_height是纵向变动比例。Control[]是窗口的一个属性