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

C# 實作 CRectTracker 橡膠帶矩形選取框(二):View 類整合與滑鼠事件處理

     編輯:關於C語言

View 類完整整合代碼


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;
  }
}

關鍵邏輯解析

  1. Paint 事件: 呼叫 tracker.OnDraw(Graphics) 繪製八個調整手柄與邊框。
  2. MouseDown 判斷: HitTest 判斷點擊位置是否落在現有追蹤器區域內。
    • 落在外部 → TrackRubberBand 啟動橡膠帶矩形選取,完成後若與現有追蹤器相交,切換 ResizeInside/Outside 樣式。
    • 落在內部 → Track 進入標準拖曳調整/移動模式。
  3. MouseMove: 呼叫 SetCursor 根據滑鼠位置自動切換游標(調整手柄方向箭頭),否則恢復預設箭頭。

此實作完整移植 MFC CRectTracker 核心交互邏輯至 WinForms,支援橡膠帶選取、調整手柄拖曳、游標自適應。

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