在C#中,如何实现可拖动控件

powercharlie 2003-02-26 05:01:22
在C#中,如何实现可拖动控件,这种控件有8个拖动柄。如下示:
o______o______o
| |
o| |o
| |
o-------------o
...全文
237 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
powercharlie 2003-02-27
  • 打赏
  • 举报
回复
tracker.cs

using System;
using System.Drawing;
using System.Windows.Forms;

namespace Second
{
/// <summary>
/// Tracker µÄժҪ˵Ã÷¡£
/// </summary>
public class Tracker
{
public enum Hits {Nothing = 0, LeftTop, Top, RightTop, Right, RightBottom, Bottom, LeftBottom, Left, Middle};
public enum MouseEvent {Down, Up, Move};
public Tracker()
{
//
// TODO: ÔÚ´Ë´¦Ìí¼Ó¹¹Ô캯ÊýÂß¼­
TrackRect = new Rectangle(rect.Left, rect.Top, rect.Width, rect.Height);
//
}

/// <summary>
/// Get all rects of eight grab-handlers
/// </summary>
/// <returns>array of rects</returns>
private Rectangle[] GetHandleRects()
{

Rectangle[] rects = new Rectangle[HandlerCount];

rects[0] = new Rectangle(rect.Left - HandleSize, rect.Top - HandleSize, HandleSize, HandleSize); //LeftTop
rects[1] = new Rectangle((rect.Left + rect.Right - HandleSize) / 2, rect.Top - HandleSize, HandleSize, HandleSize); //Top
rects[2] = new Rectangle(rect.Right, rect.Top - HandleSize, HandleSize, HandleSize); //RightTop
rects[3] = new Rectangle(rect.Right, (rect.Top + rect.Bottom - HandleSize) / 2, HandleSize, HandleSize); //Right
rects[4] = new Rectangle(rect.Right, rect.Bottom, HandleSize, HandleSize); //RightBottom
rects[5] = new Rectangle((rect.Left + rect.Right - HandleSize) / 2, rect.Bottom, HandleSize, HandleSize); //Bottom
rects[6] = new Rectangle(rect.Left - HandleSize, rect.Bottom, HandleSize, HandleSize); //LeftBottom
rects[7] = new Rectangle(rect.Left - HandleSize, (rect.Top + rect.Bottom - HandleSize) / 2, HandleSize, HandleSize); //Left

return rects;
}

/// <summary>
/// Draw tracker
/// </summary>
/// <param name="g">Graphics</param>
public virtual void Draw(Graphics g)
{


Rectangle area = new Rectangle(rect.Left - HandleSize, rect.Top - HandleSize, rect.Width + 2 * HandleSize, rect.Height + 2 * HandleSize);
ControlPaint.DrawBorder(g, area, Color.Blue, ButtonBorderStyle.Dotted);
ControlPaint.DrawBorder(g, rect, Color.Blue, ButtonBorderStyle.Dotted);
//ControlPaint.DrawButton(g, rect, ButtonState.Normal);

Rectangle[] rects = GetHandleRects();
foreach(Rectangle rectangle in rects)
{
ControlPaint.DrawGrabHandle(g, rectangle, true, true);
}

if(!TrackRect.Equals(rect))
{
ControlPaint.DrawBorder(g, TrackRect, Color.Blue, ButtonBorderStyle.Dotted);
}
}

/// <summary>
/// Get handle been hitted
/// </summary>
/// <param name="point">the point hitted</param>
/// <returns>the handle been hitted</returns>
public Hits HitTest(Point point)
{
if( rect.Contains(point) )
return Hits.Middle;
Rectangle[] rects = GetHandleRects();
for(Hits i = Hits.LeftTop; (int)i <= rects.Length; i++)
{
if( rects[(int)i - 1].Contains(point))
return i;
}

return Hits.Nothing;
}

/// <summary>
/// set the current cursor depend on handle been hitted
/// </summary>
/// <param name="form">the form track on</param>
/// <param name="hit">the handle been hitted</param>
public void SetCursor(Form form, Hits hit)
{
switch(hit)
{
case Hits.LeftTop:
case Hits.RightBottom:
form.Cursor = Cursors.SizeNWSE;
break;
case Hits.Top:
case Hits.Bottom:
form.Cursor = Cursors.SizeNS;
break;
case Hits.RightTop:
case Hits.LeftBottom:
form.Cursor = Cursors.SizeNESW;
break;
case Hits.Left:
case Hits.Right:
form.Cursor = Cursors.SizeWE;
break;
case Hits.Middle:
form.Cursor = Cursors.SizeAll;
break;
default:
form.Cursor = Cursors.Arrow;
break;
}

}
powercharlie 2003-02-27
  • 打赏
  • 举报
回复

经过不断实践,本人发现一种实现方法,与大家共享,如果有何建议,请勿吝啬,跟贴或发Email给我都可,Email:powercharlieii@hotmail.com:
powercharlie 2003-02-26
  • 打赏
  • 举报
回复
To Tigatron(Illidian):
该代码可实现控件移动,但是却不能画控件的移动柄。
-_-中英文数字 2003-02-26
  • 打赏
  • 举报
回复
private Point mouse_offset;

private void Control_MouseDown(object sender,System.Windows.Forms.MouseEventArgs e)
{
mouse_offset = new Point(-e.X,-e.Y);
}

private void Control_MouseMove(object sender,System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
Point mousePos = Control.MousePosition;
mousePos.Offset(mouse_offset.X, mouse_offset.Y);
((Control)sender).Location = ((Control)sender).Parent.PointToClient(mousePos);
}
}
cwj007 2003-02-26
  • 打赏
  • 举报
回复
up
jackyzheng 2003-02-26
  • 打赏
  • 举报
回复
我也想知道,我帮您 up

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