首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

在C#中怎么实现蚂蚁线啊谢谢

2012-02-27 
在C#中如何实现蚂蚁线啊!多谢!在C#中如何实现蚂蚁线啊!多谢!求高手详细说明一下,我是C#新手 [解决办法]Con

在C#中如何实现蚂蚁线啊!多谢!
在C#中如何实现蚂蚁线啊!多谢!
求高手详细说明一下,我是C#新手


[解决办法]
ControlPaint.DrawReversibleFrame 方法
在屏幕上的指定边界内,按指定背景色绘制处于指定状态的可逆框架。

public static void DrawReversibleFrame (
Rectangle rectangle,
Color backColor,
FrameStyle style
)

参数
rectangle
代表要绘制矩形的尺寸的 Rectangle(采用屏幕坐标)。

backColor
框架的背景的 Color。

style
FrameStyle 值之一,它指定框架的样式。
    Dashed 细虚线边框。
    Thick 粗实线边框。

下面的代码示例阐释了如何使用 FrameStyle 枚举。要运行该示例,请将以下代码粘贴到一个名为 Form1 的包含多个控件的窗体中。此示例假定将 MouseDown、MouseMove 和 MouseUp 事件连接到该示例中定义的事件处理程序方法。

// The following three methods will draw a rectangle and allow
// the user to use the mouse to resize the rectangle. If the
// rectangle intersects a control 's client rectangle, the
// control 's color will change.

bool isDrag = false;
Rectangle theRectangle = new Rectangle
(new Point(0, 0), new Size(0, 0));
Point startPoint;

private void Form1_MouseDown(object sender,
System.Windows.Forms.MouseEventArgs e)
{

// Set the isDrag variable to true and get the starting point
// by using the PointToScreen method to convert form
// coordinates to screen coordinates.
if (e.Button==MouseButtons.Left)
{
isDrag = true;
}

Control control = (Control) sender;

// Calculate the startPoint by using the PointToScreen
// method.
startPoint = control.PointToScreen(new Point(e.X, e.Y));
}

private void Form1_MouseMove(object sender,
System.Windows.Forms.MouseEventArgs e)
{

// If the mouse is being dragged,
// undraw and redraw the rectangle as the mouse moves.
if (isDrag)

// Hide the previous rectangle by calling the
// DrawReversibleFrame method with the same parameters.
{
ControlPaint.DrawReversibleFrame(theRectangle,
this.BackColor, FrameStyle.Dashed);

// Calculate the endpoint and dimensions for the new
// rectangle, again using the PointToScreen method.
Point endPoint = this.PointToScreen(new Point(e.X, e.Y));
int width = endPoint.X-startPoint.X;
int height = endPoint.Y-startPoint.Y;
theRectangle = new Rectangle(startPoint.X,
startPoint.Y, width, height);

// Draw the new rectangle by calling DrawReversibleFrame
// again.
ControlPaint.DrawReversibleFrame(theRectangle,
this.BackColor, FrameStyle.Dashed);
}
}

private void Form1_MouseUp(object sender,
System.Windows.Forms.MouseEventArgs e)
{

// If the MouseUp event occurs, the user is not dragging.
isDrag = false;

// Draw the rectangle to be evaluated. Set a dashed frame style
// using the FrameStyle enumeration.
ControlPaint.DrawReversibleFrame(theRectangle,
this.BackColor, FrameStyle.Dashed);

// Find out which controls intersect the rectangle and
// change their color. The method uses the RectangleToScreen
// method to convert the Control 's client coordinates
// to screen coordinates.
Rectangle controlRectangle;
for(int i = 0; i < Controls.Count; i++)
{
controlRectangle = Controls[i].RectangleToScreen
(Controls[i].ClientRectangle);
if (controlRectangle.IntersectsWith(theRectangle))
{
Controls[i].BackColor = Color.BurlyWood;


}
}

// Reset the rectangle.
theRectangle = new Rectangle(0, 0, 0, 0);
}
[解决办法]
from
http://blog.sina.com.cn/u/589d32f50100098p

delegate void LINEDDAPROC(int X, int Y, IntPtr lpData);
[DllImport( "gdi32.dll ")]
static extern int LineDDA(int nXStart, int nYStart, int nXEnd, int nYEnd,
LINEDDAPROC lpLineFunc, IntPtr lpData);

private const byte PT_CLOSEFIGURE = 1;
private const byte PT_LINETO = 2;
private const byte PT_BEZIERTO = 4;
private const byte PT_MOVETO = 6;

[DllImport( "gdi32.dll ")]
static extern int SetPixel(IntPtr hdc, int X, int Y, int crColor);

GraphicsPath graphicsPath = new GraphicsPath();
private int counter = 0;
private IntPtr graphicsHandle = IntPtr.Zero;
//设计Zswang 2007-04-30 wjhu111#21cn.com 尊重作者,转贴请注明出处

private void button1_Click(object sender, EventArgs e)
{
graphicsPath.ClearMarkers();
graphicsPath.AddRectangle(new Rectangle(10, 10, 100, 100));
timer1.Interval = 100;
timer1.Enabled = true;
}

private void MovingDots(int X, int Y, IntPtr lpData)
{
counter = (counter + 1) % 15;
Color vColor;
if (counter < 5)
vColor = Color.White;
else if (counter < 12)
vColor = Color.Red;
else vColor = Color.Blue;
SetPixel(graphicsHandle, X, Y, vColor.R | vColor.G < < 8 | vColor.B < < 16);
}

private void timer1_Tick(object sender, EventArgs e)
{
graphicsHandle = Graphics.FromHwnd(Handle).GetHdc();
for (int i = 0; i < graphicsPath.PathPoints.Length; i++)
{
if (graphicsPath.PathTypes[i] == (byte)(PT_CLOSEFIGURE | PT_LINETO))
{
for (int j = i; j > = 0; j--)
{
if (graphicsPath.PathTypes[j] == PT_MOVETO)
{
LineDDA(
(int)graphicsPath.PathPoints[i].X,
(int)graphicsPath.PathPoints[i].Y,
(int)graphicsPath.PathPoints[j].X,
(int)graphicsPath.PathPoints[j].Y,
MovingDots, IntPtr.Zero);
break;
}
}
continue;
}
if (i == graphicsPath.PathPoints.Length - 1)
LineDDA(
(int)graphicsPath.PathPoints[i].X,
(int)graphicsPath.PathPoints[i].Y,
(int)graphicsPath.PathPoints[0].X,
(int)graphicsPath.PathPoints[0].Y,
MovingDots, IntPtr.Zero);
else
LineDDA(
(int)graphicsPath.PathPoints[i].X,
(int)graphicsPath.PathPoints[i].Y,
(int)graphicsPath.PathPoints[i + 1].X,
(int)graphicsPath.PathPoints[i + 1].Y,
MovingDots, IntPtr.Zero);
}
}

热点排行