如何让程序随着分辨率的改改而改变

shaoni 2004-07-21 12:02:53
如何让程序随着分辨率的改改而改变
...全文
293 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
thelazyman 2004-10-26
  • 打赏
  • 举报
回复
同意楼上的
另一种方法是:直接在resize事件中设定每个控件相对窗口的位置,大小。
yyy 2004-10-26
  • 打赏
  • 举报
回复
请问上面的代码可以处理多层嵌套的控件吗??例如Tab页里面又嵌套Tab页,好像最好的处理方法是用递归算法处理吧!
tw829 2004-10-26
  • 打赏
  • 举报
回复
:)--->已很清楚了!
ice2water 2004-10-25
  • 打赏
  • 举报
回复

$PBExportHeader$w_set_window.srw
$PBExportComments$设置窗口控件参数
forward
global type w_set_window from Window
end type
type cb_5 from commandbutton within w_set_window
end type
type cb_4 from commandbutton within w_set_window
end type
type cb_3 from commandbutton within w_set_window
end type
type cb_2 from commandbutton within w_set_window
end type
type cb_1 from commandbutton within w_set_window
end type
type st_1 from statictext within w_set_window
end type
type dw_2 from datawindow within w_set_window
end type
type dw_1 from datawindow within w_set_window
end type
end forward

global type w_set_window from Window
int X=823
int Y=360
int Width=4677
int Height=2776
boolean TitleBar=true
string Title="设置窗口控件参数"
long BackColor=80269524
boolean ControlMenu=true
boolean MinBox=true
boolean MaxBox=true
boolean Resizable=true
cb_5 cb_5
cb_4 cb_4
cb_3 cb_3
cb_2 cb_2
cb_1 cb_1
st_1 st_1
dw_2 dw_2
dw_1 dw_1
end type
global w_set_window w_set_window

type variables
string is_win
end variables

on w_set_window.create
this.cb_5=create cb_5
this.cb_4=create cb_4
this.cb_3=create cb_3
this.cb_2=create cb_2
this.cb_1=create cb_1
this.st_1=create st_1
this.dw_2=create dw_2
this.dw_1=create dw_1
this.Control[]={this.cb_5,&
this.cb_4,&
this.cb_3,&
this.cb_2,&
this.cb_1,&
this.st_1,&
this.dw_2,&
this.dw_1}
end on

on w_set_window.destroy
destroy(this.cb_5)
destroy(this.cb_4)
destroy(this.cb_3)
destroy(this.cb_2)
destroy(this.cb_1)
destroy(this.st_1)
destroy(this.dw_2)
destroy(this.dw_1)
end on

event open;dw_1.SetTransObject(sqlca)
dw_2.SetTransObject(sqlca)
dw_2.InsertRow(0)
//dw_2.Retrieve()
is_win = "w" + mid(dw_2.GetItemString(1, 1), 2, 50)

end event

type cb_5 from commandbutton within w_set_window
int X=2802
int Y=2472
int Width=192
int Height=88
int TabOrder=40
string Text="测试"
int TextSize=-11
int Weight=400
string FaceName="宋体"
FontCharSet FontCharSet=GB2312CharSet!
FontPitch FontPitch=Variable!
end type

event clicked;//window win
//win = is_win
//open(win)
//
end event

type cb_4 from commandbutton within w_set_window
int X=2085
int Y=2472
int Width=210
int Height=88
int TabOrder=20
string Text="运算"
int TextSize=-11
int Weight=400
string FaceName="宋体"
FontCharSet FontCharSet=GB2312CharSet!
FontPitch FontPitch=Variable!
end type

