2014-09-03 49 views
-1

在這個課上,當我向左或向右伸展控件時,控件變得更大。 我想給它添加也,當我使控制更大的任何方向也裏面的文字將根據控制規模變化變得越來越大,自動適應:我怎樣才能實時更改控制文字大小,而不僅僅是控制大小?

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Globalization; 
using System.Linq; 
using System.Windows.Forms; 

namespace ControlManager 
{ 
    internal class ControlMoverOrResizer 
    { 
     private static bool _moving; 
     private static Point _cursorStartPoint; 
     private static bool _moveIsInterNal; 
     private static bool _resizing; 
     private static Size _currentControlStartSize; 
     internal static bool MouseIsInLeftEdge { get; set; } 
     internal static bool MouseIsInRightEdge { get; set; } 
     internal static bool MouseIsInTopEdge { get; set; } 
     internal static bool MouseIsInBottomEdge { get; set; } 

     internal enum MoveOrResize 
     { 
      Move, 
      Resize, 
      MoveAndResize 
     } 

     internal static MoveOrResize WorkType { get; set; } 

     internal static void Init(Control control) 
     { 
      Init(control, control); 
     } 

     internal static void Init(Control control, Control container) 
     { 
      _moving = false; 
      _resizing = false; 
      _moveIsInterNal = false; 
      _cursorStartPoint = Point.Empty; 
      MouseIsInLeftEdge = false; 
      MouseIsInLeftEdge = false; 
      MouseIsInRightEdge = false; 
      MouseIsInTopEdge = false; 
      MouseIsInBottomEdge = false; 
      WorkType = MoveOrResize.MoveAndResize; 
      control.MouseDown += (sender, e) => StartMovingOrResizing(control, e); 
      control.MouseUp += (sender, e) => StopDragOrResizing(control); 
      control.MouseMove += (sender, e) => MoveControl(container, e); 
     } 

     private static void UpdateMouseEdgeProperties(Control control, Point mouseLocationInControl) 
     { 
      if (WorkType == MoveOrResize.Move) 
      { 
       return; 
      } 
      MouseIsInLeftEdge = Math.Abs(mouseLocationInControl.X) <= 2; 
      MouseIsInRightEdge = Math.Abs(mouseLocationInControl.X - control.Width) <= 2; 
      MouseIsInTopEdge = Math.Abs(mouseLocationInControl.Y) <= 2; 
      MouseIsInBottomEdge = Math.Abs(mouseLocationInControl.Y - control.Height) <= 2; 
     } 

     private static void UpdateMouseCursor(Control control) 
     { 
      if (WorkType == MoveOrResize.Move) 
      { 
       return; 
      } 
      if (MouseIsInLeftEdge) 
      { 
       if (MouseIsInTopEdge) 
       { 
        control.Cursor = Cursors.SizeNWSE; 
       } 
       else if (MouseIsInBottomEdge) 
       { 
        control.Cursor = Cursors.SizeNESW; 
       } 
       else 
       { 
        control.Cursor = Cursors.SizeWE; 
       } 
      } 
      else if (MouseIsInRightEdge) 
      { 
       if (MouseIsInTopEdge) 
       { 
        control.Cursor = Cursors.SizeNESW; 
       } 
       else if (MouseIsInBottomEdge) 
       { 
        control.Cursor = Cursors.SizeNWSE; 
       } 
       else 
       { 
        control.Cursor = Cursors.SizeWE; 
       } 
      } 
      else if (MouseIsInTopEdge || MouseIsInBottomEdge) 
      { 
       control.Cursor = Cursors.SizeNS; 
      } 
      else 
      { 
       control.Cursor = Cursors.Default; 
      } 
     } 

     private static void StartMovingOrResizing(Control control, MouseEventArgs e) 
     { 
      if (_moving || _resizing) 
      { 
       return; 
      } 
      if (WorkType!=MoveOrResize.Move && 
       (MouseIsInRightEdge || MouseIsInLeftEdge || MouseIsInTopEdge || MouseIsInBottomEdge)) 
      { 
       _resizing = true; 
       _currentControlStartSize = control.Size; 
      } 
      else if (WorkType!=MoveOrResize.Resize) 
      { 
       _moving = true; 
       control.Cursor = Cursors.Hand; 
      } 
      _cursorStartPoint = new Point(e.X, e.Y); 
      control.Capture = true; 
     } 

