PB窗口居中的实现方法

(1)直接使用PB窗口中的center属性(PB9及以上版本才有该属性)。这种方法最为简单,但是明眼人都可以看出问题来:窗口上下并没有真正的居中,窗口被过分的往上抬了。

(2)为了解决这个问题,大多数程序中都使用自定义的函数来实现窗口居中,实现方法无非就是先获取屏幕宽度及高度,再获取窗口宽度和高度,然后再算出使得窗口能够居中的x值和y值。(pb9以前的版本也是用这个方法来实现的)

在PB9.0之下的版本中,因为窗口没有属性‘Center’,必须自己编写程序,使窗口居中。下面这个公用函数考虑的自认为比较全面,在PB9.0之前的版本中都还是非常有用的。

转自 http://demo.netfoucs.com/u012369435/article/details/36438473<br><br>在一定的屏幕分辨率下开发的应用程序到别的计算机上运行时,很可能遇到和开发环境中的分辨率不同的情况,这时要保证窗口界面仍然显示居中,就得在开发时考虑这个问题。解决方法是在窗口打开时判断屏幕的分辨率,根据分辨率来决定窗口显示的位置。要用到两个单位换算函数和一个获取运行环境信息的函数。

在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值。

因为所有窗口在打开时都有居中问题,所以可以使用全局函数解决这个问题,以便在应用中的所有窗口都可以调用该函数。该函数的脚本如下: 

 

//*************************************************************
//* 功能:    将窗口移到屏幕的中央
//* 参数1:    aw_window  要处理的窗口
//* 返回值:  (none)
//* 调用举例:gf_window_center(w_pay_mode) //将窗口置于屏幕的中央
//************************************************************
environment le_env
int li_ScreenHeight, li_ScreenWidth
long ll_posx,ll_posy

GetEnvironment(le_env)
if IsValid(w_main) then
li_ScreenHeight = w_main.MDI_1.Height
li_screenwidth = w_main.MDI_1.Width
else
li_ScreenHeight = PixelsToUnits(le_env.screenheight,YPixelsToUnits!)
li_screenwidth = PixelsToUnits(le_env.screenwidth,XPixelsToUnits!)
end if
if aw_window.width>li_ScreenWidth then//如果窗口超宽
ll_posx=1
else
ll_posx=(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即为窗口居中时的起始坐标。

//窗口居中,窗口内部函数
function integer w_center()
{
int li_screenheight, li_screenwidth, li_rc, li_x=1, li_y=1
environment	lenv_obj

//取得环境信息
If GetEnvironment ( lenv_obj ) = -1 Then Return -1

//取得屏幕的宽度和高度
li_screenheight = PixelsToUnits ( lenv_obj.ScreenHeight, YPixelsToUnits! )
li_screenwidth  = PixelsToUnits ( lenv_obj.ScreenWidth, XPixelsToUnits! )
If Not ( li_screenheight > 0 ) Or Not ( li_screenwidth > 0 ) Then Return -1

//取得中心坐标
If li_screenwidth > this.Width Then
	li_x = ( li_screenwidth / 2 ) - ( this.Width / 2 )
End If
If li_screenheight > this.Height Then
	li_y = ( li_screenheight / 2 ) - ( this.Height / 2 )
End If

//移动窗口到屏幕中心
li_rc = this.Move ( li_x, li_y )
If li_rc <> 1 Then Return -1

Return 1
}

 

有时窗口的位置要恢复到用户上次使用时的情况,可以借助于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[]是窗口的一个属性,用来标识窗口中的所有控件。

(3)使用的是PB自带的"pbvm**.dll中的函数shCenterWindow。

函数声明:function long shCenterWindow(long hWnd) library "pbvm90.dll" //PB9下的声明

调用方法:shCenterWindow(handle(w_about))

 

原文:https://blog.csdn.net/davinciteam/article/details/7432676 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值