程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#完成屬於本身的QQ截圖對象

C#完成屬於本身的QQ截圖對象

編輯:C#入門知識

C#完成屬於本身的QQ截圖對象。本站提示廣大學習愛好者:(C#完成屬於本身的QQ截圖對象)文章只能為提供參考,不一定能成為您想要的結果。以下是C#完成屬於本身的QQ截圖對象正文


上面就詳細引見下完成截圖對象的完成思緒。

為了讓年夜家更清晰地曉得若何去完成本身的截圖對象,起首我來描寫下截圖的一個進程——我們應用QQ的截圖對象和Windows 自帶的截圖對象都可以發明,當我們點擊QQ窗體中的截圖按鈕時,此時我們將看到一個全屏圖片,然後我們可以在其上截圖,當鼠標左鍵按下時,即代表開端截圖,並我們可以挪動鼠標來轉變截圖的年夜小,鼠標彈起時即代表停止截圖,此時我們可以雙擊矩形區域完整截圖,而且可以經由過程粘貼操作把截取的圖片粘貼到聊天窗口的發送區,鼠標右鍵點擊則是加入截圖。如許我們截圖的進程描寫就是如許的,從這個描寫中我們便可以籠統出完成我們截圖對象的思緒來:

從 “此時我們將看到一個全屏圖片”這句話描寫我們應當籠統為——關於QQ截圖對象的完成來講,我們看到的這個全屏圖片其實其實不是一張“圖片”(這裡最好不要鑽空子),而是一個窗體,這個窗體我們定名為 “截圖窗體”,只是把窗體的配景圖片設置為全屏圖片。說到這裡,一些沒有研討過QQ截圖對象的人開端有疑問了——我們看到的是窗體?那為何邊框的,即沒有最年夜化按鈕,最下化按鈕的呢?(關於這點的說明就是,法式中可以設置Form的BorderStyle屬性為none的方法來隱蔽失落邊框)。
既然要設置窗體的配景圖片為全屏圖片,我們曉得設置配景圖片只須要設置窗體的BackgroundImage屬性就行了,然則全屏圖片怎樣獲得呢?既然是全屏圖片,天然我就應當使窗體最年夜化話了,否則我們看到只是一個沒有邊框的“小圖片”了,而不是一個全屏的圖片。上面是詳細完成這個剖析的代碼:           

