PB调整控件的大小

PB窗口自适应调整
pb 调整控件的大小,老帖翻新

PowerBuilder 在数据库系统开发中,以其独特的、强大的数据窗口功能,得到了广大程序员的喜爱,但用户在使用中,却时常发现系统中的窗口要么太大,部分内容在屏幕上显示 不下,要么窗口过小,在屏幕中显得不够美观,造成这种情况的原因是程序员和用户所使用计算机的屏幕分辨率不一致。本文介绍了如何使PB中的窗口大小能根据 屏幕分辨率自动调整,同时保持窗口中的控件的相对位置、大小不变。

1、定义全局变量oldheight、newheight、oldwidth、newwidth,分别保存程序员和用户屏幕分辨率的高度和宽度,在Application的Open脚本中加入下列语句:

Environment en //定义环境变量

GetEnvironment(en) //获取环境变量值

newheight = en.ScreenHeight //取当前屏幕分辨率的高度

newwidth = en.ScreenWidth //取当前屏幕分辨率的宽度

oldheight = 480 //假设程序员屏幕分辨率为640*480

oldwidth = 640

2、在窗口的Open事件中分别调整窗口、控件的X、Y、Height、Width,保证窗口进行自适应调整,假设窗口中有一个按钮控件cb_1,脚本如下所示:

//调整窗口的坐标和大小

This.y = This.y_*newheight / oldheight

This.x = This.x_*newwidth / oldwidth

This.width = This.width_*newwidth / oldwidth

This.height = This.height_*newheight / oldheight

//调整控件的坐标和大小

Cb_1.y = Cb_1.y_*newheight / oldheight

Cb_1.x = Cb_1.x_*newwidth / oldwidth

Cb_1.width = Cb_1.width_*newwidth / oldwidth

Cb_1.height = Cb_1.height_*newheight / oldheight

如果窗口中有多个控件,可对每个控件做同样处理。通过添加上述脚本,就实现了窗口在不同分辨率下的自适应调整。本程序在Pb6.5、Windows 2000下运行通过。

lxh_17632009-09-07 10:32:20
追加一问:如何自适应文字宽度?(如何实现类似于EXCEL那样双击第一列和第二列的相隔线来自动根据列中的文字宽度来调整列宽)

鬼鬼2009-09-07 10:47:58
public function integer of_compressdwgrid (string as_colname);//@@压缩数据窗口中指定列的宽度,使字段宽度等于包含数据的最大宽度  
  //该函数是针对grid型数据窗口的  
   
  int li_r  
  int li_j  
  int li_row_count  
  string ls_fontname //字体名称  
  int li_fontheight  
  int li_fontcharset  
  int li_fontweight  
  ulong ll_font //字体  
  ulong ll_oldfont // 老的字体  
  ulong ll_pixelsperinch //屏幕没英寸点数  
  ulong ll_screen //屏幕dc  
  ulong ll_dwdc //数据窗口的dc  
  string ls_celltext //单元格文本  
  int li_cellwidth //单元格文本宽度  
  int li_maxwidth //列的新宽度  
  string ls_colheader //列标题文字  
  s_rect lstr_textrect //文本矩形  
  s_font lfont //字体结构  
   
  //获得窗口分辨率  
  ll_screen = inv_api.GetDC(0)  
  ll_pixelsperinch = inv_api.GetDeviceCaps( ll_screen, inv_api.LOGPIXELSY)  
  inv_api.ReleaseDC(0, ll_screen)  
  li_rowcount=idw.rowcount()  
  ls_colheader=idw.describe(as_colname+"_t.text")+" " //增加一个空格的宽度  
  ls_fontname=idw.describe(as_colname+"_t.font.face")  
  li_fontheight=integer(idw.describe(as_colname+"_t.font.height"))  
  li_fontcharset=integer(idw.describe(as_colname+"_t.font.charset"))  
  li_fontweight=integer(idw.describe(as_colname+"_t.font.weight"))  
  //设置字体  
  lfont.lffacename = ls_fontname  
  lfont.lfcharset = _char(li_fontcharset)  
  lfont.lfheight = - li_fontheight _* ll_PixelsPerinch / 72  
  lfont.lfweight = li_fontweight  
  ll_font = inv_api.CreateFontIndirect( lfont )  
  //获得字体  
  ll_dwdc = inv_api.GetDC( 0 )  
  ll_oldfont = inv_api.SelectObject( ll_dwdc, ll_font )  
  inv_api.DrawText( ll_dwdc, ls_colheader, len(ls_colheader), lstr_textrect, inv_api.DT_CALCRECT + inv_api.DT_SINGLELINE )  
  li_maxwidth=lstr_textrect.right - lstr_textrect.left + 1  
  ll_font = inv_api.SelectObject( ll_dwdc, ll_oldfont )  
  inv_api.DeleteObject( ll_font )  
  inv_api.ReleaseDC( 0, ll_dwdc )  
  //获得数据区各行文本的最大宽度  
  ls_fontname=idw.describe(as_colname+".font.face")  
  li_fontheight=integer(idw.describe(as_colname+".font.height"))  
  li_fontcharset=integer(idw.describe(as_colname+".font.charset"))  
  li_fontweight=integer(idw.describe(as_colname+".font.weight"))  
  //设置字体  
  lfont.lffacename = ls_fontname  
  lfont.lfcharset = _char(li_fontcharset)  
  lfont.lfheight = - li_fontheight _* ll_PixelsPerinch / 72  
  lfont.lfweight = li_fontweight  
  ll_font = inv_api.CreateFontIndirect( lfont )  
  //获得字体  
  ll_dwdc = inv_api.GetDC(0)  
  ll_oldfont = inv_api.SelectObject( ll_dwdc, ll_font )  
  for li_j=1 to li_row_count  
  ls_celltext = idw.Describe("Evaluate('LookupDisplay("+as_colname+")',"+string(li_j)+")") //获得单元格显示文本,这种方法有时不正确  
  ls_celltext += " " //增加一个空格的宽度会相对美观些  
  inv_api.DrawText( ll_dwdc, ls_celltext, len(ls_celltext), lstr_textrect, inv_api.DT_CALCRECT + inv_api.DT_SINGLELINE )  
  li_cellwidth=lstr_textrect.right - lstr_textrect.left + 1  
  if li_cellwidth>li_maxwidth then li_maxwidth=li_cellwidth  
  next  
  ll_font = inv_api.SelectObject( ll_dwdc, ll_oldfont )  
  inv_api.DeleteObject( ll_font )  
  inv_api.ReleaseDC(0, ll_dwdc )  
  idw.modify(as_colname+".width = "+string(PixelsToUnits(li_maxwidth,XPixelsToUnits!)))  
  return li_r  
  end function  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值