event clicked;dw_1.AcceptText()
int li_gl
long ll_num_x, ll_num_y, ll_1, ll_2, ll_num_y0
ll_1 = dw_1.GetRow()
li_gl = dw_1.GetItemNumber(ll_1, "gl_x")
ll_num_y = dw_1.GetItemNumber(ll_1, "num_y_2")
For ll_2 = 1 to 9
li_gl = li_gl - 1
If dw_1.Find("gl_x = " + string(li_gl), 1, dw_1.RowCount()) = 0 Then
Exit
End If
Next
li_gl = li_gl + 1
ll_1 = dw_1.Find("gl_x = " + string(li_gl), 1, dw_1.RowCount())
dw_1.SetITem(ll_1, "num_y_2", ll_num_y)
//messagebox(string(li_gl),string(ll_1))
For ll_2 = 1 To 9
ll_num_x = dw_1.GetItemNumber(ll_1, "num_x_2") + dw_1.GetItemNumber(ll_1, "num_width_2") + dw_1.GetItemNumber(ll_1, "num_gl_x")
ll_num_y0 = dw_1.GetItemNumber(ll_1, "num_y")
li_gl = li_gl + 1
ll_1 = dw_1.Find("gl_x = " + string(li_gl), 1, dw_1.RowCount())
If ll_1 > 0 Then
dw_1.SetItem(ll_1, "num_x_2", ll_num_x)
dw_1.SetITem(ll_1, "num_y_2", ll_num_y - ll_num_y0 + dw_1.GetItemNumber(ll_1, "num_y"))
Else
Exit
End If
Next

end event
type cb_3 from commandbutton within w_set_window
int X=3470
int Y=2472
int Width=192
int Height=88
int TabOrder=50
string Text="退出"
int TextSize=-11
int Weight=400
string FaceName="宋体"
FontCharSet FontCharSet=GB2312CharSet!
FontPitch FontPitch=Variable!
end type

event clicked;Close(Parent)

end event

type cb_2 from commandbutton within w_set_window
int X=3113
int Y=2472
int Width=192
int Height=88
int TabOrder=60
string Text="删除"
int TextSize=-11
int Weight=400
string FaceName="宋体"
FontCharSet FontCharSet=GB2312CharSet!
FontPitch FontPitch=Variable!
end type

event clicked;Delete From z_window Where id_window = :is_win;
If sqlca.sqlcode = 0 Then
Commit;
MessageBox("信息", "删除成功!")
dw_1.Retrieve(is_win)
Else
Rollback;
MessageBox("信息", "删除失败!")
End If

end event

type cb_1 from commandbutton within w_set_window
int X=2473
int Y=2472
int Width=192
int Height=88
int TabOrder=40
string Text="保存"
int TextSize=-11
int Weight=400
string FaceName="宋体"
FontCharSet FontCharSet=GB2312CharSet!
FontPitch FontPitch=Variable!
end type

event clicked;If dw_1.Update() = 1 Then
Commit;
MessageBox("信息", "保存成功!")
Else
Rollback;
MessageBox("信息", "保存失败!")
End If

end event

type st_1 from statictext within w_set_window
int X=809
int Y=2480
int Width=187
int Height=68
boolean Enabled=false
string Text="窗口:"
boolean FocusRectangle=false
long TextColor=33554432
long BackColor=67108864
int TextSize=-11
int Weight=400
string FaceName="宋体"
FontCharSet FontCharSet=GB2312CharSet!
FontPitch FontPitch=Variable!
end type

type dw_2 from datawindow within w_set_window
int X=1015
int Y=2472
int Width=773
int Height=84
int TabOrder=30
string DataObject="dw_gncd"
BorderStyle BorderStyle=StyleLowered!
end type

event itemchanged;dw_2.Accepttext()
is_win = "w" + mid(dw_2.GetItemString(1, 1), 2, 50)
long ll_1 = 0
Select Count(*) Into :ll_1
From z_window
Where id_window = :is_win
and num_x_2 > 0;
If ll_1 = 0 Then
Update z_window Set num_x_2 = Convert(numeric(8, 0), num_x * 1.28),
num_y_2 = Convert(numeric(8, 0), num_y * 1.28),
num_width_2 = num_width, num_height_2 = num_height,
num_weight_2 = num_weight, num_textsize_2 = num_textsize
Where id_window = :is_win;
If sqlca.sqlcode = 0 Then
Update z_window Set num_width_2 = Convert(numeric(8, 0), num_width * 1.28),
num_height_2 = Convert(numeric(8, 0), num_height * 1.28)
Where id_window = :is_win
and id_type = "datawindow!";
End If
If sqlca.sqlcode = 0 Then
Commit;
Else
Rollback;
MessageBox("提示", "计算出现错误!")
End If
End If
dw_1.Retrieve(is_win)

