在我們日常編程中經常會用到“橡皮線”,橡皮線在VC裡面實現起來比較容易些。但是在c#中就比較麻煩些。下面是我以前工作中發現的一個開源類,然後加以改造,使用比較方便。現共用CSDN網友!
先給個圖:
繪製代碼:
private void Form1_MouseMove(object sender, MouseEventArgs e)<br /> {<br /> if (A.X != 0)<br /> {<br /> if (drawFlag)<br /> {<br /> drawer.DrawLine(A.X, A.Y, B.X, B.Y);<br /> B.X = e.X;<br /> B.Y = e.Y;<br /> drawer.DrawLine(A.X, A.Y, B.X, B.Y);<br /> }<br /> else<br /> {<br /> B.X = e.X;<br /> B.Y = e.Y;<br /> drawFlag = true;<br /> }<br /> }</p><p> }</p><p> private void Form1_MouseDown(object sender, MouseEventArgs e)<br /> {<br /> A.X = e.X;<br /> A.Y = e.Y;<br /> }
我修改後的開源類:
using System;<br />using System.Collections.Generic;<br />using System.Text;<br />using System.Runtime.InteropServices;</p><p>namespace WindowsApplication1<br />{<br /> /// <summary><br /> /// 封裝互動線效果的類<br /> /// </summary><br /> public class Win32XORPenDrawer : IDisposable<br /> {<br /> #region 聲明Win32 api<br /> struct POINTAPI<br /> {<br /> public int x;<br /> public int y;<br /> } </p><p> [DllImport("user32.dll")]<br /> private static extern IntPtr GetDC(IntPtr hwnd);<br /> [DllImport("user32.dll")]<br /> private static extern IntPtr ReleaseDC(IntPtr hwnd, IntPtr hdc);</p><p> [DllImport("gdi32.dll")]<br /> private static extern bool MoveToEx(IntPtr hDC,<br /> IntPtr x,<br /> IntPtr y,<br /> ref POINTAPI lpPoint);</p><p> [DllImport("gdi32.dll")]<br /> private static extern IntPtr LineTo(IntPtr hdc, IntPtr x, IntPtr y);<br /> [DllImport("gdi32.dll")]<br /> private static extern IntPtr SetROP2(IntPtr hdc, IntPtr fnDrawMode);</p><p> #endregion</p><p> #region 建構函式<br /> /// <summary><br /> /// 傳入建立DC的控制代碼和繪圖模式<br /> /// </summary><br /> /// <param name="hWnd"></param><br /> /// <param name="drawMode"></param><br /> public Win32XORPenDrawer(int hWnd, int drawMode)<br /> {<br /> //GetDC by hwnd<br /> this.hWnd = hWnd;<br /> IntPtr res = GetDC(new IntPtr(hWnd));<br /> hDc = res.ToInt32();<br /> SetROP2(res, new IntPtr(drawMode));<br /> }</p><p> ~Win32XORPenDrawer()<br /> {<br /> Dispose(false);<br /> }</p><p> #endregion</p><p> #region 私人成員<br /> private int hDc;</p><p> private int hWnd; </p><p> private bool disposed = false;</p><p> private void Dispose(bool disposing)<br /> {<br /> if (!this.disposed)<br /> {<br /> //ReleaseDC<br /> ReleaseDC(new IntPtr(hWnd), new IntPtr(hDc));<br /> }<br /> disposed = true;<br /> }<br /> #endregion</p><p> #region 公用介面<br /> #region IDisposable 成員</p><p> public void Dispose()<br /> {<br /> Dispose(true);<br /> }</p><p> #endregion</p><p> /// <summary><br /> /// 從x1, y1向x2, y2畫線<br /> /// </summary><br /> /// <param name="x1"></param><br /> /// <param name="y1"></param><br /> /// <param name="x2"></param><br /> /// <param name="y2"></param><br /> public void DrawLine(int x1, int y1, int x2, int y2)<br /> {<br /> POINTAPI lpOld = new POINTAPI();<br /> MoveToEx(new IntPtr(hDc), new IntPtr(x1), new IntPtr(y1), ref lpOld);<br /> LineTo(new IntPtr(hDc), new IntPtr(x2), new IntPtr(y2));<br /> }</p><p> public void MoveTo(int x, int y)<br /> {<br /> POINTAPI lpOld = new POINTAPI();<br /> MoveToEx(new IntPtr(hDc), new IntPtr(x), new IntPtr(y), ref lpOld);<br /> }</p><p> public void LineTo(int x, int y)<br /> {<br /> LineTo(new IntPtr(hDc), new IntPtr(x), new IntPtr(y));<br /> }<br /> #endregion<br /> }</p><p>}<br />
如果你需要用到這個類。直接複製全部代碼產生一個類就OK了。
歡迎轉載,轉載請註明出處!