在VFP中怎么处理窗体变化后,窗体中的控件也随之变化?

zhoud_j 2010-12-23 09:44:58
我用VFP9做了一表单,在别的宽屏的显示器上,窗体填不满,最大化后,控件的大小没有变化,谁有通过调整窗体大小而窗体中的控件也随之调整的代码?分享一下,谢谢
...全文
328 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
十豆三 2010-12-24
  • 打赏
  • 举报
回复
trainee 2010-12-24
  • 打赏
  • 举报
回复
我倒是有做了随着屏幕分辨率自动调整控件大小的控件,可以对付90%的情况,适合于VFP 各版本
但不是那种随着resize事件自动调整的控件


**************************************************
*-- Class: adjust_screen
*-- ParentClass: custom
*-- BaseClass: custom
*-- Time Stamp: 10/20/10 10:15:14 AM
*
DEFINE CLASS adjust_screen AS custom


Height = 28
Width = 38
*-- 当前屏幕分辨率的宽度
sys_width=0
*-- 当前屏幕分辨率的长度
sys_height=0

*-- 设计时的屏幕宽度
design_width = 800
*-- 设计时的屏幕长度
design_height = 600
Name = "adjust_screen"


PROCEDURE adjust_controls
PARAMETERS O_CONTAIN,X_RATE, Y_RATE
LOCAL m_count,O,I
DO case
CASE INLIST(LOWER(O_CONTAIN.baseclass),'commandgroup')
m_count=o_contain.buttoncount
CASE INLIST(LOWER(O_CONTAIN.baseclass),'pageframe')
m_count=o_contain.pagecount
CASE INLIST(LOWER(O_CONTAIN.baseclass),'grid')
m_count=o_contain.columncount
OTHERWISE
m_count=o_contain.controlcount
endcase
FOR I=1 TO m_count
DO case
CASE INLIST(LOWER(O_CONTAIN.baseclass),'commandgroup')
o=o_contain.buttons[i]
CASE INLIST(LOWER(O_CONTAIN.baseclass),'pageframe')
o=o_contain.pages[i]
CASE INLIST(LOWER(O_CONTAIN.baseclass),'grid')
o=o_contain.columns[i]
OTHERWISE
o=o_contain.controls[i]
endcase
IF INLIST(LOWER(O.BASECLASS),'custom','timer')
LOOP
ENDIF
IF !INLIST(LOWER(O.BASECLASS)+SPACE(1),'page ','column ')
O.LEFT = ROUND(O.LEFT * X_RATE,0)
O.TOP = ROUND(O.TOP * Y_RATE,0)
O.WIDTH = ROUND(O.WIDTH * X_RATE,0)
O.HEIGHT = ROUND(O.HEIGHT * Y_RATE,0)
ENDIF
try
DO case
case INLIST(LOWER(O.BASECLASS)+SPACE(1),'spinner ','combobox ','textbox ','editbox ','listbox ','label ','commandbutton ','page ')
IF AT('nofontsize',o.tag)=0
O.FONTSIZE = ROUND(O.FONTSIZE * X_RATE,0)
ENDIF
case LOWER(O.BASECLASS)='column'
IF AT('nowidth',o.tag)=0
O.WIDTH=ROUND(O.WIDTH * X_RATE,0)
ENDIF
IF AT('nofontsize',o.tag)=0
O.FONTSIZE = ROUND(O.FONTSIZE * X_RATE,0)
ENDIF
IF AT('noheadersize',o.tag)=0
O.header1.fontsize= ROUND(O.header1.FONTSIZE * X_RATE,0)
ENDIF
ENDcase
IF LOWER(O.BASECLASS)='grid'
IF AT('noheaderheight',o.tag)=0
O.HEADERHEIGHT=ROUND(O.HEADERHEIGHT * Y_RATE,0)
ENDIF
IF AT('norowheight',o.tag)=0
O.ROWHEIGHT=ROUND(O.ROWHEIGHT * Y_RATE,0)
ENDIF
ENDIF
CATCH TO oerror
WAIT WINDOW '屏幕缩放错误:'+OERROR.message NOWAIT
ENDTRY

IF INLIST(LOWER(O.BASECLASS)+SPACE(1),'commandgroup ','pageframe ','page ','container ','grid ') AND AT('noresize',O.tag)=0
this.adjust_controls(O,X_RATE, Y_RATE)
ENDIF
ENDFOR
RETURN
ENDPROC


PROCEDURE refresh_control
this.sys_width=SYSMETRIC(1)
this.sys_height=SYSMETRIC(2)
IF this.design_width>=this.sys_width OR THIS.DEsign_height>=this.sys_height
RETURN
ENDIF
*!* thisform.Visible=.f.
LOCAL X_RATE,Y_RATE
X_RATE=this.sys_width / THIS.DEsign_width
Y_RATE=this.sys_height / THIS.DEsign_height
*!* IF THISFORM.WindowState<>2
THISFORM.Width= INT(THISFORM.Width * X_RATE)
THISFORM.Height= INT(THISFORM.Height * Y_RATE)
IF THISFORM.AutoCenter
THISFORM.AutoCenter=.T.
ELSE
THISFORM.Left=INT(THISFORM.Left * X_RATE)
THISFORM.Top= INT(THISFORM.Top * Y_RATE)
ENDIF
*!* ENDIF
THIS.Adjust_controls(THISFORM, X_RATE, Y_RATE)
*!* thisform.Visible=.t.
ENDPROC


ENDDEFINE
*
*-- EndDefine: adjust_screen
**************************************************



改一下design_width, design_height为你设计时的屏幕分辨率
将这个控件拉入你表单,在表单init事件中加上一句thisform.adjust_screen1.refresh_control()
wellen2000 2010-12-24
  • 打赏
  • 举报
回复
哇塞,原来还可以这么方便啊
我一般都用resize事件.
wwwwb 2010-12-24
  • 打赏
  • 举报
回复
控件的Anchor属性
Anchor属性的意思,它有0-9十种值,各自代表的意思如下:
以下是我做测试的结果:
DH:表单高度的增量
DW:表单宽度的增量
测试过程:用代码把按钮的left和top各加80,长和高各加10后,再调整表单大小,再观察按钮的位置和大小
old值
oldtop=50
oldleft=50
oldheight=27
oldwidth=84
new值
newtop=130
newleft=130
newheight=37
newwidth=94
0:NULL
1:height和top变回old值,left和width为130和94(而且在再度移动按钮位置和改变大小前,再调整表单,按钮不再受影响)
2:和1相反,是left和width变回old值,height和top为37、130(而且在再度移动按钮位置和改变大小前,再调整表单,按钮不再受影响)
3:left、top、height、width都变为原来的值
4:height为oldheight,width、left为new值,top为oldtop+DH,即保持和表单底部的距离保持在设计阶段的值
5:top为oldtop,left、width为new值,height为oldheight+DH,即表单的高度增加多少,控件的高度也增加多少
6:left、width、height均为old值,只是height为oldheight+DH,即表单的高度增加多少,控件的高度也增加多少
7:top、left、widht均为OLD值,只是height为oldheight+DH,即表单的高度增加多少,控件的高度也增加多少
8:top、height均为new值,width就为old值,left就是oldleft+DW,就是控件保持和表单右边的距离不变
9:top、height、width均为old值,left就是oldleft+DW,就是控件保持和表单右边的距离不变
注意:它的十个可用的值要加起来用的,比如,现在我有一个Listview,我要让它在表单缩放时,Top和left保持不变,右边界和底部边界跟随表单一起缩放,那么就要用到Anchor中的四个值:
1——顶部绝对,即距表单顶部的距离保持不变;
2——左边绝对,即距表单左边的距离保持不变;
4——底部绝对,即距表单底部的距离保持不变;
8——右边绝对,即距表单右边的距离保持不变;
现在,把Listview的anchor设置为15(1+2+4+8),缩放表单时Listview就跟着自动缩放了。
我是小数位 2010-12-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wwwwb 的回复:]
vfp9中设置控件的ANCHOR属性
[/Quote]
Visual FoxPro 9.0 语言参考
Anchor 属性 *NEW &&新增屬性
相关信息
全部折叠 全部展开
定义在调整容器大小时,可视控件锚定到父容器的哪些边。设计和运行时可读/写。


Control.Anchor [= nValue]


返回值
nValue

指定一个决定控件锚定行为的 Bit 值。下表描述了可以对 nValue 设置或相加的 Bit 值。
*使用方法译者注:决定好锚定方法后,在 Anchor 属性中输入用加法计算出的、表中对应的 Bit 值之和(如示例表中说明部分的蓝色解释),也可以使用Anchor生成器。另外,Anchor属性不会受到LEFT、HEIGHT等属性的范围限制,即控件的这些属性自动在 其属性值的范围内取值。
 
位置 Bit 值 Bit 号 冲突值 说明
上 左
0


(默认值) 控件锚定到容器的上和下边,且不会改变上和左边之间的距离。*即:不锚定

上 绝对
1
0
16, 512
控件锚定到容器的上边,且不会改变与上边之间的距离。

左 绝对
2
1
32, 256
控件锚定到容器的左边,且不会改变与左边之间的距离。

