| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3063 人关注过本帖
标题:窗口使用技巧系列文章--自动调整窗口
只看楼主 加入收藏
折翼天使a
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-4-17
结帖率:0
收藏
已结贴  问题点数:20 回复次数:2 
窗口使用技巧系列文章--自动调整窗口
在一定的屏幕分辨率下开发的应用程序到别的计算机上运行时,很可能遇到和开发环境
中的分辨率不同的情况,这时要保证窗口界面仍然显示居中,就得在开发时考虑这个问
题。解决方法是在窗口打开时判断屏幕的分辨率,根据分辨率来决定窗口显示的位置。
要用到两个单位换算函数和一个获取运行环境信息的函数。
在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 )
转载  来源http://www.文章库 PB论坛
其中,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)
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_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即为窗口居中
时的起始坐标。
有时窗口的位置要恢复到用户上次使用时的情况,可以借助于ini文件。在窗口关闭时将
窗口的位置信息保存在一个特定的ini文件中,当窗口打开时再将这些位置信息读出并用
来设置窗口的位置。具体可以参考前面MDI一章中介绍的两个函数wf_saveToolBar和
wf_resToreToolBar的编程。
当用户对窗口的大小进行调整时,窗口中的控件也应该相应地调整其大小和位置,这样
才能保证整个窗口中控件的布局相对不动。可以在调整窗口大小的同时调整窗口中的控
件及其相对位置,可以在窗口的Resize事件中编写脚本。首先定义如下实例变量:
Int ii_width,ii_height
在窗口的Open事件中:
      ii_width = This.Width
        ii_height = This.Height
在窗口的Resize事件中:
Int 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[]是窗口
的一个属性,用来标识窗口中的所有控件。
搜索更多相关主题的帖子: Windows 应用程序 运行环境 
2013-04-18 21:51
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:20 
学习

DO IT YOURSELF !
2013-04-18 21:56
yntcysf
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2013-8-12
收藏
得分:0 
长姿势了
2013-08-12 12:45
快速回复:窗口使用技巧系列文章--自动调整窗口
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.041204 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved