2016-06-01 125 views
1

我有一個pictureBox1,它在Panel1內部,兩者的大小相同。 pictureBox1在MouseWheel事件上調整大小,當pictureBox1大小大於Panel1大小時,則用戶可以在Mouse_Move事件上平移PictureBox1(想要用鼠標拖動而不是滾動條移動)。我編寫了一個代碼,可以防止用戶跨過Panel1邊框。現在,代碼只能防止左上角和右下角。我的代碼中的問題是當用戶平移到右上角或左下角時,pictureBox1仍然能夠平移。但是,如果一次只平移一側的任一側,則PictureBox1將停留在Panel1內。 我試着編輯我的代碼,但我無法獲得適當的解決方案。如果有人能幫我弄清楚這個問題在我的代碼中會有很大的幫助。PanBox在鼠標移動面板內部

下面的代碼是在pictureBox1_MouseMove事件

左上角 Top Left Corner

右下角 Bottom Right Corner

右上角 Top Right Corner

左下角 Bottom Left Corner

if (pictureBox1.Width > panel1.Width || pictureBox1.Height > panel1.Height) 
{ 
    int count = 0; // Counter to check Top-Left points, if crossed panel's (0,0) points 
        // If count = 1, Set pictureBox point X or Y to 0. 
        // If count = 2, Set both the points of pictureBox to (0,0) 
    int count2 = 0; // Counter to check Bottom-Right points, if crossed Panels negative values calculated by panel1.Width-pictureBox1.Width 
        // If count2 = 1, Set pictureBox point X or Y to minPointX or minPointY . 
        // If count2 = 2, Set both the points of pictureBox to (minPointX, minPointY) 

    int minPointX = panel1.Width - pictureBox1.Width; 
    int minPointY = panel1.Height - pictureBox1.Height; 
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
    // Calculation for Left Top corner. 
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
    if ((e.X - startPoint.X) >= 0 && pictureBox1.Location.X >= 0) 
    { 
     pictureBox1.Location = new Point(0, pictureBox1.Location.Y); 
     count++; 
    } 
    if((e.Y - startPoint.Y) >= 0 && pictureBox1.Location.Y >= 0) 
    { 
     pictureBox1.Location = new Point(pictureBox1.Location.X, 0); 
     count++; 
    } 
    if (count == 1) 
    { 
     if(pictureBox1.Location.X == 0) 
      pictureBox1.Location = new Point(0, pictureBox1.Location.Y + e.Y - startPoint.Y); 
     if(pictureBox1.Location.Y == 0) 
      pictureBox1.Location = new Point(pictureBox1.Location.X + e.X - startPoint.X, 0); 
    } 
    if (count == 2) 
     pictureBox1.Location = new Point(0, 0); 
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
    // Calculation for Bottom Right corner. 
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
    if((e.X - startPoint.X) <= 0 && pictureBox1.Location.X <= minPointX) 
    { 
     pictureBox1.Location = new Point(minPointX, pictureBox1.Location.Y); 
     count2++; 
    } 
    if((e.Y - startPoint.Y) <= 0 && pictureBox1.Location.Y <= minPointY) 
    { 
     pictureBox1.Location = new Point(pictureBox1.Location.X, minPointY); 
     count2++; 
    } 
    if(count2 == 1) 
    { 
     if (pictureBox1.Location.X == minPointX) 
      pictureBox1.Location = new Point(minPointX, pictureBox1.Location.Y + e.Y - startPoint.Y); 
     if (pictureBox1.Location.Y == minPointY) 
      pictureBox1.Location = new Point(pictureBox1.Location.X + e.X - startPoint.X, minPointY); 
    } 
    if (count2 == 2) 
     pictureBox1.Location = new Point(minPointX, minPointY); 
    if (count == 0 && count2 == 0) 
     pictureBox1.Location = new Point(pictureBox1.Location.X + e.X - startPoint.X, pictureBox1.Location.Y + e.Y - startPoint.Y); 
} 

當前的代碼將停止用戶如果用戶嘗試移動圖片框向右,向下至左上角移動PictureBox的超越點(0,0),以及超過點(minPointX,minPointY)如果用戶試圖將pictureBox移向右上方。 minPointXminPointY分別通過減去panel.WidthpictureBox.Widthpanel.HeighpictureBox.Height來計算。 minPointX和minPointY是用戶可以將pictureBox移向負x和y軸的最小點。

+1

如果你只是想允許用戶移動PictureBox的面板內,那麼你爲什麼不設置面板AutoSrcoll財產?它將創建滾動條以允許移動內部控件(平移它)。 – Gusman

+0

我不想使用滾動條。我想在鼠標移動事件上進行平移。 –

+0

您可以更改Horizo​​ntalScroll.Value和VerticalScroll.Value以使用鼠標移動的增量移動內容,這樣您將爲用戶提供兩種平移內容的方法。 – Gusman

回答

3

您可以使用面板autoScroll屬性。確保面板內的pictureBox未固定。然後將面板autoScroll屬性設置爲true

現在當pictureBox變大時,面板會自動顯示滾動條。 現在在鼠標移動事件中設置AutoScrollPosition,如下面的代碼所示。希望能幫助到你。 在下面的代碼中,e是MouseEventArgs

panel1.AutoScrollPosition = new Point(-(panel1.AutoScrollPosition.X + e.X - startPoint.X), 
             -(panel1.AutoScrollPosition.Y + e.Y - startPoint.Y)); 
+0

OP已經明確表示他不需要滾動條。你可以隱藏它們嗎? – TaW

+0

哦。當自動滾動設置爲true時,否不能隱藏滾動條。 –

+0

我敢打賭,你可能會弄清楚一種隱藏滾動條的方法。但即使你可以,我也強烈建議不要這樣做。滾動條都清楚地表明該區域是可移動的,並且爲不能或不想用鼠標平移的用戶提供另一種滾動方式。拖動平移是一個很好的選擇,爲方便起見應該支持,但它不應該是* only *選項。就像觸摸一樣。除非您正在編寫內置觸摸屏的硬件,沒有其他可行的交互方式,否則您應該支持多種範例。滾動條沒有錯。 –

2

這是一個例程,禁止一個控件留在視口內。它假定這兩個方面比視大..

void constrain(Control ctl, Control view) 
{ 
    Rectangle pr = view.ClientRectangle; 
    Rectangle cr = ctl.ClientRectangle; 

    int x = Math.Min(0, Math.Max(ctl.Left, pr.Width - cr.Width)); 
    int y = Math.Min(0, Math.Max(ctl.Top, pr.Height - cr.Height)); 

    ctl.Location = new Point(x,y); 
}