end event

type dw_1 from datawindow within w_set_window
int X=119
int Y=88
int Width=4366
int Height=2280
int TabOrder=10
string DataObject="d_set_window"
BorderStyle BorderStyle=StyleLowered!
boolean HScrollBar=true
boolean VScrollBar=true
boolean HSplitScroll=true
boolean LiveScroll=true
end type

ice2water 2004-10-25
  • 打赏
  • 举报
回复
Else
Select num_x_2, num_y_2, num_width_2, num_height_2, num_textsize_2, num_weight_2
Into :li_x, :li_y, :li_width, :li_height, :li_textsize, :li_weight
From z_window
Where id_window = :ls_window
and id_object = :ls_object;
If sqlca.sqlcode = 0 Then
choose case typeof(temp)
case tab!
ltab_obj = temp
ltab_obj.x = max(ltab_obj.x, li_x)
ltab_obj.y = max(ltab_obj.y, li_y)
ltab_obj.width = max(ltab_obj.width, li_width)
ltab_obj.height = max(ltab_obj.height, li_height)
ltab_obj.textsize = max(ltab_obj.textsize, li_textsize)
ltab_obj.weight = max(ltab_obj.weight, li_weight)
case commandbutton!
lcb_obj = temp
lcb_obj.x = max(lcb_obj.x, li_x)
lcb_obj.y = max(lcb_obj.y, li_y)
lcb_obj.width = max(lcb_obj.width, li_width)
lcb_obj.height = max(lcb_obj.height, li_height)
lcb_obj.textsize = max(lcb_obj.textsize, li_textsize)
lcb_obj.weight = max(lcb_obj.weight, li_weight)
case singlelineedit!
lsle_obj = temp
lsle_obj.x = max(lsle_obj.x, li_x)
lsle_obj.y = max(lsle_obj.y, li_y)
lsle_obj.width = max(lsle_obj.width, li_width)
lsle_obj.height = max(lsle_obj.height, li_height)
lsle_obj.textsize = max(lsle_obj.textsize, li_textsize)
lsle_obj.weight = max(lsle_obj.weight, li_weight)
case editmask!
lem_obj = temp
lem_obj.x = max(lem_obj.x, li_x)
lem_obj.y = max(lem_obj.y, li_y)
lem_obj.width = max(lem_obj.width, li_width)
lem_obj.height = max(lem_obj.height, li_height)
lem_obj.textsize = max(lem_obj.textsize, li_textsize)
lem_obj.weight = max(lem_obj.weight, li_weight)
case statictext!
lst_obj = temp
lst_obj.x = max(lst_obj.x, li_x)
lst_obj.y = max(lst_obj.y, li_y)
lst_obj.width = max(lst_obj.width, li_width)
lst_obj.height = max(lst_obj.height, li_height)
lst_obj.textsize = max(lst_obj.textsize, li_textsize)
lst_obj.weight = max(lst_obj.weight, li_weight)
case datawindow! // datawindows get zoomed
ldw_obj = temp
ldw_obj.x = max(ldw_obj.x, li_x)
ldw_obj.y = max(ldw_obj.y, li_y)
ldw_obj.width = max(ldw_obj.width, li_width)
ldw_obj.height = max(ldw_obj.height, li_height)
// dw.Object.DataWindow.zoom = string(int(Radio*100))//注意DATAWINDOW与其它控件的不同
case picturebutton!
lpb_obj = temp
lpb_obj.x = max(lpb_obj.x, li_x)
lpb_obj.y = max(lpb_obj.y, li_y)
lpb_obj.width = max(lpb_obj.width, li_width)
lpb_obj.height = max(lpb_obj.height, li_height)
lpb_obj.textsize = max(lpb_obj.textsize, li_textsize)
lpb_obj.weight = max(lpb_obj.weight, li_weight)
case checkbox!
lcbx_obj = temp
lcbx_obj.x = max(lcbx_obj.x, li_x)
lcbx_obj.y = max(lcbx_obj.y, li_y)
lcbx_obj.width = max(lcbx_obj.width, li_width)
lcbx_obj.height = max(lcbx_obj.height, li_height)
lcbx_obj.textsize = max(lcbx_obj.textsize, li_textsize)
lcbx_obj.weight = max(lcbx_obj.weight, li_weight)
case dropdownlistbox!
lddlb_obj = temp
lddlb_obj.x = max(lddlb_obj.x, li_x)
lddlb_obj.y = max(lddlb_obj.y, li_y)
lddlb_obj.width = max(lddlb_obj.width, li_width)
lddlb_obj.height = max(lddlb_obj.height, li_height)
lddlb_obj.textsize = max(lddlb_obj.textsize, li_textsize)
lddlb_obj.weight = max(lddlb_obj.weight, li_weight)
case groupbox!
lgb_obj = temp
lgb_obj.x = max(lgb_obj.x, li_x)
lgb_obj.y = max(lgb_obj.y, li_y)
lgb_obj.width = max(lgb_obj.width, li_width)
lgb_obj.height = max(lgb_obj.height, li_height)
lgb_obj.textsize = max(lgb_obj.textsize, li_textsize)
lgb_obj.weight = max(lgb_obj.weight, li_weight)
case listbox!
llb_obj = temp
llb_obj.x = max(llb_obj.x, li_x)
llb_obj.y = max(llb_obj.y, li_y)
llb_obj.width = max(llb_obj.width, li_width)
llb_obj.height = max(llb_obj.height, li_height)
llb_obj.textsize = max(llb_obj.textsize, li_textsize)
llb_obj.weight = max(llb_obj.weight, li_weight)
case multilineedit!
lmle_obj = temp
lmle_obj.x = max(lmle_obj.x, li_x)
lmle_obj.y = max(lmle_obj.y, li_y)
lmle_obj.width = max(lmle_obj.width, li_width)
lmle_obj.height = max(lmle_obj.height, li_height)
lmle_obj.textsize = max(lmle_obj.textsize, li_textsize)
lmle_obj.weight = max(lmle_obj.weight, li_weight)
case radiobutton!
lrb_obj = temp
lrb_obj.x = max(lrb_obj.x, li_x)
lrb_obj.y = max(lrb_obj.y, li_y)
lrb_obj.width = max(lrb_obj.width, li_width)
lrb_obj.height = max(lrb_obj.height, li_height)
lrb_obj.textsize = max(lrb_obj.textsize, li_textsize)
lrb_obj.weight = max(lrb_obj.weight, li_weight)
end choose
end If
End If
next

commit;
aw_window.show()
aw_window.SetRedraw(True)
return 0
ice2water 2004-10-25
  • 打赏
  • 举报
回复
调用:在窗口的open脚本中调用uf_set_window(this)

//函数uf_set_window()

//获取屏幕分辨率,envir.ScreenWidth为屏幕宽度,如:800,1024
//envir.ScreenHeight为屏幕高度,如600,768
Environment envir
Integer li_ReturnCode, li_screenwidth
aw_window.SetRedraw(False)
li_ReturnCode = GetEnvironment(envir)
li_screenwidth = envir.screenwidth
//messagebox(string(envir.screenwidth),string(envir.ScreenHeight))

dragobject temp //用于取各种控件

checkbox lcbx_obj
radiobutton lrb_obj
commandbutton lcb_obj
datawindow ldw_obj
dropdownlistbox lddlb_obj
dropdownpicturelistbox lddplb_obj
editmask lem_obj
groupbox lgb_obj
hscrollbar lhsb_obj
line lln_obj
listbox llb_obj
listview llv_obj
multilineedit lmle_obj
picture lp_obj
picturebutton lpb_obj
picturelistbox lplb_obj
singlelineedit lsle_obj
tab ltab_obj
treeview ltv_obj
userobject luo_obj
vscrollbar lvsb_obj
graph lgr_obj
olecontrol lole_obj
richtextedit lrte_obj
statictext lst_obj

