2015-04-23 34 views
1

我的窗體中有一個PictureBox控件,其中有一個可移動的矩形在其中繪製,當圖片框大小大於特定大小滾動條時,我的圖片框大小將根據矩形的位置增加。如何滾動增加在Windows窗體c#中的圖片大小?

public void PicBox_MouseDown(object sender, MouseEventArgs e) 
{ 

     if (rect.Contains(new Point(e.X, e.Y))) 
     { 
      mMove = true; 
     } 

     oldX = e.X; 
     oldY = e.Y; 
} 

public void Picbox_MouseUp(object sender , MouseEventArgs e) 
{ 
     mMove = false; 
} 

public void Picbox_MouseMove(object sender,MouseEventArgs e) 
{ 
     if (mMove) 
     { 
      picBox.Cursor = Cursors.Cross; 
      rect.X = rect.X + e.X - oldX; 
      rect.Y = rect.Y + e.Y - oldY; 
     } 
     oldX = e.X; 
     oldY = e.Y; 
     picBox.Invalidate(); 
} 

public void Picbox_MousePaint(object sender, PaintEventArgs e) 
{ 
     picBox.Invalidate(); 
     picBox.Size = new Size((rect.Width + rect.X) + 10, (rect.Height + rect.Y) + 10); 
     Draw(e.Graphics); 
} 

enter image description here

論形式的第一顯示用的PictureBox

enter image description here enter image description here

拖動矩形在PictureBox增加並且滾動條的大小後,會出現

一切正常這裏罰款,但我的問題ems無論pictureBox的大小是多少,滾動條都可以正常工作,但是當拖動矩形時,如果pictureBox的邊緣滿足形式,則整個滾動條被重置爲正常,通過望着下面你的照片就能明白我想說

enter image description here

enter image description here

enter image description here

如何解決這個問題,有另一種方式根據增加滾動pictureBox的寬度?我是新來的。

該矩形的作用就好像X座標和Y座標相對於winform而不是pictureBox被跟蹤。

我可以製作pictureBox作爲我的繪圖的父項嗎?

+0

不知道你想要什麼,但通常的方式獲得滾動PB是把圖片框與AutoCcroll在面板內部= Panel爲真,PictureBox爲false。 – TaW

+0

當我垂直拖動矩形時,圖片框的高度會增加,並且我將矩形的位置和高度分配給圖片框的大小,例如picturebox.Size = Rectangle.Height + Rectangle.Y,所以當圖片的高度增加時將它拖下來並滾動條顯示,但當我拖動它時,如上圖所示,當圖片框位於窗體邊緣上方時,滾動條消失。 – VINNUSAURUS

+0

這就是你所擁有的,如果是的話,那麼問題是什麼或者你想要什麼? - 另外:什麼是'Picbox_MousePaint'和'Draw'?拖動代碼在哪裏? – TaW

回答

0

恐怕這是不可能的。

Winforms Scrollbars只會帶回的東西回到他們的容器溢出。如果它們「下溢」,即如果它們的Top和/或Left值變爲負數,則不顯示ScrollBars,即使它們(由於額外溢出)也不會使它們返回。

最小滾動位置是zero

所以你將不得不確保不把東西移到負面!

您可以通過添加虛擬控件來強制執行ScrollBars,但這隻允許您完全滾動PictureBox,或者將其忽略不計!

如果你真的真的真的真的真的真的想你可以檢測到的情況和手動添加ScrollBar控件和代碼它們移動PictureBox回落/右..

既然你問,這裏有一個例子和玩。請注意,使用coded ScrollBars有許多缺陷。

  • 其中之一是如何處理真實ScrollBar顯示的情況?在這個例子中,我解決了這個問題,不是將ScrollBar添加到面板上,而是通過疊加它;因此真正的ScrollBar在編碼顯示時隱藏。
  • 另一個問題是數字:內容應該移動多少像素?我不讓這些用途滾動到任何地方,但是當發生這種情況時,我一直將PictureBox移動回去,並且編碼的ScrollBar消失。
  • 作爲警告的最後一點,應該注意,代碼ScrollBar可以讓你對你有的控制做些事情;但它不會讓你實際滾動到負面境界!,我猜你是真正喜歡的。但我認爲這是不可能的!

所以,我建議你不要使用下面的代碼,除非你簡單地把PictureBox.Top帶回零!

// a variable at class level: 
VScrollBar vScroll = null; 

// move into negative for testing: 
pictureBox1.Top = -15; 
// now check to see if we need a VScrollBar 
scrollCheck(); 

void scrollCheck() 
{ 
    if (pictureBox1.Top < 0) 
    { 
     if (vScroll == null) 
     { vScroll = new VScrollBar(); vScroll.Parent = panel1.Parent; 
     vScroll.Scroll += vScroll_Scroll; vScroll.BringToFront(); 
     } 
     vScroll.Location = new Point(panel1.Right - vScroll.Width - 2, panel1.Top + 1); 
     vScroll.Height = panel1.ClientSize.Height - 2; 
     vScroll.Value = vScroll.Maximum; 
     vScroll.Show(); 
     } 
    else 
    { vScroll.Hide(); } 
} 

void vScroll_Scroll(object sender, ScrollEventArgs e) 
{ 
    int delta = e.NewValue - e.OldValue; 
    if (delta < 0) 
    { 
     pictureBox1.Top = 0; 
     scrollCheck(); 
    } 
} 

所有的一切我真的相信,避免局勢將是最..

+0

你可以給我鏈接學習使用滾動條和如何操縱滾動條根據另一個控制(教程)? – VINNUSAURUS

+0

我編寫了一個例子,但我懷疑使用它將是一個好主意..負左和上區域的控件將永遠不會顯示,無論您如何做,除非將其移回! – TaW