窗口缩放应该是挺基础的问题啦,以前对界面不重视,没仔细研究过。
前期将POS开票窗口的设计大小由800*600改为1024*768啦,因为一般的显示器都挺大啦,终究还是有些收银机的屏幕只能设置到800*600,这样就出现了窗口下部的内容显示不全的问题。
趁着周末,学习了一下窗口自动缩放的实现,主要有几种,
1、open时,记录窗口和控件原大小及位置,在resize事件中,根据窗口的新长高和旧长高的比率,重新设置控件大小和位置。
Simple one is in PB6.5 Example's "pbexamw3.pbl", "w_scale"
http://bbs.csdn.net/topics/50294308
2、open时,记录控件大小位置与窗口长高的比率,即控件对于窗口的相对位置,在resize事件中,根据窗口新长高乘比率,来设置控件大小和位置。
我现在用的是这种方式。
3、open时,记录窗口原大小,在resize事件中,首先计算新长高和旧长高的比率,根据控件当前的大小和位置属性来调整控件新的大小和位置。
这个方式,不保存控件的大小或者比率,编码最简洁,多次缩放后可能不是很准确吧。
http://bbs.csdn.net/topics/390368900
所有的这些方法,都依赖原得到正确的窗口原始大小和控件大小和位置。
现在的问题是,如果屏幕分辨率小于窗口的大小,程序的到的worksapcewidth()函数值就不是程序设计的值了,即不是原大小。
如果一开始窗口下方的控件就没在窗口内显示,那样如何缩放,这些控件肯定在窗口外边啦。
请教大小,对于屏幕显示不全的窗口,如何得到窗口设计窗口上设置的width和height属性值。
------解决方案--------------------
open 代码执行之前获取这两个属性值
------解决方案--------------------
现在的问题是,如果屏幕分辨率小于窗口的大小,程序的到的worksapcewidth()函数值就不是程序设计的值了,即不是原大小。
如果一开始窗口下方的控件就没在窗口内显示,那样如何缩放,这些控件肯定在窗口外边啦。
请教大小,对于屏幕显示不全的窗口,如何得到窗口设计窗口上设置的width和height属性值。
答:在窗口的open事件里,先记录原来的width和height,这个直接取窗口的属性即可
然后再根据workspacewidth来动态调整,不过pfc里的resize对象写的有问题,设计窗口大于运行窗口时缩放的有问题,不能正常缩放。
建议设计时窗口小些,运行时大些无所谓
------解决方案--------------------
我的代码里所有窗口都采用继承,只要在祖先窗口的 OTHER 事件第一次被触发时取得这两个属性值就行了。
------解决方案--------------------
给个提示吧,不知道有用没
父系窗口定义窗口变量
real ir_x[],ir_y[],ir_width[],ir_height[]
commandbutton icb_obj
datawindow idw_obj
statictext ist_obj
editmask iem_obj
checkbox icbx_obj
dropdownlistbox iddlb_obj
groupbox igb_obj
treeview itv_obj
picture ipt_obj
open事件
integer li_count,li_i
long ll_width,ll_height
li_count=upperbound(this.control[])
//messagebox(string(li_count),string(li_count))
//获得控件的总个数
ll_width=this.workspacewidth( )
ll_height=this.workspaceheight( )
//获得工作空间的高和宽
for li_i=1 to li_count
choose case this.control[li_i].typeof()
//获得控件的类型
case CommandButton!
// messagebox(string(li_i),string(li_i))
icb_obj=this.control[li_i]
ir_x[li_i]=round(icb_obj.x / ll_width,3)
ir_y[li_i]=round(icb_obj.y/ll_height,3)
ir_width[li_i]=round(icb_obj.width/ll_width,3)
ir_height[li_i]=round(icb_obj.height/ll_height,3)
case DataWindow!
// messagebox(string(li_i),string(li_i))
idw_obj=this.control[li_i]
ir_x[li_i]=round(idw_obj.x / ll_width,3)
ir_y[li_i]=round(idw_obj.y/ll_height,3)
ir_width[li_i]=round(idw_obj.width/ll_width,3)
ir_height[li_i]=round(idw_obj.height/ll_height,3)
case EditMask!
// messagebox(string(li_i),string(li_i))
iem_obj=this.control[li_i]
ir_x[li_i]=round(iem_obj.x / ll_width,3)
ir_y[li_i]=round(iem_obj.y/ll_height,3)
ir_width[li_i]=round(iem_obj.width/ll_width,3)
ir_height[li_i]=round(iem_obj.height/ll_height,3)
case DropDownListBox!
// messagebox(string(li_i),string(li_i))
iddlb_obj=this.control[li_i]
ir_x[li_i]=round(iddlb_obj.x / ll_width,3)
ir_y[li_i]=round(iddlb_obj.y/ll_height,3)
ir_width[li_i]=round(iddlb_obj.width/ll_width,3)
ir_height[li_i]=round(iddlb_obj.height/ll_height,3)
case StaticText!
// messagebox(string(li_i),string(li_i))
ist_obj=this.control[li_i]
ir_x[li_i]=round(ist_obj.x / ll_width,3)
ir_y[li_i]=round(ist_obj.y/ll_height,3)
ir_width[li_i]=round(ist_obj.width/ll_width,3)
ir_height[li_i]=round(ist_obj.height/ll_height,3)
case CheckBox!
// messagebox(string(li_i),string(li_i))
icbx_obj=this.control[li_i]
ir_x[li_i]=round(icbx_obj.x / ll_width,3)
ir_y[li_i]=round(icbx_obj.y/ll_height,3)
ir_width[li_i]=round(icbx_obj.width/ll_width,3)
ir_height[li_i]=round(icbx_obj.height/ll_height,3)
case groupbox!
igb_obj=this.control[li_i]
ir_x[li_i]=round(igb_obj.x / ll_width,3)
ir_y[li_i]=round(igb_obj.y/ll_height,3)
ir_width[li_i]=round(igb_obj.width/ll_width,3)
ir_height[li_i]=round(igb_obj.height/ll_height,3)
case treeview!
itv_obj=this.control[li_i]
ir_x[li_i]=round(itv_obj.x / ll_width,3)
ir_y[li_i]=round(itv_obj.y/ll_height,3)
ir_width[li_i]=round(itv_obj.width/ll_width,3)
ir_height[li_i]=round(itv_obj.height/ll_height,3)
case picture!
ipt_obj=this.control[li_i]
ir_x[li_i]=round(ipt_obj.x / ll_width,3)
ir_y[li_i]=round(ipt_obj.y/ll_height,3)
ir_width[li_i]=round(ipt_obj.width/ll_width,3)
ir_height[li_i]=round(ipt_obj.height/ll_height,3)
end choose
next
resize事件
integer li_i,li_count
li_count=upperbound(this.control[])
//li_count=upperbound(this.control[])
//messagebox(string( li_count),string(li_count))
for li_i=1 to li_count
choose case this.control[li_i].typeof()
case commandbutton!
// messagebox(string(li_i),string(li_i))
icb_obj=this.control[li_i]