public class CReportView : System.Windows.Forms.Form {
// ...
private void InitializeComponent() {
// ...
this.MouseDown += new MouseEventHandler(this.CReportView_MouseDown);
this.Paint += new PaintEventHandler(this.PaintHandler);
// C# 無 OnSetCursor,以 MouseMove 替代
this.MouseMove += new MouseEventHandler(this.CReportView_MouseMove);
}
private void PaintHandler(object sender, PaintEventArgs e) {
Graphics gs = e.Graphics;
// 其他繪圖代碼
myDoc.m_tracker.OnDraw(gs); // 繪製追蹤器(調整手柄、邊框)
}
private void CReportView_MouseDown(object sender, MouseEventArgs e) {
if (e.Button == MouseButtons.Left) {
Rectangle rectSave = new Rectangle();
Point pt = new Point(e.X, e.Y);
myDoc.m_tracker.GetTrueRect(ref rectSave);
if (myDoc.m_tracker.HitTest(pt) < 0) {
// 未點中現有追蹤器 → 啟動橡膠帶選取
CRectTracker tracker = new CRectTracker();
if (tracker.TrackRubberBand(this, pt, myDoc.m_bAllowInvert)) {
tracker.NormalizeRect(ref tracker.m_rect);
if (tracker.m_rect.IntersectsWith(myDoc.m_tracker.m_rect)) {
// 選取區域與現有追蹤器相交 → 切換調整手柄樣式
if ((myDoc.m_tracker.m_nStyle & CRectTracker.StyleFlags.ResizeInside) != 0) {
myDoc.m_tracker.m_nStyle &= ~CRectTracker.StyleFlags.ResizeInside;
myDoc.m_tracker.m_nStyle |= CRectTracker.StyleFlags.ResizeOutside;
} else {
myDoc.m_tracker.m_nStyle &= ~CRectTracker.StyleFlags.ResizeOutside;
myDoc.m_tracker.m_nStyle |= CRectTracker.StyleFlags.ResizeInside;
}
}
}
myDoc.UpdateAllViews(null);
} else {
// 點中現有追蹤器 → 進入標準調整/移動模式
if (myDoc.m_tracker.Track(this, pt, myDoc.m_bAllowInvert, null)) {
myDoc.UpdateAllViews(null);
}
}
}
}
private void CReportView_MouseMove(object sender, MouseEventArgs e) {
Point mousePt = new Point(e.X, e.Y);
if (!myDoc.m_tracker.SetCursor(this, 0, mousePt))
this.Cursor = Cursors.Arrow;
}
}
tracker.OnDraw(Graphics) 繪製八個調整手柄與邊框。HitTest 判斷點擊位置是否落在現有追蹤器區域內。
TrackRubberBand 啟動橡膠帶矩形選取,完成後若與現有追蹤器相交,切換 ResizeInside/Outside 樣式。Track 進入標準拖曳調整/移動模式。SetCursor 根據滑鼠位置自動切換游標(調整手柄方向箭頭),否則恢復預設箭頭。此實作完整移植 MFC CRectTracker 核心交互邏輯至 WinForms,支援橡膠帶選取、調整手柄拖曳、游標自適應。