2011-03-22 170 views
0

我有一個圖片框,我使用位圖(在每次繪圖更改後將位圖作爲圖片框圖像加載)上的圖片。現在我有一個「添加註釋」按鈕。此按鈕位於mainForm中的某個位置。我想要它,所以當用戶點擊這個按鈕時,鼠標指針跳轉到圖片框控件並且不移出它,除非用戶點擊了控件內部或按下了Escape鍵。這可能嗎?鎖定鼠標光標只在一個控件中移動

我使用這個代碼的時刻:

private void buttonAddNote_Click(object sender, EventArgs e) 
    { 
     Cursor = Cursors.Cross; 
    } 

或者更好的辦法可能是在這個時候,當用戶點擊添加註釋按鈕,鼠標點擊只圖片框組件內工作(IE用戶無法點擊程序中的其他地方)

+0

這是可能的,但在獲得答案之前,以這種方式限制用戶被認爲是不好的做法和糟糕的設計!我會重新考慮您的實施,除非這是客戶的要求。 – 2011-03-22 23:14:03

+2

在這種情況下,我會要求客戶重新考慮要求;) – Town 2011-03-22 23:15:50

+0

嗯,你沒錯,但用戶點擊時怎麼樣添加一個音符按鈕,鼠標點擊只在picturebox組件內工作(IE用戶無法在程序中的其他地方點擊) – 2011-03-22 23:18:43

回答

7

在用戶界面中的這種形式是一個非常糟糕的主意。但Winforms確實使它成爲可能。您可以使用Cursor.Clip屬性來限制動作。它不能阻止用戶繼續使用鍵盤快捷方式訪問開始菜單,您需要使用Capture屬性來檢測您是否丟失了。

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
     pictureBox1.MouseCaptureChanged += new EventHandler(pictureBox1_MouseCaptureChanged); 
     pictureBox1.MouseDown += new MouseEventHandler(pictureBox1_MouseDown); 
     button1.Click += new EventHandler(button1_Click); 
    } 

    private void button1_Click(object sender, EventArgs e) { 
     var rc = pictureBox1.RectangleToScreen(new Rectangle(Point.Empty, pictureBox1.ClientSize)); 
     Cursor.Position = new Point(rc.Left + rc.Width/2, rc.Top + rc.Height/2); 
     Cursor.Clip = rc; 
     pictureBox1.Capture = true; 
     pictureBox1.Cursor = Cursors.Cross; 
    } 

    void pictureBox1_MouseDown(object sender, MouseEventArgs e) { 
     pictureBox1.Capture = false; 
    } 

    void pictureBox1_MouseCaptureChanged(object sender, EventArgs e) { 
     if (!pictureBox1.Capture) { 
      pictureBox1.Cursor = Cursors.Default; 
      Cursor.Clip = new Rectangle(0, 0, 0, 0); 
     } 
    } 

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { 
     if (keyData == Keys.Escape) pictureBox1.Capture = false; 
     return base.ProcessCmdKey(ref msg, keyData); 
    } 
} 
+0

Grr,忘記了'Capture'屬性。 – ChrisF 2011-03-22 23:38:54

+0

@Hans Passant:我一直在使用這樣的代碼:clipRect = RectangleToScreen(pictureBox1.Bounds); – BillW 2013-05-09 04:55:25

+0

您也可以在窗體或用戶控件加載事件中使用這樣的代碼:clipRect = RectangleToScreen(pictureBox1.Bounds);在屏幕座標中獲取控件的矩形......如果在運行時沒有移動控件。在這種情況下:'clipRect當然會是'矩形類型'的表單作用域變量。謝謝,一如既往,漢斯! – BillW 2013-05-09 05:03:30

0

雖然你對用戶限制是正確的,但是我想出了這個想法。但是,非常感謝您向我展示如何鎖定用戶鼠標! X)

public addNote = false; 

    private void buttonAddNote_Click(object sender, EventArgs e) 
    { 
     if (!addNote) 
      addNote = true; 
     else addNote = false; 
    } 

    private void curveBox_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (addNote) 
     { 
      Cursor = Cursors.Cross; 
     } 
    } 

    private void curveBox_MouseLeave(object sender, EventArgs e) 
    { 
     Cursor = Cursors.Default; 
     addNote = false; 
    }