     private static void MoveControl(Control control, MouseEventArgs e) 
     { 
      if (!_resizing && ! _moving) 
      { 
       UpdateMouseEdgeProperties(control, new Point(e.X, e.Y)); 
       UpdateMouseCursor(control); 
      } 
      if (_resizing) 
      { 
       if (MouseIsInLeftEdge) 
       { 
        if (MouseIsInTopEdge) 
        { 
         control.Width -= (e.X - _cursorStartPoint.X); 
         control.Left += (e.X - _cursorStartPoint.X); 
         control.Height -= (e.Y - _cursorStartPoint.Y); 
         control.Top += (e.Y - _cursorStartPoint.Y); 
         control.Font = new Font("Arial", e.Y, FontStyle.Bold); 
        } 
        else if (MouseIsInBottomEdge) 
        { 
         control.Width -= (e.X - _cursorStartPoint.X); 
         control.Left += (e.X - _cursorStartPoint.X); 
         control.Height = (e.Y - _cursorStartPoint.Y) + _currentControlStartSize.Height;      
        } 
        else 
        { 
         control.Width -= (e.X - _cursorStartPoint.X); 
         control.Left += (e.X - _cursorStartPoint.X) ; 
        } 
       } 
       else if (MouseIsInRightEdge) 
       { 
        if (MouseIsInTopEdge) 
        { 
         control.Width = (e.X - _cursorStartPoint.X) + _currentControlStartSize.Width; 
         control.Height -= (e.Y - _cursorStartPoint.Y); 
         control.Top += (e.Y - _cursorStartPoint.Y); 

        } 
        else if (MouseIsInBottomEdge) 
        { 
         control.Width = (e.X - _cursorStartPoint.X) + _currentControlStartSize.Width; 
         control.Height = (e.Y - _cursorStartPoint.Y) + _currentControlStartSize.Height;      
        } 
        else 
        { 
         control.Width = (e.X - _cursorStartPoint.X)+_currentControlStartSize.Width; 
        } 
       } 
       else if (MouseIsInTopEdge) 
       { 
        control.Height -= (e.Y - _cursorStartPoint.Y); 
        control.Top += (e.Y - _cursorStartPoint.Y); 
       } 
       else if (MouseIsInBottomEdge) 
       { 
        control.Height = (e.Y - _cursorStartPoint.Y) + _currentControlStartSize.Height;      
       } 
       else 
       { 
        StopDragOrResizing(control); 
       } 
      } 
      else if (_moving) 
      { 
       _moveIsInterNal = !_moveIsInterNal; 
       if (!_moveIsInterNal) 
       { 
        int x = (e.X - _cursorStartPoint.X) + control.Left; 
        int y = (e.Y - _cursorStartPoint.Y) + control.Top; 
        control.Location = new Point(x, y); 
       } 
      } 
     } 

     private static void StopDragOrResizing(Control control) 
     { 
      _resizing = false; 
      _moving = false; 
      control.Capture = false; 
      UpdateMouseCursor(control); 
     } 

     #region Save And Load 

     private static List<Control> GetAllChildControls(Control control, List<Control> list) 
     { 
      List<Control> controls = control.Controls.Cast<Control>().ToList(); 
      list.AddRange(controls); 
      return controls.SelectMany(ctrl => GetAllChildControls(ctrl, list)).ToList(); 
     } 

     internal static string GetSizeAndPositionOfControlsToString(Control container) 
     { 
      List<Control> controls = new List<Control>(); 
      GetAllChildControls(container, controls); 
      CultureInfo cultureInfo = new CultureInfo("en"); 
      string info = string.Empty; 
      foreach (Control control in controls) 
      { 
       info += control.Name + ":" + control.Left.ToString(cultureInfo) + "," + control.Top.ToString(cultureInfo) + "," + 
         control.Width.ToString(cultureInfo) + "," + control.Height.ToString(cultureInfo) + "*"; 
      } 
      return info; 
     } 
     internal static void SetSizeAndPositionOfControlsFromString(Control container, string controlsInfoStr) 
     { 
      List<Control> controls = new List<Control>(); 
      GetAllChildControls(container, controls); 
      string[] controlsInfo = controlsInfoStr.Split(new []{"*"},StringSplitOptions.RemoveEmptyEntries); 
      Dictionary<string, string> controlsInfoDictionary = new Dictionary<string, string>(); 
      foreach (string controlInfo in controlsInfo) 
      { 
       string[] info = controlInfo.Split(new [] { ":" }, StringSplitOptions.RemoveEmptyEntries); 
       controlsInfoDictionary.Add(info[0], info[1]); 
      } 
      foreach (Control control in controls) 
      { 
       string propertiesStr; 
       controlsInfoDictionary.TryGetValue(control.Name, out propertiesStr); 
       string[] properties = propertiesStr.Split(new [] { "," }, StringSplitOptions.RemoveEmptyEntries); 
       if (properties.Length == 4) 
       { 
        control.Left = int.Parse(properties[0]); 
        control.Top = int.Parse(properties[1]); 
        control.Width = int.Parse(properties[2]); 
        control.Height = int.Parse(properties[3]); 
       } 
      } 
     } 

     #endregion 
    } 
} 

現在我嘗試了該方法測試:MoveControl

要加入這一行:

control.Font = new Font("Arial", e.Y, FontStyle.Bold); 

但它並沒有改變任何東西。 現在我只能用鼠標改變控制尺寸到任何方向,但是文字仍然很小,並不總是在中間。

+0

喜歡的東西[這裏](HTTP://計算器。 COM /問題/ 22454194 /字體大小,影響大小-的標籤/ 22456852#22456852)。它是在VB中,但你可以很容易地轉換它 – 2014-09-03 13:38:56

+0

這是Winforms中的一個內置功能。只需更改表單的Font屬性,然後重新調整一切即可匹配。 – 2014-09-03 14:02:10

回答

-1

你有什麼樣的控制?

你是否已經看到了這一點?:How to select certain string in c# button and change font?

這是一種對於鍵式解決方案。

但是,如果你有一個個性化的控制,一個標籤,我想你可以用類似重寫控件的OnPaint方法解決這個問題:

yourcontrol.label.Font = new Font(YourFontFamily,YourSize,YourFontStyle);