public void Copy() {
var sb = new StringBuilder();
foreach (var row in myDocument) {
bool found = false;
foreach (var cell in row) if (cell.Selected) {
sb.Append(cell.Text).Append(' ');
found = true;
}
if (found) sb.AppendLine();
}
if (sb.Length > 0) {
var data = new DataObject();
data.SetData(sb.ToString()); // 純文字
Clipboard.SetDataObject(data, true); // true = 程式結束後資料保留
}
}
關鍵點:
DataObject 可同時放入多種格式(文字、RTF、圖片),目標應用程式自行挑選可用格式。Clipboard.GetDataObject() 取得 IDataObject,再以 GetFormats() 檢查可用格式,DataFormats 類別預定義常見格式名稱。SystemBrushes:提供 Highlight、Window、ControlText 等預建畫刷。SystemPens:對應畫筆。SystemColors:對應色彩值(Color 結構)。
使用系統色彩可讓應用程式**自動適應使用者的桌面主題**(高對比度、深色模式等),提升一致性體驗。
水中魚因折射位置偏移,伸手抓取需修正軌跡。UI 中捲動導致「文檔視圖座標」與「客戶區座標」產生固定位移 AutoScrollPosition,同樣需修正。
// OnPaint 開頭:整體座標系平移,模擬折射修正
e.Graphics.TranslateTransform(AutoScrollPosition.X, AutoScrollPosition.Y);
// 滑鼠事件中:客戶區座標 → 視圖座標
Point p = new Point(e.X, e.Y);
p.Offset(-AutoScrollPosition.X, -AutoScrollPosition.Y);
核心原則:繪製時將視圖座標轉客戶區;事件處理時將客戶區座標轉視圖座標。雙向一致,折射即被消解。