首页  编辑  

绘制蚂蚁线

Tags: /C#/图形图像/   Date Created:

using System . Runtime . InteropServices;

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;

//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);

   }

}