winform开发中实现控件随窗体大小的改变而自动适应其改变

sdzbxfcy sdzbxfcy     2023-03-17     532

关键词:

在设计可供用户调整大小的窗体时,如何实现该窗体上的控件也应能正确地随窗体的改变而自动调整大小并且能重新定位?此时就要借助控件的.Anchor属性。Anchor属性定义控件的定位点位置。当控件锚定到某个窗体时,如果该窗体的大小被调整,那么该控件维持它与定位点位置之间的距离不变。例如,如果“:Button”控件锚定到窗体的左、右和底边缘,那么当调整该窗体的大小时,Button控件水平调整大小,维持到该窗体左边和右边的距离不变,另外控件垂直定位其自身,以便其到窗体底边的距离始终不变,如果控件未锚定而窗体的大小被调整,则该控件相对于窗体边缘的位置将发生变化。下面介绍如何将控件锚定到窗体上。
   
  首先,选择要锚定的控件。然后,在属性窗口中,单击Anchor属性右边的箭头,将显示一个编辑器,该编辑器显示一个十字线。若要设置定位点,单击该十字线的上、下、左或右部分。在默认情况下,控件锚定左边和上边,若要清除已锚定控件的边,请单击该十字线的相应臂。再次单击Anchor属性名称关闭Anchor属性编辑器。当窗体在运行显示时,该控件调整大小保持与该窗体边缘的距离不变,到锚定边缘的距离始终保持在“Windows窗体设计器”中定位该控件时所定义的距离。需要注意的是,某些控件(如ComboBox控件)有高度限制,将控件锚定到其窗体或容器的底部,无法强制该控件超过其高度限制。

 

.NET框架允许你对子控件设置属性,命令在调整父窗体大小时,它们应该如何运作。用来命令控件在调整大小时动作的两个属性就是“Dock”和“Anchor”。

Dock和Anchor通过将控件连接到它们父窗体的某个位置,而免除了使应用程序具有不可预知界面的麻烦。最好的一点就是设立这些属性不需要任何手写代码。所有事情都可以通过Visual Studio IDE中的点和单击来完成。

Anchor属性

正如名称暗示的那样,这个属性迫使控件将其自身定位在父窗体或父控件中的某个相对或绝对位置。这个属性有四个可以开启或关闭的值:

Top——表示控件中与父窗体(或父控件)相关的顶部应该保持固定。
Bottom——表示控件中与父窗体(或父控件)相关的底边应该保持固定。
Left——表示控件中与父窗体(或父控件)相关的左边缘应该保持固定。
Right——表示控件中与父窗体(或父控件)相关的右边缘应该保持固定。
要对一个控件设置Anchor属性,只需在Visual Studio设计器中选择控件,然后转到属性窗口。你会看到一个标注为“Anchor”的属性。点击这个属性值的部分,会出现一个小窗口让你选择想要赋予控件的锚点。图表A所示是选择了“顶边、左边”的anchor设置窗口。图表B所示是选择了“底边、右边”的窗口。

图表A

 技术图片

Anchor工具顶部和左边

 

图表B

技术图片

Anchor工具底部和右边

在Visual Studio中,当控件放置于窗体时,默认的anchor设置是“顶部、左边”,这使得控件和窗体的顶边和左边缘固定相关。

到真正发现不同的anchor设置对控件的影响时,你才能体会到锚定的意义。下面的图像会有所帮助。

 

图表C

 技术图片

小窗口

图表C所示是一个有十个子控件的窗体。每一个子控件都有不同的Anchor属性值,并用它的anchor设置标注。灰白色控件后面的深红色框是另一个子控件——它的Anchor属性被设为顶部、底部、左边和右边。图表D所示是区域被调大以后的同一个窗体。

 

图表D

 技术图片

大窗口

正如你所看到的那样,每一个控件在父窗体中都自动地保持它的位置。我们没有编写代码来完成这一点;只是简单地设置了控件的Anchor属性。

有几个重要的地方不得不提。一个就是如果你没有指定一个控件有左或右锚定,它将在父窗体中保留一个相对左/右位置。如果你没有指定一个控件是否有顶部或底部锚定,也是一样的。对于这一点,一个很好的例子就是标注为“无Anchor”的控件。这样的控件没有锚定值,所以它只是漂浮在窗体中央。

另一个极端就是选择了所有anchor值的控件(顶部、底部、左边、右边)。对这一点,图表C和图表D中其它控件后面的深红色方形可见物就是一个例子。当选择了所有的anchor值时,控件只是在调整父窗体大小时,随着增大和收缩——与窗体的边缘比较起来它的所有边缘保持静止不变。

Dock属性