下 绝对
4
2
64, 512
控件锚定到容器的下边,且不会改变与下边之间的距离。

右 绝对
8
3
128, 256
控件锚定到容器的右边,且不会改变与右边之间的距离。

上 相对
16
4
1, 512
控件锚定到容器的上边,且保持与上边的相对距离。

左 相对
32
5
2, 256
控件锚定到容器的左边,且保持与左边的相对距离。

下 相对
64
6
4, 512
控件锚定到容器的下边,且保持与下边的相对距离。

右 相对
128
7
8, 256
控件锚定到容器的右边,且保持与右边的相对距离。

固定水平大小
256
8
2, 8, 32, 128
锚定控件的中心相对于左边和右边,但保持水平大小。

固定垂直大小
512
9
1, 4, 16, 64
锚定控件的中心相对于上边和下边,但保持垂直大小。

下表说明了 Anchor 属性常用设置的例子。
 
控件 nValue 说明
TextBox 或 EditBox
10
调整父控件大小时,调整被锚定控件的水平大小。*译者注:2+8=10 (左绝对+右绝对)

CommandButton
12
显示两个一组的控件,例如,右下角的 OK 和 Cancel。*译者注:4+8=12 (下绝对+右绝对)

CommandButton
128 和 32
保持命令按钮距离左边和右边的位置。*译者注:128(右相对) & 32(左相对)

CommandButton
260
保持控件中心距离表单底部的位置。*译者注:4+256=260 (下绝对+固定水平大小)

有效控件*译者加
15
随容器放大或缩小控件,控件四边保持与容器四边的绝对距离。1+2+4+8=15

有效控件*译者加
240
随容器放大或缩小控件,控件四边保持与容器四边的相对距离。16+32+64+128=240


备注
应用于: CheckBox 控件 | ComboBox 控件 | CommandButton 控件 | CommandGroup 控件 | Container 对象 | Control 对象 | EditBox 控件 | Grid 控件 | Image 控件 | Label 控件 | Line 控件 | ListBox 控件 | OLE 绑定控件 | OLE 容器控件 | OptionButton 控件 | OptionGroup 控件 | PageFrame 控件 | Shape 控件 | Spinner 控件 | TextBox 控件

当控件的 Anchor 属性是初始设置时(即:当控件实例化时),锚定动作在运行时基于控件的坐标。它并不是基于控件的当前位置。因此,即使移动了控件,锚定动作仍保持在控件的原始位置。该行为解释了 0 和 3(1+2) 的 Anchor 值之间的差别。

例如,假设表单上存在一个 CommandButton 控件,且控件的 Anchor 属性设置为 3。通过在控件的 Click 事件中插入以下代码,并单击按钮,就可以移动命令按钮:

复制程序代码
This.Left = This.Left + 10


但是,当调整表单大小时,控件返回到原始位置。

提示:
如果您想在控件移动之后,根据控件的当前位置进行锚定,可以重置控件的 Anchor 属性为 0,然后还原为 3。例如,在命令按钮的 Click 事件中使用以下代码,当单击它时移动命令按钮,但在调整表单大小时仍保留控件的当前位置:
This.Left = This.Left + 10
This.Anchor = 0
This.Anchor = 3
以下容器中控件的 Anchor 属性的设置有效:
CommandGroup 控件
Container 对象
Control 对象
Form 对象
OptionGroup 控件

Page 对象

ToolBar 和 Column 对象中的控件忽略 Anchor 属性的设置。

如果锚定值设置为对边,则可以调整控件的大小,例如,左边与右边(10)或上边与下边(5)。如果设置某个单独的边,则仅会移动控件。

如果不设置明确的轴的 Bit 值,则在调整容器大小时控件的位置不会相对于轴改变(译者注:对于256和512而言)。例如,Bit 号 1, 3, 5, 7 和 10 影响上下尺寸。

不能设置彼此冲突的 Bit 值。包括以下 Bit 值:

相同边的绝对与相对 Bit 值,例如为 17 的 nValue 。

相同轴边的固定大小与边的 Bit 值,例如为 258 或 513 的 nValue 。

有关冲突值的描述,请参见 nValue 表中所列的值。

相关信息
其他资源
属性
添加对象到表单
扩展表单的控件
如果其他版本:
則要在表單的 resize 事件中來寫代码.按比例在調!
wwwwb 2010-12-24
  • 打赏
  • 举报
回复
vfp9中设置控件的ANCHOR属性
-晴天 2010-12-23
  • 打赏
  • 举报
回复
在 resize 事件中用代码来解决,不过,挺麻烦.

2,722

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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