
Maintaining the aspect ratio of a controlAny custom Windows Forms control can ensure it's aspect ratio is maintained when sized by overriding the OnSizeChanged method and forcing a specific width-height ratio. It is possible to create a base-class from which other controls can be derived that manages this ability by providing a property to turn this feature on or off. This is necessary of course if you want to be able to set the initial aspect ratio in the first place. A control that represents say, a 16:9 video screen might explicitly set the ratio in the OnSizeChanged method. The following class defines a control that, when unlocked, keeps a record of it's aspect ratio and when locked maintains that ratio whenever it's resized. C# using System; using System.ComponentModel; using System.Drawing; using System.Windows.Forms;
namespace WFTT { /// <summary> /// Creates a control with a selectively lockable aspect ratio. /// </summary> public class AspectBase : ScrollableControl { public AspectBase() { }
float _currentRatio; bool _lockRatio=false; [ Description("When true the aspect ratio of the control is locked"), Category("Behavior") ] public bool LockRatio { get{return _lockRatio;} set{_lockRatio=value;} }
protected override void OnSizeChanged(EventArgs e) { if(!_lockRatio) this._currentRatio=(float)this.Height/(float)this.Width; else this.Height=(int)(this.Width*this._currentRatio);
base.OnSizeChanged (e); }
} }
VB Imports System Imports System.ComponentModel Imports System.Drawing Imports System.Windows.Forms
Namespace WFTT '/ <summary> '/ Creates a control with a selectively lockable aspect ratio. '/ </summary>
Public Class AspectBase Inherits ScrollableControl
Public Sub New() End Sub 'New
Private _currentRatio As Single Private _lockRatio As Boolean = False
<Description("When true the aspect ratio of the control is locked"), Category("Behavior")> _ Public Property LockRatio() As Boolean Get Return _lockRatio End Get Set _lockRatio = value End Set End Property
Protected Overrides Sub OnSizeChanged(e As EventArgs) If Not _lockRatio Then Me._currentRatio = CSng(Me.Height) / CSng(Me.Width) Else Me.Height = CInt(Me.Width * Me._currentRatio) End If MyBase.OnSizeChanged(e) End Sub 'OnSizeChanged End Class 'AspectBase End Namespace 'WFTT Any custom control deriving from this class will inherit the ability to maintain it's aspect ratio. Return to the Windows Forms Tips and Tricks page.
|