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下运行通过。
|
鬼鬼 | 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 |