Dock属性迫使控件紧贴父窗体(或控件)的某个边缘。虽然Anchor属性也可以实现这一点,但是dock属性使得你能够在父窗体中让子窗体可以在上方(或旁边)互相“堆叠”。如果某个子窗体改变了大小,其它停驻在它旁边的子窗体也会随之改变。

和Anchor属性不同的是,你可以将Dock属性设置为一个单值。有效值如下所示:

Top——迫使控件位于父窗体(或控件)的顶部。如果有同一个父窗体的其它子控件也被设置为停驻在顶部的话,那么控件将在彼此上方相互堆叠。
Bottom——迫使控件位于父窗体(或控件)的底部。如果有同一个父窗体的其它子控件也被设置为停驻在底部的话,那么控件将在彼此上方相互堆叠。
Left——迫使控件位于父窗体(或控件)的左边。如果有同一个父窗体的其它子控件也被设置为停驻在左边的话,那么控件将在彼此旁边相互堆叠。
Right——迫使控件位于父窗体(或控件)的右边。如果有同一个父窗体的其它子控件也被设置为停驻在右边的话,那么控件将在彼此旁边相互堆叠。
Fill——迫使控件位于父窗体(或控件)的上方。如果有同一个父窗体的其它子控件也被设置为停驻在上方的话,那么控件将在彼此上方相互堆叠。
None——表示控件将会正常运转。
要设置一个控件的Dock值,选择Visual Studio中的控件,然后转到属性窗口。你会看到一个标注为“Dock”的属性。点击这个属性的值的部分,会出现一个小窗口让你指定该控件将如何停驻。被赋予各种值的该窗体将显示在以下图像中(图表E、图表F和图表G):

 

图表E

 技术图片

选择停驻左边

 

图表F

 技术图片

选择停驻填充

 

图表G

 技术图片

选择停驻顶部

和Anchor属性一样,直到发现它起了作用,你才会意识到它们的重要意义。图表H所示的是一个有5个子控件的窗体,每个子窗体都设置了不同的dock值。

 

图表H

 技术图片

有不同dock值的5个子控件

图表I所示的是和图表H一样的窗口,除了一点,就是现在窗口已经被调整为更大的轨迹。

 

图表I

 技术图片

更大的轨迹

图表J又显示的是和图表H一样的窗口,这次不同的是位于窗体底部、顶部、左边和右边的控件变小了。注意位于窗体中间被设置为dock Fill的控件,自动变大了。

 

图表J

 技术图片

更小的轨迹

需要记住的是,对于Dock属性,添加控件的顺序会影响它们停驻的方式。例如,如果你对窗体添加控件A,指示其停驻填充,然后你对窗体添加控件B并指示其停驻顶部,控件B将覆盖控件A的上部。原因就是控件B被认为是在控件A的“前方”,因为它是在控件A之后添加的。

要解决这种情况,你必须在Visual Studio中右击控件A,并在上下文菜单中选择“放到前面(Bring To Front)”。这样就能使控件A出现在控件B的前方,控件也就能像预期的那样运作了。

winform窗体控件随窗体自动(等比例)调整大小

新建窗体程序了,添加窗体事件Load(加载窗体时)、Resize(调整控件大小时)。自定义方法setTag(获取控件的width、height、left、top、字体大小等信息的值)、setControls(根据窗体大小调整控件大小)。1floatX,Y;//X表示窗体的宽度... 查看详情

delphi怎么加载模版在窗体内打开网页网页随窗体的大小而自动改变窗体随屏幕的大小而自动改变

怎么加载模版在窗体内打开网页网页随窗体的大小而自动改变窗体随屏幕的大小而自动改变VB源代码PrivateSubForm_Load()Me.Width=0.8*VB.Screen.WidthMe.Height=0.8*VB.Screen.HeightWebBrowser1.Navigate"URL"Skin1.ApplySkinMe.hWndEndSubPrivateSubForm_Resize()WebB... 查看详情

vb中如何设置窗体内控件大小随窗体大小改变而改变?

先在Form_Load中记录控件的相对位置及大小比例,然后在Form_Resize中按比例设置控件的位置及大小即可:DimllAsSingle,ttAsSingle,wwAsSingle,hhAsSinglePrivateSubForm_Load()ll=Text1.Left/Me.ScaleWidthtt=Text1.Top/Me.ScaleHeightww=Text1.Width/Me.ScaleWidthhh=Text1.Height/M... 查看详情

c#控件的位置和大小随窗体大小的变化而变化

...后点最大化,按钮并不在正中央,应该怎么做?要是很多控件都要联系在一起随着窗体变化而变化呢?设计视图时将控件放置再你需要的位置Dock属性为NoneAnchor属性为None则该控件的位置一直处于窗体的相对位置上也可以使用FlowLa... 查看详情

.net中如何动态改变label控件的位置

