C winform窗體及其控制項的自適應

2021-10-03 14:54:58 字數 4390 閱讀 3729

為了提公升使用者的體驗,窗體不能再固定其大小(使用者不能隨意改變窗體的大小),所以要做到窗體適應電腦螢幕的解析度,窗體中的控制項要跟隨窗體的變化比例而變化。

通過網上查詢學習,發現有幾個位大佬的方法不錯,所以把他們的**加到自己的工程中測試了一下,發下儘管能實現比例變化的功能,但是還是有時候會有控制項錯位(下面的方法一),頁面載入較慢等問題。在沒尋找到更好的方法下,先把這兩種方法歸納一下。

一、類autosizeformclass

1、 類的作用:

(1)使用它去記錄窗體和其控制項的初始位置和大小;

(2)根據窗體變化了的大小,成比例地實現其控制項的水平和垂直方向的變化,也就是自適應;

2、autosizeformclass**

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.windows.forms;

namespace fb100_rs485

//(2).宣告 1個物件

//注意這裡不能使用控制項列表記錄 list nctrl;,因為控制項的關聯性,記錄的始終是當前的大小。

// public list oldctrl= new list();//這裡將西文的大於小於號都過濾掉了,只能改為中文的,使用中要改回西文

//public listoldctrl = new list();//20200305

//儲存控制項名和他的位置

public dictionaryoldctrl = new dictionary();//20200305

int ctrlno = 0;//1;

//(3). 建立兩個函式

//(3.1)記錄窗體和其控制項的初始位置和大小,

public void controllinitializesize(control mform)

private void addcontrol(control ctl)

else//該鍵不存在,則新增

insertdictionary(c.name, objctrl);

//**放在這裡,是先記錄控制項本身,後記錄控制項的子控制項

if (c.controls.count > 0)

addcontrol(c);//窗體內其餘控制項還可能巢狀控制項(比如panel),要單獨抽出,因為要遞迴呼叫}}

//(3.2)控制項自適應大小,

public void controlautosize(control mform)

else//該鍵不存在,則新增

addcontrol(mform);//窗體內其餘控制項可能巢狀其它控制項(比如panel),故單獨抽出以便遞迴呼叫

}//float wscale = (float)mform.width / (float)oldctrl[0].width;//新舊窗體之間的比例,與最早的舊窗體

//float hscale = (float)mform.height / (float)oldctrl[0].height;//.height;

float wscale = (float)mform.width / oldctrl[mform.name].width; ;//新舊窗體之間的比例,與最早的舊窗體

float hscale = (float)mform.height / oldctrl[mform.name].height; ;//.height;

ctrlno = 1;//進入=1,第0個為窗體本身,窗體內的控制項,從序號1開始

autoscalecontrol(mform, wscale, hscale);//窗體內其餘控制項還可能巢狀控制項(比如panel),要單獨抽出,因為要遞迴呼叫

}private void autoscalecontrol(control ctl, float wscale, float hscale)

if (widths >= ctl.size.width) // 如果調整列的寬度大於設定列寬

d**.autosizecolumnsmode = datagridviewautosizecolumnsmode.displayedcells; // 調整列的模式 自動

else

d**.autosizecolumnsmode = datagridviewautosizecolumnsmode.fill; // 如果小於 則填充

cursor.current = cursors.default;}}

}private void autoscalefont(control c)

}private void insertdictionary(string name, controlrect cr) //新增控制項名和位置,如果名稱重複則更新

}if (flag == false)

foreach (var value in temp)

temp.clear();}}

}

3、使用方法

1)把自適應的類整體複製到你的工程命名空間裡, 然後在需要自適應的窗體中做3步即可;

2)宣告自適應類例項;

3)為窗體新增load事件,並在其方法form1_load中,呼叫類的初始化方法,記錄窗體和其控制項初始位置和大小;

4)為窗體新增sizechanged事件,並在其方法form1_sizechanged中,呼叫類的自適應方法,完成自適應;

在窗體**中加入**如下:

namespace fb100_rs485

/// /// 窗體載入,初始化

///

///

///

private void mainform_load(object sender, eventargs e)

private void mainform_sizechanged(object sender, eventargs e)

}}

4、總結

(1)頁面載入較慢,某些時候會造成控制項錯位;

(2)介面變大時,控制項中的文字不會跟隨變化,控制項之間的間距會變得很大,整體看的不是很協調;

二、方法二

2、**

public mainform()

#region 控制項大小隨窗體大小等比例縮放

private float x;//定義當前窗體的寬度

private float y;//定義當前窗體的高度

private void settag(control cons)}}

private void setcontrols(float newx, float newy, control cons)

);//根據窗體縮放的比例確定控制項的值

con.width = convert.toint32(system.convert.tosingle(mytag[0]) * newx);//寬度

con.height = convert.toint32(system.convert.tosingle(mytag[1]) * newy);//高度

con.left = convert.toint32(system.convert.tosingle(mytag[2]) * newx);//左邊距

con.top = convert.toint32(system.convert.tosingle(mytag[3]) * newy);//頂邊距

single currentsize = system.convert.tosingle(mytag[4]) * newy;//字型大小

con.font = new font(con.font.name, currentsize, con.font.style, con.font.unit);

if (con.controls.count > 0)}}

}private void mainform_resize(object sender, eventargs e)

#endregion

3、注意

(1)初始化裡的寬高設定不要忘記了;

(2) 其中 form1_resize 方法需要自己在窗體「屬性」裡手動設定resize方法(找到下圖中resize,雙擊後面空白處就可);

(3)如果不需要字型的縮放可自行注釋掉下面兩行**。

single currentsize = system.convert.tosingle(mytag[4]) * newy;//字型大小

con.font = new font(con.font.name, currentsize, con.font.style, con.font.unit);

總結:

窗體不能無限的縮小,因為當窗體縮小到一定的程度時,窗體中的控制項就會錯位,所以一定要設定窗體的最小尺寸(通過設定窗體的minimumsize屬性)。

C WinForm窗體及其控制項的自適應

c winform窗體及其控制項自適應各種螢幕解析度 一。說明 我們自己編寫程式的介面,會遇到各種螢幕解析度,只有自適應才能顯的美觀。實際上,做到這點也很簡單,就是首先記錄窗體和它上面控制項的初始位置和大小,當窗體改變比例時,其控制項的位置和大小也按此比例變化即可。因為窗體上控制項的位置和大小是相對...

改進C WinForm窗體及其控制項的自適應

工作原因,所以才知道了這麼多,沒事也經常轉轉部落格,最近發現的問題在網上找到一篇文章寫得很好,解決了我的問題,特此在這裡和大家一起分享!之前使用的電腦是windows64位的,vs2013編寫好的程式在本機執行沒有問題,可是轉移到32位的時候,winform的窗體開始有了一些 錯位 後來才知道不是多...

C WinForm製作異形窗體 控制項

製作異形窗體或控制項的思路一般都是想辦法生成乙個region,然後設定給指定的視窗或控制項。生成region的方法有很多,最常用的就是從一幅生成,把該中的透明色部分 摳 掉,剩下的部分作為乙個region。設定視窗或控制項的region可以用setwindowrgn api,不過.net frame...