Foxtable(狐表)用户栏目专家坐堂 → 窗口大小自适应时在不同界面切换的问题


  共有3633人关注过本帖树形打印复制链接

主题:窗口大小自适应时在不同界面切换的问题

帅哥哟,离线,有人找我吗?
天若千颖
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:683 积分:4882 威望:0 精华:0 注册:2014/6/15 16:01:00
窗口大小自适应时在不同界面切换的问题  发帖心情 Post By:2016/8/26 21:51:00 [显示全部帖子]

看过很人包括红袍老师,有点甜等都提到过的解决方案

http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=78838&skin=0

用的最多的是:

Afterload事件

 

vars("width") = e.Form.width
vars("height") = e.Form.height

 

SizeChanged事件

 

For Each c As Winform.Control In e.Form.Controls
    c.Left = c.Left * (e.Form.Width / vars("width"))
    c.Top = c.Top * (e.Form.Height / vars("height"))
    c.Width = c.Width * (e.Form.Width / vars("width"))
    c.Height = c.Height * (e.Form.Height / vars("height"))
Next
msgbox(e.Form.Height / vars("height"))
vars("width") = e.Form.width
vars("height") = e.Form.height

 

 

大红袍老师还提到过控制窗口中的Button大小,只放大缩小其他控件的办法。

http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=83979

 

这样的方法只对独立窗口起作用,因为每个独立窗口都是单独打开,打开的时候是原始大小,一旦点击最大化按钮,可以触发窗口的SizeChanged时间,从而实现放缩。但是,很多项目其实基本都是一个主界面,所有的界面都在一个主界面中显示,当窗口第一次最大化时,触发第一个窗口的SizeChanged事件,第一个窗口可以最大化,但是当切换到第二个窗口的时候,窗口大小并没有变,没有办法触发SizeChanged事件,窗口中的控件就没法放缩了。

 

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目4.rar

如上项目,打开项目,在窗口1和窗口2大小相同, 


图片点击可在新窗口打开查看此主题相关图片如下:窗口1.jpg
图片点击可在新窗口打开查看

图片点击可在新窗口打开查看此主题相关图片如下:窗口2.jpg
图片点击可在新窗口打开查看

 

当放大窗口1之后,再切换到窗口2,窗口2并没有变化。另外,当窗口最小化的时候,也出出现算术溢出的问题。
 


图片点击可在新窗口打开查看此主题相关图片如下:窗口1放大.jpg
图片点击可在新窗口打开查看

图片点击可在新窗口打开查看此主题相关图片如下:窗口2并没有放大.jpg
图片点击可在新窗口打开查看

 

这种所有窗口都只在一个界面之中,如何实现窗口切换的过程中,也能实现控件的自动适应屏幕呢?

因为我的项目中,有一张地图,需要在地图上标注名字,如果采用停靠或者锚定的方法,Lable没法固定在正确的地方,比如,标注一个“新疆”,采用锚定的办法,当窗口放大之后,图片虽然也能放大,但是,Lable文字没法锚定,放大之后Lable标注的地方,一般都不是新疆了。

 

这样的情况有没有比较好的解决方案,请大红袍老师或者其他遇到过的人指导。

[此贴子已经被作者于2016/8/26 21:56:43编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
天若千颖
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:683 积分:4882 威望:0 精华:0 注册:2014/6/15 16:01:00
  发帖心情 Post By:2016/8/27 7:41:00 [显示全部帖子]

你说的还是通过锚定的方式控制窗口大小,那PANLE中的PICTURE上标注的LABLE呢?如何在窗口大小改变了的情况下,还是标注在和原来图片的固定位置上?比如中国地图图片,窗口原始大小上标注了“北京”,一旦窗口放大,如何让“北京”这个LABLE还在地图正确的位置上?

 回到顶部
帅哥哟,离线,有人找我吗?
天若千颖
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:683 积分:4882 威望:0 精华:0 注册:2014/6/15 16:01:00
  发帖心情 Post By:2016/8/27 10:43:00 [显示全部帖子]

 Hypen老师,你回复的3楼的问题参考的帖子我以前看过,但是并不能解决我提到的问题。这种窗口自适应的解决方案只针对一个窗口有用,或者说对独立窗口有用,因为独立窗口每个窗口都是独立的,都可以有SizeChanged事件。

 但是,当我所有的窗口都在一个界面里面,比如我一楼中的例子,所有的窗口都是主窗口,点击按钮“窗口1”和“窗口2”,只有一个界面,当窗口1从原始大小放大到全屏的时候,可以触发窗口的SizeChanged事件,实现控件大小也自动缩放,和http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=83752中的一样的效果。但是,当从窗口1切换到窗口2的时候,并没有触发窗口2的SizeChanged事件啊,因为窗口2的大小并没有改变。

你的意思是说,把各个窗口的vars("width")和vars("height")名为不同的名称就可以了么?为何我在改窗口2的AfterLoad事件的时候,提示[upload=jpg,qq截图20160818204236.jpg]UploadFile/2016-

 


图片点击可在新窗口打开查看此主题相关图片如下:qq截图20160827104246.jpg
图片点击可在新窗口打开查看

 

只修改SizeChanged的话,也提示错误。


 

[此贴子已经被作者于2016/8/27 10:44:55编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
天若千颖
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:683 积分:4882 威望:0 精华:0 注册:2014/6/15 16:01:00
  发帖心情 Post By:2016/8/27 11:01:00 [显示全部帖子]

例子就在1楼,控件随窗口自动放缩的解决办法之前很多帖子都提到了,都是针对一个窗口,或者独立窗口,如果我所有的窗口都是主窗口呢,只有第一个窗口改变大小之后可以触发sizechanged,在放大的情况下切换到另外的窗口,没法触发sizechanged啊。

 回到顶部
帅哥哟,离线,有人找我吗?
天若千颖
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:683 积分:4882 威望:0 精华:0 注册:2014/6/15 16:01:00
  发帖心情 Post By:2016/8/27 11:07:00 [显示全部帖子]

能否这样解决,给每一个窗口定义一个默认大小,如果识别到窗口的实际大小不等于默认大小,则执行与SIZECHANGED相同的代码?这个,应该在窗口的AFTERLOAD事件中吧?

 回到顶部
帅哥哟,离线,有人找我吗?
天若千颖
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:683 积分:4882 威望:0 精华:0 注册:2014/6/15 16:01:00
  发帖心情 Post By:2016/8/27 11:39:00 [显示全部帖子]

 谢谢Hypen老师,好像确实已经解决了,周一我放到我实际项目中测试,今天没有带加密狗回来。

 回到顶部
帅哥哟,离线,有人找我吗?
天若千颖
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:683 积分:4882 威望:0 精华:0 注册:2014/6/15 16:01:00
  发帖心情 Post By:2016/8/27 11:56:00 [显示全部帖子]

 再问一下,Hpyen老师,我明白,当打开窗口的时候,如果打开窗口1,再最大化,可以触发窗口1的SizeChanged事件,但是,在最大化的情况下切换到窗口2,窗口大小并没有改变,是如何触发窗口2的SizeChanged事件的呢?难道说窗口2在打开窗口1的时候就已经加载了?

 回到顶部
帅哥哟,离线,有人找我吗?
天若千颖
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:683 积分:4882 威望:0 精华:0 注册:2014/6/15 16:01:00
  发帖心情 Post By:2016/8/27 15:53:00 [显示全部帖子]

 Hypen,我只想让窗口中Panle中的控件自动放缩,这样写怎么不对?

For Each c As Winform.Control In e.Form.Controls("panel1")
    If TypeOf c Is WinForm.Button OrElse TypeOf c Is WinForm.PictureBox Then

错误提示:
无法将类型为“Foxtable.WinForm.Panel”的对象强制转换为类型“System.Collections.IEnumerable”。

 回到顶部
帅哥哟,离线,有人找我吗?
天若千颖
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:683 积分:4882 威望:0 精华:0 注册:2014/6/15 16:01:00
  发帖心情 Post By:2016/8/27 21:12:00 [显示全部帖子]

我只想让Panel1中的控件大小随窗口变,但是好像不行。

 

 

If e.Form.Width > 0 AndAlso e.Form.Height  > 0 Then
    e.Form.StopRedraw
For Each c As Winform.Control In e.Form.Controls("Panel1").children
       c.Left = c.Left * (e.Form.Width / vars("width3"))
        c.Top = c.Top * (e.Form.Height / vars("height3"))
        c.Width = c.Width * (e.Form.Width / vars("width3"))
        c.Height = c.Height * (e.Form.Height / vars("height3"))    
Next
vars("width3") = e.Form.width
vars("height3") = e.Form.height
    e.Form.ResumeRedraw
End If

 

窗口3,北京的地方标注了“这里是北京”


图片点击可在新窗口打开查看此主题相关图片如下:窗口3.jpg
图片点击可在新窗口打开查看

 

当最大化之后,便不再是了。


 


图片点击可在新窗口打开查看此主题相关图片如下:窗口3最大化.jpg
图片点击可在新窗口打开查看

 

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:窗口缩放.rar


 回到顶部
帅哥哟,离线,有人找我吗?
天若千颖
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:683 积分:4882 威望:0 精华:0 注册:2014/6/15 16:01:00
  发帖心情 Post By:2016/8/28 12:16:00 [显示全部帖子]

谢谢红袍老师,周末还加班回复问题。

 回到顶部
总数 14 1 2 下一页