轉自 http://demo.netfoucs.com/u012369435/article/details/36438473
在一定的屏幕分辨率下開發的應用程序到別的計算機上運行時,很可能遇到和開發環境中的分辨率不同的情況,這時要保證窗口界面仍然顯示居中,就得在開發時考慮這個問題。解決方法是在窗口打開時判斷屏幕的分辨率,根據分辨率來決定窗口顯示的位置。要用到兩個單位換算函數和一個獲取運行環境信息的函數。
在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[]是窗口的一個屬性,用來標識窗口中的所有控件。