我在Winform中有一个Label控件我想要它随着窗体的Resize而动态调整在窗体中的位置本来我打算在Form的Resize事件中将Label.Location.X和Label.Location.Y的值设成宽度和高度的一半来使它居中但是编译时报错说Location不能赋值不是变量那请问... 查看详情

c#winform关于页面大小与控件大小的问题

窗体页面设置了windowState的Maximized的属性。打开软件肯定是最大屏幕,根据显示屏分辨率自动调整最大化。但是这样一来,页面的控件就出现了大小问题。如果我现在是19寸显示器开发的软件,窗体页面最大化没问题。我可以把... 查看详情

winform窗体——datagridview控件及通过此控件中实现增删改查

DataGridView:显示数据表,通过此控件中可以实现连接数据库,实现数据的增删改查一、后台数据绑定:    List<xxx>list=newList<xxx>();    dataGridView1.DataSource=list;    &nbs 查看详情

delphi实现窗体组建随窗体大小改变而改变

在网上查了许多资料去论述如何在dephi中去实现组件随窗口大小的变化而变化,然都不尽如人意。有人说用组件的align+anchors这两个属性去控制,但是我用了之后,让我大惊失色。把anchors属性下面的四个值都变为true.如果用户用鼠... 查看详情

怎样使delphi里的控件随窗体的大小变化而变化

就比如新建一个窗体,里面添加许多控件,窗体刚开始比较小,等最大化或者运行全屏时,控件的大小和位置一点都不变,显的很不对称。试了许多方法也不行,只有提问了。你应该在添加控件之前,先在窗体里面添加一些PANEL... 查看详情

mfc怎么让主窗口随view类改变大小

...对MFC的许多函数和功能还不是很了解。所以,在仿照书本开发一个仿QQ的通讯程序的时候,就碰到了一个怎么样使控件随着窗体变化的问题。好了,废话不多说,直接上主窗体图:  现在,要实现的功能如下:  使控件CLISTBO... 查看详情

c#winform关于页面大小与控件大小的问题

...能自调节的。 参考技术B刚刚试了一下在vs2010里新建一个winform,运行,生成的exe只有7k,已经很小了,以后你添加了什么自己不都知道吗?添加类对其影响很小,添加资源影响是最大的,因为资源是嵌入程序集了。 查看详情

winform主窗体被子窗体影响而缩小?

winform程序,主窗体默认为全屏显示,通过点击主窗体的按钮,我打开一个子窗体,此时在某些电脑上会出现异常,表现为主窗体缩小成屏幕一半;我子窗体上,有图片,ElementHost(嵌入WPF的空间)控件;请问大佬们,我应该怎么弄... 查看详情

winform控件大小随着窗体自适应

3个方法:#region改变控件大小//获取控件原始信息protectedvoidGetAllInitInfo(ControlctrlContainer)//inttempWidth=Screen.PrimaryScreen.Bounds.Width/5*4;//inttempHeight=Screen.PrimaryScreen.Bounds.Height/5*4;if(ctrlContain 查看详情

winform窗体在其他电脑上启动控件位置出错

各位大神们,有一个问题,求助啊。我制作的WinForm窗体设计的时候,运行得好好的。但是在拷去其他电脑上面直接启动的时候,控件的位置会错乱,但是如果在那台电脑上重新编译一次(也就是随便按两下某一个控件的属性,... 查看详情

c#winform程序自动适应显示器分辨率

...anel在tableLayoutPanel里面就是不缩放。参考技术A这个问题在winform里面很难解决的,是winform的一个令人头疼的弊端,现在基本上淘汰了。用WPF开发C/S程序的比较多 参考技术B都用WPF开发了.知道WPF方式,觉得WinForm布局很不合理.而且.Win... 查看详情

winform,combox取值问题。

主窗体有combox,如果我在子窗体中操作改变了数据库数据,然后回到主窗体,主窗体上的combox怎么样从数据库中可以得到最新的数据。在父窗体中写一个公有的绑定数据的方法,如:publicvoidBind(),这个方法是实现绑定数据到combobo... 查看详情

mfc中tabctrl控件怎么随着窗体的大小变化而变化?

...示,但是初始界面不可能就画很大,所以在想怎么让标签控件放大,哪位大神不吝赐教?参考技术A写在Onsize里获取tab的rect,然后跟界面算一下比例然后movewindow 参考技术B这有个MFCtabctrl的例子,当窗口执行WM_SIZE时,改变tabctrl的... 查看详情

mfc中tabctrl控件怎么随着窗体的大小变化而变化?

...示,但是初始界面不可能就画很大,所以在想怎么让标签控件放大,哪位大神不吝赐教?参考技术A写在Onsize里获取tab的rect,然后跟界面算一下比例然后movewindow 参考技术B这有个MFCtabctrl的例子,当窗口执行WM_SIZE时,改变tabctrl的... 查看详情