c#繪製橡皮線

來源:互聯網
上載者:User

在我們日常編程中經常會用到“橡皮線”,橡皮線在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了。

歡迎轉載,轉載請註明出處!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.