1. 程式人生 > >改進C# WinForm窗體及其控制元件的自適應

改進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窗體及其控制元件自適應各種螢幕解析度
一。說明

  2012-11-30 曾經寫過 《C# WinForm窗體及其控制元件自適應各種螢幕解析度》  ,其中也講解了控制元件自適應的原理。近期有網友說,裝在panel裡面的控制元件,沒有效果?

  這是控制元件巢狀的問題,加入即可實現。使用面板時,要注意在窗體Load事件中,有些控制元件(比如DataGridView)的子控制元件還沒有完成,在這裡記錄控制元件的個數比較少,而在窗體SizeChanged事件中獲取的比較多(是正常的)。
  解決的方法是,記錄控制元件的初始位置和大小以及處理控制元件的縮放,都放到窗體SizeChanged事件中,只需第一次記錄控制元件的初始位置和大小,之後再呼叫類的自適應方法即可。
 
 
二。使用方法

  1.把自適應的類整體複製到你的工程名稱空間裡,(這樣做,每個窗體均可使用)
     然後在需要自適應的窗體中做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