integer i, li_1 = 0, li_height, li_textsize, li_weight, li_width, li_x, li_y
string ls_window, ls_object, ls_type, ls_text
ls_window = classname(aw_window)
long ll
Select Count(*) Into :li_1
From z_window
Where id_window = :ls_window;

If li_screenwidth = 800 Then
Return 1
End If

for i = 1 to upperbound(aw_window.control)
temp = aw_window.control[i] //获取控件
ls_object = temp.classname()
If li_1 = 0 Then
li_height = temp.height
li_width = temp.width
li_x = temp.x
li_y = temp.y
ls_text = ""
CHOOSE CASE typeof(temp)
CASE tab!
ltab_obj = temp
li_textsize = ltab_obj.textsize
li_weight = ltab_obj.weight
ls_type = "tab!"
CASE commandbutton!
lcb_obj = temp
li_textsize = lcb_obj.textsize
li_weight = lcb_obj.weight
ls_type = 'commandbutton!'
ls_text = lcb_obj.text
CASE singlelineedit!
lsle_obj = temp
li_textsize = lsle_obj.textsize
li_weight = lsle_obj.weight
ls_type = 'singlelineedit!'
// ls_text = lsel_obj.text
CASE editmask!
lem_obj = temp
li_textsize = lem_obj.textsize
li_weight = lem_obj.weight
ls_type = 'editmask!'
ls_text = lem_obj.text
CASE statictext!
lst_obj = temp
li_textsize = lst_obj.textsize
li_weight = lst_obj.weight
ls_type = 'statictext!'
ls_text = lst_obj.text
CASE datawindow!
li_textsize = 0
li_weight = 0
ls_type = 'datawindow!'
CASE picturebutton!
lpb_obj = temp
li_textsize = lpb_obj.textsize
li_weight = lpb_obj.weight
ls_type = 'picturebutton!'
ls_text = lpb_obj.text
CASE checkbox!
lcbx_obj = temp
li_textsize = lcbx_obj.textsize
li_weight = lcbx_obj.weight
ls_type = 'checkbox!'
ls_text = lcbx_obj.text
CASE dropdownlistbox!
lddlb_obj = temp
li_textsize = lddlb_obj.textsize
li_weight = lddlb_obj.weight
ls_type = 'dropdownlistbox!'
ls_text = lddlb_obj.text
CASE groupbox!
lgb_obj = temp
li_textsize = lgb_obj.textsize
li_weight = lgb_obj.weight
ls_type = 'groupbox!'
ls_text = lgb_obj.text
CASE listbox!
llb_obj = temp
li_textsize = llb_obj.textsize
li_weight = llb_obj.weight
ls_type = 'listbox!'
// ls_text = llb_obj.text
CASE multilineedit!
lmle_obj = temp
li_textsize = lmle_obj.textsize
li_weight = lmle_obj.weight
ls_type = 'multilineedit!'
ls_text = lmle_obj.text
CASE radiobutton!
lrb_obj = temp
li_textsize = lrb_obj.textsize
li_weight = lrb_obj.weight
ls_type = 'radiobutton!'
ls_text = lrb_obj.text
Case Else
li_textsize = 0
li_weight = 0
END CHOOSE

Insert Into z_window
Values (:ls_window, :ls_object, :li_x, :li_y, :li_width, :li_height,
:li_textsize, :li_weight, 0, 0, 0, 0, 0, 0, :ls_type, :ls_text, null, 0);
zjyoo 2004-10-23
  • 打赏
  • 举报
