為了提公升使用者的體驗,窗體不能再固定其大小(使用者不能隨意改變窗體的大小),所以要做到窗體適應電腦螢幕的解析度,窗體中的控制項要跟隨窗體的變化比例而變化。
通過網上查詢學習,發現有幾個位大佬的方法不錯,所以把他們的**加到自己的工程中測試了一下,發下儘管能實現比例變化的功能,但是還是有時候會有控制項錯位(下面的方法一),頁面載入較慢等問題。在沒尋找到更好的方法下,先把這兩種方法歸納一下。
一、類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...