日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GDI+桌面画图

發布時間:2024/1/18 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GDI+桌面画图 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

很簡陋的一共桌面畫圖工具。

在桌面畫圖主要需要用到GetDC這個API,該函數檢索一指定窗口的客戶區域或整個屏幕的顯示設備上下文環境的句柄,以后可以在GDI函數中使用該句柄來在設備上下文環境中繪圖。

通過該函數是為了獲取桌面的繪圖圖面。然后用鉤子勾住鼠標全局事件,進行畫線。效果很差,其他Paint消息會將自己畫的線重繪掉。

看了一些方案說是需要創建一共全屏窗體,然后重繪桌面背景到窗體。再窗體下方響應鼠標事件。難度較大,后續會嘗試下。

效果如下:

主要代碼如下:

?

class DeskTopDraw{private static DeskTopDraw dtd = null;private static readonly object locker = new object();public static DeskTopDraw GetInstance(){lock (locker){if (dtd == null)dtd = new DeskTopDraw();}return dtd;}/// <summary>/// 該函數檢索一指定窗口的客戶區域或整個屏幕的顯示設備上下文環境的句柄,/// 以后可以在GDI函數中使用該句柄來在設備上下文環境中繪圖。/// </summary>/// <param name="hWnd"></param>/// <returns></returns>[DllImport("User32.dll")]private extern static IntPtr GetDC(System.IntPtr hWnd);/// <summary>/// 畫筆/// </summary>public Pen p = new Pen(Brushes.Red, 5);Point start = new Point();Point end = new Point();MouseHook mouseHook = new MouseHook();private DeskTopDraw(){ }public bool Init(){//設置筆的屬性,避免出現“毛刺” p.StartCap = LineCap.Round;p.EndCap = LineCap.Round;p.LineJoin = LineJoin.Round; mouseHook.MouseMove += new MouseEventHandler(mouseHook_MouseMove);mouseHook.MouseDown += new MouseEventHandler(mouseHook_MouseDown);mouseHook.MouseUp += new MouseEventHandler(mouseHook_MouseUp);mouseHook.Start();return mouseHook.IsStarted;}public void Uinit(){mouseHook.Stop();}/// <summary>/// 是否開始繪制/// </summary>bool isDraw = false;List<Point> ls = new List<Point>();void mouseHook_MouseDown(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Left){//鼠標左鍵點下 則開始繪制isDraw = true;start = e.Location;//記錄開始位置}}void mouseHook_MouseMove(object sender, MouseEventArgs e){if (isDraw){end = e.Location;//記錄結束位置IntPtr DesktopHandle = GetDC(IntPtr.Zero);//獲取桌面上下文句柄Graphics g = System.Drawing.Graphics.FromHdc(DesktopHandle);//創建畫板g.SmoothingMode = SmoothingMode.AntiAlias;g.DrawLine(p, start, end);//畫線start = end;//將結束位置再次作為開始位置g.ReleaseHdc(DesktopHandle);//釋放上下文g.Dispose();}}void mouseHook_MouseUp(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Left){isDraw = false;}}}

?

窗體代碼如下:

public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){DeskTopDraw dt = DeskTopDraw.GetInstance();if (!dt.Init())MessageBox.Show("初始化失敗");}private void Form1_FormClosed(object sender, FormClosedEventArgs e){//不釋放也可以,其內部綁定了Application_ApplicationExit事件DeskTopDraw dt = DeskTopDraw.GetInstance();dt.Uinit();}private void button2_Click(object sender, EventArgs e){DeskTopDraw dt = DeskTopDraw.GetInstance();dt.Uinit();} }

鉤子類請參考


http://blog.csdn.net/q317379184/article/details/47979309?

?


?

總結

以上是生活随笔為你收集整理的GDI+桌面画图的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。