回复
靠,这样也可以的啊
superdinosaur520 2004-10-23
  • 打赏
  • 举报
回复
ice2water(冰冻三尺) 真高!
小弟等着导你的表啊
ice2water 2004-10-23
  • 打赏
  • 举报
回复
我刚做了一个,具体如下:
定义一个表,保存不同分辨率下控件对象的参数值,通过对参数值的调整可较好地控制不同分辨率下的显示问题,比楼上用一个函数要好得多。具体代码在单位,下周给贴出来。
zjyoo 2004-10-22
  • 打赏
  • 举报
回复
这个问题精典啊,谁有更详细的说明啊
zhangpowerbuilder 2004-10-22
  • 打赏
  • 举报
回复
我们公司的基本框架中解决这个问题编码达到1000多行
bugubirds 2004-10-22
  • 打赏
  • 举报
回复
好象以前见过一个resize的pbl,加进去就行了,在网上找一下吧,或者是把zfc打的你的库里面,那里面有resize的功能
nanjQQ 2004-10-22
  • 打赏
  • 举报
回复
不用啊,它只是取当前屏分辨率,你只需要用个全局变量来标明就行了
wfexp 2004-07-23
  • 打赏
  • 举报
回复
//名称:wf_get_enviroment()
//功能:取得屏幕分辨率
//作用:设置OLE_RICHTEXT分隔符
//返回值:radio(double)
//时间:2004-03-02
///////////////////////////////////////////////////////////////////
environment lenv

integer ii_ScreenWidth,ii_ScreenHeight
double WRadio,HRadio,Radio
integer ii_WinBolderWidth,ii_WinBolderHeight,li_rtn

li_rtn = GetEnvironment(lenv)
IF li_rtn <> 1 THEN RETURN 1

ii_ScreenWidth = lenv.screenwidth
ii_ScreenHeight = lenv.screenheight

WRadio=ii_ScreenWidth/800 //标准认为屏幕分辨率为800*600
HRadio=ii_ScreenHeight/600//计算出屏幕相对800*600分辨率的变化量
Radio=Min(WRadio,HRadio)
if Radio=1.0 then //if the screen is default 800*600
return Radio
BillLi 2004-07-23
  • 打赏
  • 举报
回复
可做已祖先窗口,在resize中写好代码,其他继承
shaoni 2004-07-23
  • 打赏
  • 举报
回复
nanjQQ(将PB进行到底)
您说的是再每个窗体都这么做吗?
klbt 2004-07-21
  • 打赏
  • 举报
回复
需要编码,在窗口的resize事件。
hemhem 2004-07-21
  • 打赏
  • 举报
回复
好象不会自动的把,呵呵,要自己写的喽
  • 打赏
  • 举报
回复
学倒起了 如果窗口的控件比较多,且复杂的话 ,就要用楼上两位老兄所说的那样.

如果窗口较简单的话,就用不着control[]数组了 ,直接用几条语句就可以控制各个控件的位

置,大小属性.
tolixiaohui 2004-07-21
  • 打赏
  • 举报
回复
PowerBuilder的窗口对象有一个非常重要的属性-control[]数组,存储了窗口内放置的所有控件。通过这个数组,可以访问各控件的属性。但窗口的control[]数组并不存储放在Tab控件和UserObject控件内部的控件,它们存储在Tab控件和UserObject控件各自的control[]数组中。

  在窗口的open事件中,通过其control[]数组,找出在窗口内放置的全部DragObject类控件(当遇到Tab控件和UserObject控件时,继续通过它们各自的control[]数组,找出其内部的全部DragObject类控件),保存所有找到的控件的原始x、y、width和height属性数据与当前窗口原始宽度和高度的比例值。当窗口大小调整时,在resize事件中,根据保存的各控件的比例值重置控件的x、y、width和height属性,从而实现控件随窗口大小的变化自动按比例放大或缩小。
加载更多回复(2)

1,075

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