改進C# WinForm窗體及其控制元件的自適應
工作原因,所以才知道了這麼多,沒事也經常轉轉部落格,最近發現的問題在網上找到一篇文章寫得很好,解決了我的問題,特此在這裡和大家一起分享!
之前使用的電腦是Windows64位的,vs2013編寫好的程式在本機執行沒有問題,可是轉移到32位的時候,winform的窗體開始有了一些 “錯位” 後來才知道不是多少位的問題,而元凶是螢幕解析度,呵呵,終於解決了!
http://blog.sina.com.cn/s/blog_45eaa01a01014ab9.html
http://blog.sina.com.cn/s/blog_45eaa01a0101c7ko.html
下面的內容是我在這片文章中摘抄的!嘿嘿!
改進C# WinForm窗體及其控制元件自適應各種螢幕解析度
一。說明
這是控制元件巢狀的問題,加入即可實現。使用面板時,要注意在窗體Load事件中,有些控制元件(比如DataGridView)的子控制元件還沒有完成,在這裡記錄控制元件的個數比較少,而在窗體SizeChanged事件中獲取的比較多(是正常的)。
解決的方法是,記錄控制元件的初始位置和大小以及處理控制元件的縮放,都放到窗體SizeChanged事件中,只需第一次記錄控制元件的初始位置和大小,之後再呼叫類的自適應方法即可。
二。使用方法
然後在需要自適應的窗體中做2步即可:
2.宣告自適應類例項。
3.為窗體新增SizeChanged事件,並在其方法Form1_SizeChanged中,首次記錄窗體和其控制元件初始位置和大小,之後呼叫類的自適應方法,完成自適應。
三。完整程式碼如下:
(一)。自適應窗體的程式碼:
using System;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
//1.宣告自適應類例項
AutoSizeFormClass asc = new AutoSizeFormClass();
public Form1()
{
InitializeComponent();
//如果加入"面板",則不能在Form1_Load中記錄控制元件的大小和位置,因為有些控制元件如dataGridView的子控制元件還未完成
//而要在在Form1_SizeChanged中,第一次改變時,記錄控制元件的大小和位置
this.skinEngine1.SkinFile = "EmeraldColor1.ssk";
}
//2. 為窗體新增Load事件,並在其方法Form1_Load中,呼叫類的初始化方法,記錄窗體和其控制元件的初始位置和大小
private void Form1_Load(object sender, EventArgs e)
{
// asc.controllInitializeSize(this);
}
//3.為窗體新增SizeChanged事件,並在其方法Form1_SizeChanged中,呼叫類的自適應方法,完成自適應
private void Form1_SizeChanged(object sender, EventArgs e)
{
asc.controlAutoSize(this);
// this.WindowState = (System.Windows.Forms.FormWindowState)(2);//記錄完控制元件的初始位置和大小後,再最大化
}
}
}
(二)。自適應類的程式碼
using System.Collections.Generic;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
class AutoSizeFormClass
{
//(1).宣告結構,只記錄窗體和其控制元件的初始位置和大小。
public struct controlRect
{
public int Left;
public int Top;
public int Width;
public int Height;
}
//(2).宣告 1個物件
//注意這裡不能使用控制元件列表記錄 List nCtrl;,因為控制元件的關聯性,記錄的始終是當前的大小。
// public List oldCtrl= new List();//這裡將西文的大於小於號都過濾掉了,只能改為中文的,使用中要改回西文
public List《controlRect》 oldCtrl = new List《controlRect》();
int ctrlNo = 0;//1;
//(3). 建立兩個函式
//(3.1)記錄窗體和其控制元件的初始位置和大小,
public void controllInitializeSize(Control mForm)
{
controlRect cR;
cR.Left = mForm.Left; cR.Top = mForm.Top; cR.Width = mForm.Width; cR.Height = mForm.Height;
oldCtrl.Add(cR);//第一個為"窗體本身",只加入一次即可
AddControl(mForm);//窗體內其餘控制元件還可能巢狀控制元件(比如panel),要單獨抽出,因為要遞迴呼叫
//this.WindowState = (System.Windows.Forms.FormWindowState)(2);//記錄完控制元件的初始位置和大小後,再最大化
//0 - Normalize , 1 - Minimize,2- Maximize
}
private void AddControl(Control ctl)
{
foreach (Control c in ctl.Controls)
{ //**放在這裡,是先記錄控制元件的子控制元件,後記錄控制元件本身
//if (c.Controls.Count > 0)
// AddControl(c);//窗體內其餘控制元件還可能巢狀控制元件(比如panel),要單獨抽出,因為要遞迴呼叫
controlRect objCtrl;
objCtrl.Left = c.Left; objCtrl.Top = c.Top; objCtrl.Width = c.Width; objCtrl.Height = c.Height;
oldCtrl.Add(objCtrl);
//**放在這裡,是先記錄控制元件本身,後記錄控制元件的子控制元件
if (c.Controls.Count > 0)
AddControl(c);//窗體內其餘控制元件還可能巢狀控制元件(比如panel),要單獨抽出,因為要遞迴呼叫
}
}
//(3.2)控制元件自適應大小,
public void controlAutoSize(Control mForm)
{
if (ctrlNo == 0)
{ //*如果在窗體的Form1_Load中,記錄控制元件原始的大小和位置,正常沒有問題,但要加入面板就會出現問題,因為有些控制元件如dataGridView的的子控制元件還沒有完成,個數少
//*要在窗體的Form1_SizeChanged中,第一次改變大小時,記錄控制元件原始的大小和位置,這裡所有控制元件的子控制元件都已經形成
controlRect cR;
// cR.Left = mForm.Left; cR.Top = mForm.Top; cR.Width = mForm.Width; cR.Height = mForm.Height;
cR.Left = 0; cR.Top = 0; cR.Width = mForm.PreferredSize.Width; cR.Height = mForm.PreferredSize.Height;
oldCtrl.Add(cR);//第一個為"窗體本身",只加入一次即可
AddControl(mForm);//窗體內其餘控制元件可能巢狀其它控制元件(比如panel),故單獨抽出以便遞迴呼叫
}
float wScale = (float)mForm.Width / (float)oldCtrl[0].Width;//新舊窗體之間的比例,與最早的舊窗體
float hScale = (float)mForm.Height / (float)oldCtrl[0].Height;//.Height;
ctrlNo = 1;//進入=1,第0個為窗體本身,窗體內的控制元件,從序號1開始
AutoScaleControl(mForm, wScale, hScale);//窗體內其餘控制元件還可能巢狀控制元件(比如panel),要單獨抽出,因為要遞迴呼叫
}
private void AutoScaleControl(Control ctl, float wScale, float hScale)
{
int ctrLeft0, ctrTop0, ctrWidth0, ctrHeight0;
//int ctrlNo = 1;//第1個是窗體自身的 Left,Top,Width,Height,所以窗體控制元件從ctrlNo=1開始
foreach (Control c in ctl.Controls)
{ //**放在這裡,是先縮放控制元件的子控制元件,後縮放控制元件本身
//if (c.Controls.Count > 0)
// AutoScaleControl(c, wScale, hScale);//窗體內其餘控制元件還可能巢狀控制元件(比如panel),要單獨抽出,因為要遞迴呼叫
ctrLeft0 = oldCtrl[ctrlNo].Left;
ctrTop0 = oldCtrl[ctrlNo].Top;
ctrWidth0 = oldCtrl[ctrlNo].Width;
ctrHeight0 = oldCtrl[ctrlNo].Height;
//c.Left = (int)((ctrLeft0 - wLeft0) * wScale) + wLeft1;//新舊控制元件之間的線性比例
//c.Top = (int)((ctrTop0 - wTop0) * h) + wTop1;
c.Left = (int)((ctrLeft0) * wScale);//新舊控制元件之間的線性比例。控制元件位置只相對於窗體,所以不能加 + wLeft1
c.Top = (int)((ctrTop0) * hScale);//
c.Width = (int)(ctrWidth0 * wScale);//只與最初的大小相關,所以不能與現在的寬度相乘 (int)(c.Width * w);
c.Height = (int)(ctrHeight0 * hScale);//
相關推薦
改進C# WinForm窗體及其控制元件的自適應
工作原因,所以才知道了這麼多,沒事也經常轉轉部落格,最近發現的問題在網上找到一篇文章寫得很好,解決了我的問題,特此在這裡和大家一起分享! 之前使用的電腦是Windows64位的,vs2013編寫好的程式在本機執行沒有問題,可是轉移到32位的時候,winform的窗體開始有了
C# WinForm窗體及其控件自適應各種屏幕分辨率
mes down 初始 ear ews 復制 .text 命名空間 markdown C# WinForm窗體及其控件自適應各種屏幕分辨率 一。說明 我們自己編寫程序的界面,會遇到各種屏幕分辨率,只有自適應才能顯的美觀。實際上,做到這點也很簡單,就是首先
Winfon 窗體控制元件自適應
由於公司的業務調整,最近不僅開發bs,還有不熟悉的cs,人手也不足,專案還多,對於cs來說,算是小白,雖然是一個人,也是硬著頭皮寫,拖拽控制元件,自定義控制元件。一個專案下來,對cs有了很深的認識,這裡好好感謝下老大以及身邊的同事,總是在我絞盡腦汁也沒想出好的解決方案
C#Winform將WebBowser控制元件替換為Chrome核心
摘要 由於最近要做一個瀏覽器式的軟體,其中有不少地方需要使用到jQuery和BootStrap,但是在C#中,預設的WebBrowser控制元件預設使用的是IE的core,而低版本的IE在JS載入上總是容易有問題,因此,打算使用Chrome的核心替換IE。準備工作 首先,
關於C#WinForm的datagridview控制元件的使用經驗及技巧收集(持續更新)
怎麼讓DataGridView顯示行號? 方法1: 在Winform窗體中選中datagridview控制元件,在其“RowPostPaint”觸發事件屬性中雙擊自動生成事件函式或者在右側的下拉框中選
C# WinForm中DateTimePicker控制元件的Text屬性和Value屬性
在WinForm中經常會用到DateTimePicker這個控制元件,用這個控制元件獲取時間會使用到Text屬性或者Value屬性。 關於這兩個屬性,還是存在著一些的不同,在這裡簡單的測試和總結一下。
C# Winform 關於ListView控制元件繫結DataTable
今天用到ListView控制元件,這裡總結一下ListView控制元件繫結DataTable的方法 下面需要特別注意的是,繫結的過程中實現繫結控制元件的column的屬性,再進行item的繫結。 與DataGridView不同的是,不能直接使用DataSourse繫結, 再
Qt Creator 窗體控制元件自適應視窗大小布局
常見的軟體視窗大小改變(最大化、手動改變時)需要視窗的部件能夠自適應佈局,而在Qt的應用程式介面設計中,對於像我一樣的初學者如何實現視窗自適應調整還是要繞點彎路的。網上百度了很多,多數說的很含糊,還有很多是用程式實現的,既然已經有Qt Creator那麼高整合度的工具了,我還是傾向於直接在Qt Crea
讓控制元件隨窗體大小變化而變化~WinForms控制元件自適應窗體大小
簡單的來說就是監控,定位+保持比例。 例如介面分為左右下三部分,其中下部分最好解決。使用Dock屬性直接定位到Bottom。難點就是上面的左右兩塊。 我的做法是:外面套一層,然後分割為左右兩部分。這裡採用TableLayoutPanel為例。將TableLayoutP
C# WinForm中NotifyICon控制元件的用法【1】
1.設定窗體屬性showinTask=false 2.加notifyicon控制元件notifyIcon1,為控制元件notifyIcon1的屬性Icon新增一個icon圖示。 3.新增窗體最小化事件(首先需要新增事件引用): // this.SizeChanged += new System.Eve
C# WinForm解決Panel控制元件中的圖片重新整理時會閃爍的問題
最近在專案開發過程中,使用Panel控制元件顯示座位背景圖,在分屏切換時,發現背景圖會閃爍。在同事的幫助下,通過以下方法解決了: 新建一個類,繼承Panel控制元件類,然後開啟該控制元件的雙重輔助緩衝區,禁止擦除背景,具體請看程式碼: 1、新建一個NewPanel
unity 解析度自適應方法及ScrollView子控制元件自適應問題
專案所需,unity需要自適應解析度,尤其需要適應全屏模式。 設定方法: 設定Canvas 屬性,如下圖 主要設定的屬性包括: Render Mode 設定為 Screen Space Canvase Scaler 的UI Scale Mode 為 Scale with Screen
qml : qml控制元件自適應;
import QtQuick 2.4 Item { property var targetItem: parent property bool fixedAspectRatio: true // Else zoom from width and height
HTML控制元件自適應
//根據寬度計算高度 function ScreenRecord() { var imageResolutio = window.screen.width + "*" + window.screen.height;
onresize()調整瀏覽器視窗時,使圖片等控制元件自適應地變化大小
今天學習JS時,按照教程裡如下程式碼實現“改變瀏覽器視窗的圖片自適應問題”,但沒有達到想要的效果,圖片在改變瀏覽器視窗的時候越變越大,重新整理頁面後又恢復原大小。 height = (document.body.clientHeight-100)*0.9; document
c# winform:當子窗體關閉時,更新父窗體DataGridView控制元件的值
在子窗體中設定最後對話方塊的屬性,然後再主窗體中根據該屬性值,重新繫結DataGridView控制元件的值。 主窗體程式碼: public partial class MainForm.
C# Winform 如何獲得窗體上控制元件相對於螢幕的位置
private Point LocationOnClient(Control c){ Point retval = new Point(0, 0); for (; c.Parent != null; c = c.
C# winform中一個類中如何呼叫另一個窗體的控制元件或方法
轉載地址:http://blog.csdn.net/ichenqingyun/article/details/52622340 一種是建立窗體物件的方式,通過物件呼叫控制元件或方法 例如: Form1 form1 = new Form1(); form1.Button;
C# winform窗體使用WebBrowser控制元件顯示百度地圖
個人微信公眾號:“免費桌面小應用”。有新程式會微信推送通知。謝謝大家掃描關注。突然想試試winfrom窗體呼叫html頁面並顯示頁面內容。就拿展示地圖來試試。先上效果圖:下面是專案建立的過程:一、開啟vs---新建專案專案選擇windows窗體專案。名字隨便取。二、右鍵專案-
(八十九)c#Winform自定義控制元件-自定義滾動條(treeview、panel、datagridview、listbox、listview、textbox)
官網 http://www.hzhcontrols.com/ 前提 入行已經7,8年了,一直想做一套漂亮點的自定義控制元件,於是就有了本系列文章。 GitHub:https://github.com/kwwwvagaa/NetWinformControl 碼雲:https://gitee.com/kwwwva