首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 實現類 QQ 屏幕截圖(三):輔助繪圖函數

     編輯:關於C語言

核心輔助方法


// 根據鼠標位置計算並繪製選區矩形
private void DrawRect(Graphics painter, int mouseX, int mouseY)
{
    int width = 0, height = 0;

    // Y 方向
    if (mouseY < Rect.Y)
    {
        Rect.Y = mouseY;
        height = downPoint.Y - mouseY;
    }
    else height = mouseY - downPoint.Y;

    // X 方向
    if (mouseX < Rect.X)
    {
        Rect.X = mouseX;
        width = downPoint.X - mouseX;
    }
    else width = mouseX - downPoint.X;

    Rect.Size = new Size(width, height);
    painter.DrawRectangle(pen, Rect);
}

// 克隆背景並繪製選區,返回新圖像
private Image DrawScreen(Image background, int mouseX, int mouseY)
{
    using (Graphics g = Graphics.FromImage(background))
    {
        DrawRect(g, mouseX, mouseY);
    }
    return background;
}

// 移動選區並刷新顯示
private void MoveRect(Image baseImage, Rectangle rect)
{
    using (Graphics painter = Graphics.FromImage(baseImage))
    {
        painter.DrawRectangle(pen, rect.X, rect.Y, rect.Width, rect.Height);
        DrawRects(painter); // 繪製八個控制點小矩形
    }
    MainPainter.DrawImage(baseImage, 0, 0);
    baseImage.Dispose(); // 注意:此處銷毀傳入圖像,調用者需傳入克隆副本
}

關鍵設計點

  1. 座標標準化:統一處理鼠標位置相對按下點的偏移,保證矩形 Width/Height 為正。
  2. 雙緩衝思路:每次在背景圖副本上繪製,再一次性 DrawImage 到屏幕,避免閃爍。
  3. 資源管理:Graphics.FromImage 產生的對象需 Dispose;傳入的 Image 由調用者負責生命周期(示例中 MoveRect 內部銷毀,調用時傳 (Image)baseImage.Clone())。

完整項目地址

https://www.cnblogs.com/kevin-wu/archive/2006/12/24/601989.html

後續改進方向

  • 將選區邏輯封裝為獨立類,分離 UI 與業務。
  • 使用 ControlPaint.DrawReversibleFrame 實現無需背景圖的 XOR 反色選區,性能更優。
  • 添加放大鏡、像素顏色拾取、多螢幕支持等功能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved