公司環境限制安裝軟體,需自製截圖工具。參考 QQ 截圖流程:全螢幕截圖做背景 → 繪製可拖曳、可縮放選區矩形 → 雙擊/Enter 完成截取 → 存入剪貼簿/檔案。
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 導致除零或游標錯亂 |
MyRectangle 完整方法實作 (繪製、縮放、移動、滑鼠判斷)。ScreenBody 事件處理、熱鍵註冊、系統匣、單一實例、資源部署、完整整合。確立「全螢幕背景 + 反轉繪製選區 + 8 控制點互動」架構,核心幾何邏輯封裝於 MyRectangle,表單層極薄,易維護、易擴展。