// 經由過程Graphics的CopyFromScreen辦法把全屏圖片的拷貝到我們界說好的一個和屏幕年夜小雷同的空白圖片中,
   // 拷貝完成以後,CatchBmp就是全屏圖片的拷貝了,然後指定為截圖窗體配景圖片就行了。
   // 新建一個和屏幕年夜小雷同的圖片
   Bitmap CatchBmp = new Bitmap(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height);
   
   // 創立一個畫板,讓我們可以在畫板上繪圖
   // 這個畫板也就是和屏幕年夜小一樣年夜的圖片
   // 我們可以經由過程Graphics這個類在這個空白圖片上繪圖
   Graphics g = Graphics.FromImage(CatchBmp);

   // 把屏幕圖片拷貝到我們創立的空白圖片 CatchBmp中
   g.CopyFromScreen(new Point(0, 0), new Point(0, 0), new Size(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height));

   // 創立截圖窗體
   cutter = new Cutter();

   // 指導窗體的配景圖片為屏幕圖片
   cutter.BackgroundImage = CatchBmp;

  3. 從 “然後我們可以在其上截圖”這句話中我們籠統為——其實我們截圖操作,從法式角度來講就是我們在這個最年夜化的窗體中繪圖,能夠這個對一些不懂得GDI+繪圖的同伙有些難懂得,這裡做個比方——我們會拿筆在紙上繪圖,我們可以用比劃三角形,矩形曾經各類圖形,此時紙就是我們一個畫板,筆是用來繪圖圖形的,同時筆也是有色彩和粗細的,我們可以用白色水筆劃,畫出來的圖就是白色的了,也能夠用黑色水筆劃,天然畫出來的就是黑色的了,異樣,在GDI+也就是Graphics Device Interface Plus也就是圖形裝備接口,在.NET 中也供給了一些如許的類來讓我們完成對圖象的拜訪,也就是我們可使用.NET中供給的類來停止 “畫畫”,要畫畫固然必需要有畫板吧(我們開端比方中紙就是畫板),在.NET 類中Graphics類就是對畫板的籠統,畫板可以由三種方法創立:(1)從圖片或繼續自圖象對象中創立;(2)從窗體或控件的Paint事宜中創立;(3)應用窗體或控件的CreateGraphics辦法創立。有了畫板以後,固然就須要筆來畫畫了,在.NET 中Pen類就是起到筆的感化,在結構函數中可以指定筆的色彩和粗細,有了筆以後就是開端繪圖了,在.NET中也異樣供給了一些辦法來完成繪圖,如DrawRectangle辦法——畫矩形

  4. 從 “當鼠標左鍵按下時,即代表開端截圖,並我們可以挪動鼠標來轉變截圖的年夜小,鼠標彈起時即代表停止截圖,此時我們可以雙擊矩形區域完整截圖,而且可以經由過程粘貼操作把截取的圖片粘貼到聊天窗口的發送區,鼠標右鍵點擊則是加入截圖”這些描寫中可以籠統為——鼠標的挪動,按下,彈起等操作,在法式角度來講,也就是完成截圖窗體的MouseMove事宜(對應於鼠標挪動),MouseDown事宜(對應於鼠標左鍵按下),MouseClick事宜(對應於鼠標右鍵停止截圖)、MouseUp(對應於鼠標彈起停止截圖)和MouseDoubleClick(鼠標雙擊矩形區域完整截圖,並可以經由過程粘貼操作把截取的圖片粘貼到聊天窗口的發送區,既然可以停止粘貼操作來取得截取圖片,所以必需在該事宜中對剪切板設置截圖圖片),3和4的剖析進程也是截圖功效的焦點完成,對應於上面的代碼(代碼中有具體說明,而且年夜家懂得的時刻可以聯合3和4的剖析):

 /// <summary>
  /// 鼠標右鍵點擊停止截圖
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void Cutter_MouseClick(object sender, MouseEventArgs e)
  {
   if (e.Button == MouseButtons.Right)
   {
    this.DialogResult = DialogResult.OK;
    this.Close();
   }
  }

  /// <summary>
  /// 鼠標按下事宜處置法式
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void Cutter_MouseDown(object sender, MouseEventArgs e)
  {
   // 鼠標左鍵按下是開端繪圖,也就是截圖
   if (e.Button == MouseButtons.Left)
   {
    // 假如捕獲沒有開端
    if (!CatchStart)
    {    
     CatchStart = true;
     // 保留此時鼠標按下坐標
     DownPoint = new Point(e.X, e.Y);
    }
   }
  }

  /// <summary>
  /// 鼠標挪動事宜處置法式,即用戶轉變截圖年夜小的處置
  /// 這個辦法是截圖功效的焦點辦法,也就是繪制截圖
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void Cutter_MouseMove(object sender, MouseEventArgs e)
  {
   // 確保截圖開端
   if (CatchStart)
   {
    // 新建一個圖片對象,讓它與屏幕圖片雷同
    Bitmap copyBmp = (Bitmap)originBmp.Clone();

    // 獲得鼠標按下的坐標
    Point newPoint = new Point(DownPoint.X, DownPoint.Y);

    // 新建畫板和畫筆
    Graphics g = Graphics.FromImage(copyBmp);
    Pen p = new Pen(Color.Red, 1);

    // 獲得矩形的長寬
    int width = Math.Abs(e.X - DownPoint.X);
    int height = Math.Abs(e.Y-DownPoint.Y);
    if (e.X < DownPoint.X)
    {
     newPoint.X = e.X;
    }
    if (e.Y < DownPoint.Y)
    {
     newPoint.Y = e.Y;
    }

    CatchRectangle = new Rectangle(newPoint, new Size(width,height));
    
    // 將矩形畫在畫板上
    g.DrawRectangle(p, CatchRectangle);

    // 釋放今朝的畫板
    g.Dispose();
    p.Dispose();
    // 從以後窗體創立新的畫板
    Graphics g1 = this.CreateGraphics();
    
    // 將適才所畫的圖片畫到截圖窗體上
    // 為何不直接在以後窗體繪圖呢?
    // 假如本身處理將矩形畫在窗體上,會形成圖片發抖而且有沒有數個矩形
    // 如許完成也屬於二次緩沖技巧
    g1.DrawImage(copyBmp, new Point(0, 0));
    g1.Dispose();
    // 釋放拷貝圖片,避免內存被年夜量消費
    copyBmp.Dispose();
   }
  }

  /// <summary>
  /// 鼠標左鍵彈起事宜
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void Cutter_MouseUp(object sender, MouseEventArgs e)
  {
   if (e.Button == MouseButtons.Left)
   {
    // 假如截圖曾經開端,鼠標左鍵彈起設置截圖完成
    if (CatchStart)
    {
     CatchStart = false;
     CatchFinished = true;
    }
   }
  }

  /// <summary>
  /// 鼠標雙擊事宜,假如鼠標位於矩形內,則將矩形內的圖片保留到剪切板中
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void Cutter_MouseDoubleClick(object sender, MouseEventArgs e)
  {
   if (e.Button == MouseButtons.Left && CatchFinished)
   {
    // 新建一個與矩形一樣年夜小的空白圖片
    Bitmap CatchedBmp = new Bitmap(CatchRectangle.Width, CatchRectangle.Height);

    Graphics g = Graphics.FromImage(CatchedBmp);

    // 把originBmp中指定部門依照指定年夜小畫到空白圖片上
    // CatchRectangle指定originBmp中指定部門
    // 第二個參數指定繪制到空白圖片的地位和年夜小
    // 畫完後CatchedBmp不再是空白圖片了,而是具有與截取的圖片一樣的內容
    g.DrawImage(originBmp, new Rectangle(0, 0, CatchRectangle.Width, CatchRectangle.Height), CatchRectangle, GraphicsUnit.Pixel);

    // 將圖片保留到剪切板中
    Clipboard.SetImage(CatchedBmp);
    g.Dispose();
    CatchFinished = false;
    this.BackgroundImage = originBmp;
    CatchedBmp.Dispose();
    this.DialogResult = DialogResult.OK;
    this.Close();
   }
  }

  5 到第4點為止,截圖的功效曾經剖析完了,以後就是當我們應用QQ截圖的時刻,我們除可以點擊聊天窗口中的截圖按鈕來停止截圖外,還可以經由過程按下Alt+Ctrl+A來停止截圖,要完成這個功效的思緒也很簡略——即當聊天窗體加載的時刻對熱鍵(法式中我界說的熱鍵是“Alt+Ctrl+C”)停止注冊(此時挪用了Win32中RegisterHotKey辦法來完成熱鍵的注冊),當聊天窗體封閉時停止對熱鍵的卸載,避免對熱鍵停止屢次注冊,此時挪用Win32中的UnregisterHotKey辦法來完成,詳細的完成代碼為:

 /// <summary>
  /// 窗體加載事宜處置
  /// 在窗體加載時注冊熱鍵
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void 聊天窗體_Load(object sender, EventArgs e)
  {
   uint ctrlHotKey = (uint)(KeyModifiers.Alt|KeyModifiers.Ctrl);
   // 注冊熱鍵為Alt+Ctrl+C, "100"為獨一標識熱鍵
   HotKey.RegisterHotKey(Handle, 100, ctrlHotKey, Keys.C);
  }

  /// <summary>
  /// 窗體封閉時處置法式
  /// 窗體封閉時撤消熱鍵注冊
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void 聊天窗體_FormClosing(object sender, FormClosingEventArgs e)
  {
   // 卸載熱鍵
   HotKey.UnregisterHotKey(Handle, 100);
  }

  #endregion

  // 熱鍵按下履行的辦法
  private void GlobalKeyProcess()
  {
   this.WindowState = FormWindowState.Minimized;
   // 窗口最小化也須要必定時光
   Thread.Sleep(200);
   btnCutter.PerformClick();
  }

  /// <summary>
  /// 重寫WndProc()辦法,經由過程監督體系新聞,來挪用進程
  /// 監督Windows新聞
  /// </summary>
  /// <param name="m"></param>
  protected override void WndProc(ref Message m)
  {
   //假如m.Msg的值為0x0312那末表現用戶按下了熱鍵
   const int WM_HOTKEY = 0x0312;
   switch (m.Msg)
   {
    case WM_HOTKEY:
     if (m.WParam.ToString() == "100")
     {
      GlobalKeyProcess();
     }

     break;
   }

   // 將體系新聞傳遞自父類的WndProc
   base.WndProc(ref m); 
  }

完成後果
下面曾經引見了完成QQ截圖的一個思緒的,同伙們是否是迫在眉睫想看看該法式的一個後果了?上面就經由過程一個動畫來讓年夜家更抽象地看到法式的運轉後果的:

QQ截圖對象下載:http://xiazai.jb51.net/201603/yuanma/QQjietutools(jb51.net).rar

總結
到這裡QQ截圖的引見部門就到這裡了,本對象的完成自以為講授的異常淺顯易懂的,願望年夜家可以如許認為而且可以更清楚地明確QQ截圖的完成思緒。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved