Visning af usercontrol mens den Location ændres
Jeg er ved at lave en application hvor jeg med museb kan trække runde med en usercontrol runtime.Jeg ændre location i forhold til musens retning men min user control står og skifter mellem to locations.
Den flytter sig men ikke som den skal.
Jeg har prøvet DoubleBuffering men uden held.
Her er koden til min usercontrol
public TextLabel() {
InitializeComponent();
MinimumSize = new Size( 5, 5 );
}
/// <summary>
/// The number of pixels that the cursor can be within the area when displaying the correct cursor
/// </summary>
private const int GreyZone = 5;
private int MoveOffsetH = 0;
private int MoveOffsetW = 0;
private Point OrgLocation;
private bool ResizeH, ResizeW;
private bool _selected;
public bool Selected {
get { return _selected; }
set {
_selected = value;
if( value ) DrawDashedBorder();
else Invalidate();
}
}
protected override void OnMouseDown(MouseEventArgs e) {
if( e.Button.Equals( MouseButtons.Left ) ) {
ResizeW = e.X > Width - GreyZone;
ResizeH = e.Y > Height - GreyZone;
if( !ResizeH && !ResizeW ) {
OrgLocation = Location;
MoveOffsetH = e.Y;
MoveOffsetW = e.X;
Cursor = Cursors.NoMove2D;
}
}
base.OnMouseDown( e );
}
protected override void OnMouseUp(MouseEventArgs e) {
MoveOffsetH = 0;
MoveOffsetW = 0;
ResizeW = false;
ResizeH = false;
base.OnMouseUp( e );
}
/// <summary>
/// Sets the right cursors for resizing
/// Location is ref to the user control not the parent form.
/// </summary>
/// <param name="e"></param>
protected override void OnMouseMove(MouseEventArgs e) {
//Sets the cursor
if( e.X > Width - GreyZone && e.Y > Height - GreyZone )
Cursor.Current = Cursors.SizeNWSE;
else
if( e.Y > Height - GreyZone ) Cursor.Current = Cursors.SizeNS;
else
if( e.X > Width - GreyZone ) Cursor.Current = Cursors.SizeWE;
else Cursor.Current = Cursors.Default;
//Move the control
if( !ResizeW && !ResizeH && e.Button.Equals( MouseButtons.Left ) ) {
Cursor = Cursors.NoMove2D;
Console.WriteLine("Old: "+ Location.ToString() );
Point newLocation = new Point( Location.X + (e.X - MoveOffsetW), Location.Y + (e.Y - MoveOffsetH) );
Location = newLocation;
MoveOffsetH = e.Y;
MoveOffsetW = e.X;
Console.WriteLine("New: "+ Location.ToString() );
}
//Sets the new size
if( ResizeW ) Width = e.X - MoveOffsetW;
if( ResizeH ) Height = e.Y - MoveOffsetH;
if(e.Button.Equals(MouseButtons.Left))
Invalidate();
}
protected override void OnClick(EventArgs e) {
Selected = true;
base.OnClick( e );
}
protected override void OnLostFocus(EventArgs e) {
Selected = false;
base.OnLostFocus( e );
}
protected override void OnPaint(PaintEventArgs e) {
base.OnPaint( e );
if( Selected ) DrawDashedBorder();
}
private void DrawDashedBorder() {
Graphics g = this.CreateGraphics();
Pen p = (Pen)Pens.Blue.Clone();
p.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
p.Width = 5;
g.DrawRectangle( p, 0, 0, Width, Height );
}
