如何实现控件大小的自动缩放?
当我的仪器面板使用宽屏的显示器时,面板可以达到全屏显示,但是各控件的大小却保持原来的大小。也就是说我调整面板的大小时,各控件大小并不能按照比例来缩放。以前一直都没有注意到这个问题,今天才突然发现,请问我该
怎么解决这个问题,达到面板和控件大小的同步缩放? 做一个灵活而美观的界面需要考虑用户操作情况、不同操作系统以及用户屏幕的分辨率等问题。
第一种比较偷懒的办法是将窗口(也就是CVI中的panel)的other Attributes中的sizable、Can Maximize属性设为假,使用户不能改变窗体的形状;
第二种方法比较复杂,但却比较灵活:
(1)调用DisplayPanel ()函数前,先获取用户屏幕的分辨率:GetScreenSize();
(2)在panel的EVENT_PANEL_SIZE事件中使用SetCtrlAttrubte()函数重新调整个控件的大小和位置;
(3)第(2)步中一种做法是考虑几种比较典型的分辨率设置(如800*600,1600*1200等),将面板预设成相应大小,在各种大小的分辨率下重新分布各控件。当用户改变窗体大小时,将各控件的属性重新设置一下即可(此方法须将sizable属性设为假,用户只能在窗体最小化,正常和最大化这三种状态之间选择);
(4)第(2)步中的另一种方法是当用户调整窗体大小时,使各空间的位置和大小呈比例缩放(此方法无需将sizable属性设为假,用户可用鼠标拖动改变窗体大小)。 补充一下:获取显示器属性也可以使用以下函数:
GetMonitorFromPanel (Main, monitor);//获得显示器ID
GetMonitorAttribute (monitor, ATTR_HEIGHT, height);//得到高度
GetMonitorAttribute (monitor, ATTR_WIDTH, width);//得到宽度
回复 2# netcreature 的帖子
请问版主能不能具体讲一下第(4)步中怎样实现各控件的位置和大小呈比例缩放?由于控件的数量很多,重新设置控件的属性时是不是要逐个的设置?有没有一种类似于缩放图片那样的功能呢? 起始控件长/起始面板长=调整后控件长/调整后面板长;
起始控件宽/起始面板宽=调整后控件宽/调整后面板宽;
同时你还要考虑控件与控件、控件与面板边缘的距离等(即在重新设置后控件的Top、Left加一个常数)。
因为各个控件的大小和位置都不完全一样,重新调整面板后,各个控件的属性都需要再设置一次。
回复 5# netcreature 的帖子
多谢版主指导,按照您说的,我先试着用:GetCtrlAttribute (panelHandle,PANEL_OK , ATTR_WIDTH,&i);
SetCtrlAttribute (panelHandle,PANEL_OK , ATTR_WIDTH,i*2 );
GetCtrlAttribute (panelHandle,PANEL_OK , ATTR_HEIGHT,&n );
SetCtrlAttribute (panelHandle,PANEL_OK , ATTR_HEIGHT,n*2);
来改变一个控件的长和宽,2是我加的缩放比例,也就是说2要用面板的缩放比例来代替。
但是,我发现只能成陪的进行缩放,因为第四个参数的值要求为int型。
并且,像table控件,缩放以后表格的各个单元格并没有放大,效果就跟只缩放面板不缩放控件一样。
如果我要实现用鼠标拖动来改变面板大小的话,就不可能是成陪的缩放,那么我该怎么做呢?
还有控件在面板中的重新定位(top和left),其第四个参数要求也是int型的,我该怎么做呢?
还请版主您能继续指导一下小弟! 如果初始画面中一个Button的长度与面板长度的比例为1/20,高度的比例为1/50的话,当窗体放大时,你只需要保证这个比例不变即可。同时,你要考虑各控件之间的间距,以及放大后窗体是否美观等问题。
将第四个参数利用上面的公式计算后(需要用Double型以保证精度)转换为整型即可。
回复 7# netcreature 的帖子
现在我基本上可以实现缩放功能了,我通过获取panel的Wigth和Height值分别计算长宽的缩放比例,然后再获取每个控件的top ,left ,wigth,height 四个参数,top 的缩放比例和Height的缩放比例一致,left的缩放比例和Wigth的缩放比例一致。通过计算得到这四个参数缩放后的值(double型),转换成int型后重新定位控件。但是由于panel中的控件数量比较多,每个控件都要执行上面相同的操作,这样所有的控件更新需要一个比较长的时间,视觉上就像电影镜头慢放一样,从上到下依次更新控件,
也显的有点混乱,实地上缩放后每个控件还需要更改别的属性,持续的时间也更长。
并且,在鼠标拖动的时候并不执行更新,各控件大小和位置保持不变,就panel大小改变,结束拖动后才是控件更新。给人的感觉也不是很舒服。
另外,有的控件只能缩放wigth,height却改变不了。
还请版主能够继续指导一下小弟! 要想看到鼠标拖动时控件同时改变,需要利用EVENT_PANEL_SIZING事件。
对于有些控件的属性不能设置,那就无能为力了。
另外,再次强调一下:使用这种方法,必须对窗体改变后的效果有很好的预见,否则,窗体改变后,各个控件的大小和位置可能都和你最初的设想背道而驰,那样就会弄巧成拙!
在panel的属性里改
在panel的属性里改,里面有个Attribute,点开,选择相应的选项 确实有这项属性,以前一直没在意!不过,它只是在你放开鼠标后,才调整各个控件的大小。而且说实话,重新调整后的窗体布局太难看了! 先求缩放比例,然后按比例调整控件的宽度、高度、字体等。注意有些控件只能调整部分属性。 panel的属性里改的是不太好看, 我的控件也很多,不能一一改啊,哪位有什么高见啊 看完之后收获不小啊,谢谢!!!
页:
[1]