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

C# 實作類 QQ 截圖工具 (1/3):需求分析、架構設計、MyRectangle 類別定義

     編輯:關於C#

專案背景

公司環境限制安裝軟體,需自製截圖工具。參考 QQ 截圖流程:全螢幕截圖做背景 → 繪製可拖曳、可縮放選區矩形 → 雙擊/Enter 完成截取 → 存入剪貼簿/檔案。

整體架構

  1. Program.cs:單一實例檢查、啟動主視窗。
  2. MainForm:隱藏於系統匣、註冊全域熱鍵 (Ctrl+Alt+A)、熱鍵觸發截圖流程。
  3. ScreenBody:全螢幕無邊框視窗 (TopMost)、背景為全螢幕截圖、處理滑鼠事件驅動 MyRectangle。
  4. MyRectangle:核心幾何與互動邏輯 (見第 2 部分)。
  5. SetHotKeyForm:熱鍵自訂視窗,儲存至 `Settings.Default`。

MyRectangle 類別完整定義 (屬性與建構子)


public class MyRectangle
{
    // 座標與尺寸
    private int _x, _y, _width, _height;
    private int _downX, _downY;
    private int _minW = 5, _minH = 5;

    // 狀態旗標
    private bool _moveMode, _sizeMode;
    private bool _onLT, _onLM, _onLB, _onRT, _onRM, _onRB, _onTM, _onBM, _onCenter;

    // 控制點尺寸
    private int _handleSize = 4;

    // 8 個控制點矩形
    private Rectangle _lt, _lm, _lb, _rt, _rm, _rb, _tm, _bm;

    // 主矩形
    private Rectangle _rect;

    // 背景圖與游標
    private Image _backImage;
    private Cursor _cursor = Cursors.Cross;

    // 建構子
    public MyRectangle()
    {
        _rect = new Rectangle();
        _lt = _lm = _lb = _rt = _rm = _rb = _tm = _bm = new Rectangle();
        _cursor = new Cursor(@"..\..\Cursors\hcross.cur");
    }

    // --- 公開屬性 (省略 getter/setter 細節) ---
    public int X { get => _x; set { _x = value; _rect.X = value; } }
    public int Y { get => _y; set { _y = value; _rect.Y = value; } }
    public int Width { get => _width; set { _width = value; _rect.Width = value; } }
    public int Height { get => _height; set { _height = value; _rect.Height = value; } }
    public int DownPointX { get => _downX; set => _downX = value; }
    public int DownPointY { get => _downY; set => _downY = value; }
    public int MinWidth { get => _minW; set => _minW = value; }
    public int MinHeight { get => _minH; set => _minH = value; }
    public bool MoveMode { get => _moveMode; set { _moveMode = value; _sizeMode = !value; } }
    public bool SizeMode { get => _sizeMode; set { _sizeMode = value; _moveMode = !value; } }
    // ... 8 個 OnXxx 旗標屬性 (互斥邏輯) ...
    public int HandleSize { get => _handleSize; set => _handleSize = value; }
    public Rectangle LeftTopRect => _lt;  // 其餘 7 個同理
    public Rectangle Rect => _rect;
    public Size Size => _rect.Size;
    public Image BackImage { get => _backImage; set => _backImage = value; }
    public Cursor CurrentCursor { get => _cursor; set => _cursor = value; }
    // ... 方法成員見第 2 部分 ...
}

關鍵設計決策

決策點選擇理由
繪製方式ControlPaint.DrawReversibleFrame無需 Graphics 物件、自動反色、無殘影、跨視窗可見
游標來源系統游標檔 (.cur)原生外觀、無需自繪、支援動畫游標
座標系統螢幕絕對座標全螢幕視窗與 ControlPaint 皆使用螢幕座標,免轉換
最小尺寸5x5 像素避免選區縮放至 0 導致除零或游標錯亂

後續內容預告

  • 第 2 部分:MyRectangle 完整方法實作 (繪製、縮放、移動、滑鼠判斷)。
  • 第 3 部分:ScreenBody 事件處理、熱鍵註冊、系統匣、單一實例、資源部署、完整整合。

小結

確立「全螢幕背景 + 反轉繪製選區 + 8 控制點互動」架構,核心幾何邏輯封裝於 MyRectangle,表單層極薄,易維護、易擴展。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved