我有一個pictureBox1,它在Panel1內部,兩者的大小相同。 pictureBox1在MouseWheel事件上調整大小,當pictureBox1大小大於Panel1大小時,則用戶可以在Mouse_Move事件上平移PictureBox1(想要用鼠標拖動而不是滾動條移動)。我編寫了一個代碼,可以防止用戶跨過Panel1邊框。現在,代碼只能防止左上角和右下角。我的代碼中的問題是當用戶平移到右上角或左下角時,pictureBox1仍然能夠平移。但是,如果一次只平移一側的任一側,則PictureBox1將停留在Panel1內。 我試着編輯我的代碼,但我無法獲得適當的解決方案。如果有人能幫我弄清楚這個問題在我的代碼中會有很大的幫助。PanBox在鼠標移動面板內部
下面的代碼是在pictureBox1_MouseMove
事件
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移向右上方。 minPointX
和minPointY
分別通過減去panel.Width
到pictureBox.Width
和panel.Heigh
到pictureBox.Height
來計算。 minPointX和minPointY是用戶可以將pictureBox移向負x和y軸的最小點。
如果你只是想允許用戶移動PictureBox的面板內,那麼你爲什麼不設置面板AutoSrcoll財產?它將創建滾動條以允許移動內部控件(平移它)。 – Gusman
我不想使用滾動條。我想在鼠標移動事件上進行平移。 –
您可以更改HorizontalScroll.Value和VerticalScroll.Value以使用鼠標移動的增量移動內容,這樣您將爲用戶提供兩種平移內容的方法。 – Gusman