最近公司要重構乙個專案,把c++寫的桌面應用改為winfrom,而此時我遇到乙個問題就是winfrom控制項的自動放大和縮小,就是根據視窗的大小來改變winfrom視窗和容器內的控制項的大小。 在網上找了很多得到的效果並不如意,大多數都在介紹控制項中的anchor屬性,但是這個屬性會受各方面的影響,比如說容器,並不能達到自己想要的效果,後來在網上找到一段**基本可以完成某些部分的放大和縮小,但是還是會出現一些問題:
當視窗最小化後重新開啟視窗就會發生混亂
因為每個計算結果都是向上取整,也就是只要有小數點就會加一導致放大縮小後幾次控制項就會擠在一
如果將控制項放在容器中就會發生混亂
為了解決這些問題,我對**進行了部分修改如下所示:
注意!使用該類的時候每個控制項的anchor屬性必須為none,autosize屬性也必須為false,絕對不能設定minimumsize和maximumsize屬性,否則視窗會在一定大小不再增大或縮小。
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
using system.windows.forms;
using system.drawing;
namespace mainwindows
public list_oldctrl = new list();
private int _ctrlno = 0;
controlrect decimals;
public void renewcontrolrect(control mform)
private void addcontrol(control ctrl)
}public void controlautosize(control mform)
private void autoscalecontrol(control mform, float wscale, float hscale)
c.top = (int)math.round((ctrltop * hscale));
if(c.top < 0 )
//儲存計算結果後的座標和大小,當下次進行計算是使用該浮點型進行計算
//確保控制項不會錯亂
//設定高度和寬度
c.width = (int)math.round((ctrlwidth * wscale));
c.height = (int)math.round((ctrlheight * hscale));
//通過比率獲取放大或縮小後的字型大小並進行設定
wsize = ctrlfontsize * wscale;
hsize = ctrlfontsize * hscale;
if (hsize < 7)
if (wsize < 7)
c.font = new font(c.font.name, math.min(hsize, wsize), c.font.style, c.font.unit);
_ctrlno++;
// 先縮放控制項本身 再縮放子控制項
if (c.controls.count > 0)
shortdigits.top = ctrltop * hscale;
shortdigits.left = ctrltop * wscale;
shortdigits.width = ctrltop * wscale;
shortdigits.height = ctrltop * hscale;}}
}}
呼叫方式如下所示:
注意!一定要用如下格式或者類似如下格式進行呼叫,否則出現錯誤
using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.linq;
using system.text;
using system.threading.tasks;
using system.windows.forms;
namespace mainwindows
private void form1_sizechanged(object sender, eventargs e)
}}
C Winfrom 簡單的運用Timer控制項
注意,在使用dateandtime時,需要新增引用 using microsoft.visualbasic 否則不可以計算時間之間的差值。using system using system.collections.generic using system.componentmodel using s...
vb中自動調整控制項的大小
機房收費系統中有很多查詢記錄類的窗體用到了mshflexgrid控制項。當沒有調整該控制項的大小時,查詢結果可能會如圖所示 而我們需要的是 這本來是乙個很簡單的調整mshflexgrid列寬的問題,只需要設定allowuserresizing即可,如圖 然後再調出 call adjustcolwid...
C 窗體設計 自動調整控制項大小
新建乙個c 應用程式,應用程式命名為change 窗體介面設計如下 雙擊窗體新增load 函式,函式中新增一下 private void form1 load object sender,eventargs e this.resize new eventhandler form1 resize 窗體...