2014-03-04 166 views
3

在下面的代碼中,我試圖通過鼠標滾輪縮放圖像。但代碼工作不正常,只是刷新了面板,但沒有調整它的大小。實際上,我正在從另一個稱爲解密的類創建的內存流中獲取圖像。完整圖像顯示正常,但我無法使用鼠標滾輪事件執行圖像縮放。 Plz幫助我。使用鼠標滾輪縮放圖像。

private void Form2_Load(object sender, EventArgs e) 
{ 
    this.Width = Screen.PrimaryScreen.WorkingArea.Width; 
    this.Height = Screen.PrimaryScreen.WorkingArea.Height; 
    this.CenterToScreen(); 
    PicturePanel= new PictureBox(); 

    PicturePanel.Dock = DockStyle.Fill; 
    //PicturePanel.SizeMode = PictureBoxSizeMode.AutoSize; 

    //PicturePanel.SizeMode = PictureBoxSizeMode.CenterImage; 
    PicturePanel.Focus(); 
    //PicturePanel.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.OnMouseWheel); 
    this.Controls.Add(PicturePanel); 


    View_codee v = new View_codee(); 

    try 
    { 
     PicturePanel.Image = Image.FromStream(Decrypt.ms1); 
    } 
    catch (Exception ee) 
    { 
     MessageBox.Show(ee.Message); 
    } 
    this.Name = ""; 
} 



protected override void OnMouseWheel(MouseEventArgs mea) 
{ 
    // Override OnMouseWheel event, for zooming in/out with the scroll wheel 
    if (PicturePanel.Image != null) 
    { 
     // If the mouse wheel is moved forward (Zoom in) 
     if (mea.Delta > 0) 
     { 
      // Check if the pictureBox dimensions are in range (15 is the minimum and maximum zoom level) 
      if ((PicturePanel.Width < (15 * this.Width)) && (PicturePanel.Height < (15 * this.Height))) 
      { 
       // Change the size of the picturebox, multiply it by the ZOOMFACTOR 
       PicturePanel.Width = (int)(PicturePanel.Width * 1.25); 
       PicturePanel.Height = (int)(PicturePanel.Height * 1.25); 

       // Formula to move the picturebox, to zoom in the point selected by the mouse cursor 
       PicturePanel.Top = (int)(mea.Y - 1.25 * (mea.Y - PicturePanel.Top)); 
       PicturePanel.Left = (int)(mea.X - 1.25 * (mea.X - PicturePanel.Left)); 
      } 
     } 
     else 
     { 
      // Check if the pictureBox dimensions are in range (15 is the minimum and maximum zoom level) 
      if ((PicturePanel.Width > (this.Width/15)) && (PicturePanel.Height > (this.Height/15))) 
      { 
       // Change the size of the picturebox, divide it by the ZOOMFACTOR 
       PicturePanel.Width = (int)(PicturePanel.Width/1.25); 
       PicturePanel.Height = (int)(PicturePanel.Height/1.25); 

       // Formula to move the picturebox, to zoom in the point selected by the mouse cursor 
       PicturePanel.Top = (int)(mea.Y - 0.80 * (mea.Y - PicturePanel.Top)); 
       PicturePanel.Left = (int)(mea.X - 0.80 * (mea.X - PicturePanel.Left)); 
      } 
     } 
    } 
}  
+0

請不要包含關於問題標題中使用的語言的信息,除非在沒有它的情況下沒有意義。標籤用於此目的。 –

回答

3

Source

通過添加新 ImageProperty這樣你就可以直接設置 Image

更新的代碼;

public class PictureBox : System.Windows.Forms.UserControl 
    { 
     #region Members 

     private System.Windows.Forms.PictureBox PicBox; 
     private Panel OuterPanel; 
     private Container components = null; 
     private string m_sPicName = ""; 

     #endregion 

     #region Constants 

     private double ZOOMFACTOR = 1.25; // = 25% smaller or larger 
     private int MINMAX = 5;    // 5 times bigger or smaller than the ctrl 

     #endregion 

     #region Designer generated code 

     private void InitializeComponent() 
     { 
      this.PicBox = new System.Windows.Forms.PictureBox(); 
      this.OuterPanel = new System.Windows.Forms.Panel(); 
      this.OuterPanel.SuspendLayout(); 
      this.SuspendLayout(); 
      // 
      // PicBox 
      // 
      this.PicBox.Location = new System.Drawing.Point(0, 0); 
      this.PicBox.Name = "PicBox"; 
      this.PicBox.Size = new System.Drawing.Size(150, 140); 
      this.PicBox.TabIndex = 3; 
      this.PicBox.TabStop = false; 
      // 
      // OuterPanel 
      // 
      this.OuterPanel.AutoScroll = true; 
      this.OuterPanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; 
      this.OuterPanel.Controls.Add(this.PicBox); 
      this.OuterPanel.Dock = System.Windows.Forms.DockStyle.Fill; 
      this.OuterPanel.Location = new System.Drawing.Point(0, 0); 
      this.OuterPanel.Name = "OuterPanel"; 
      this.OuterPanel.Size = new System.Drawing.Size(210, 190); 
      this.OuterPanel.TabIndex = 4; 
      // 
      // PictureBox 
      // 
      this.Controls.Add(this.OuterPanel); 
      this.Name = "PictureBox"; 
      this.Size = new System.Drawing.Size(210, 190); 
      this.OuterPanel.ResumeLayout(false); 
      this.ResumeLayout(false); 

     } 
     #endregion 

     #region Constructors 

     public PictureBox() 
     { 
      InitializeComponent(); 
      InitCtrl(); // my special settings for the ctrl 
     } 

     #endregion 

     #region Properties 

     private Image _pictureImage; 
     public Image PictureImage 
     { 
      get { return _pictureImage; } 
      set 
      { 
       if (null != value) 
       { 
        try 
        { 
         PicBox.Image = value; 
         _pictureImage = value; 
        } 
        catch (OutOfMemoryException ex) 
        { 
         RedCross(); 
        } 
       } 
       else 
       { 
        RedCross(); 
       } 
      } 
     } 

     /// <summary> 
     /// Property to select the picture which is displayed in the picturebox. If the 
     /// file doesn´t exist or we receive an exception, the picturebox displays 
     /// a red cross. 
     /// </summary> 
     /// <value>Complete filename of the picture, including path information</value> 
     /// <remarks>Supported fileformat: *.gif, *.tif, *.jpg, *.bmp</remarks> 
     /// 

     [Browsable(false)] 
     public string Picture 
     { 
      get { return m_sPicName; } 
      set 
      { 
       if (null != value) 
       { 
        if (System.IO.File.Exists(value)) 
        { 
         try 
         { 
          PicBox.Image = Image.FromFile(value); 
          m_sPicName = value; 
         } 
         catch (OutOfMemoryException ex) 
         { 
          RedCross(); 
         } 
        } 
        else 
        { 
         RedCross(); 
        } 
       } 
      } 
     } 

     /// <summary> 
     /// Set the frametype of the picturbox 
     /// </summary> 
     [Browsable(false)] 
     public BorderStyle Border 
     { 
      get { return OuterPanel.BorderStyle; } 
      set { OuterPanel.BorderStyle = value; } 
     } 

     #endregion 

     #region Other Methods 

     /// <summary> 
     /// Special settings for the picturebox ctrl 
     /// </summary> 
     private void InitCtrl() 
     { 
      PicBox.SizeMode = PictureBoxSizeMode.StretchImage; 
      PicBox.Location = new Point(0, 0); 
      OuterPanel.Dock = DockStyle.Fill; 
      OuterPanel.Cursor = System.Windows.Forms.Cursors.NoMove2D; 
      OuterPanel.AutoScroll = true; 
      OuterPanel.MouseEnter += new EventHandler(PicBox_MouseEnter); 
      PicBox.MouseEnter += new EventHandler(PicBox_MouseEnter); 
      OuterPanel.MouseWheel += new MouseEventHandler(PicBox_MouseWheel); 
     } 

     /// <summary> 
     /// Create a simple red cross as a bitmap and display it in the picturebox 
     /// </summary> 
     private void RedCross() 
     { 
      Bitmap bmp = new Bitmap(OuterPanel.Width, OuterPanel.Height, System.Drawing.Imaging.PixelFormat.Format16bppRgb555); 
      Graphics gr; 
      gr = Graphics.FromImage(bmp); 
      Pen pencil = new Pen(Color.Red, 5); 
      gr.DrawLine(pencil, 0, 0, OuterPanel.Width, OuterPanel.Height); 
      gr.DrawLine(pencil, 0, OuterPanel.Height, OuterPanel.Width, 0); 
      PicBox.Image = bmp; 
      gr.Dispose(); 
     } 

     #endregion 

     #region Zooming Methods 

     /// <summary> 
     /// Make the PictureBox dimensions larger to effect the Zoom. 
     /// </summary> 
     /// <remarks>Maximum 5 times bigger</remarks> 
     private void ZoomIn() 
     { 
      if ((PicBox.Width < (MINMAX * OuterPanel.Width)) && 
       (PicBox.Height < (MINMAX * OuterPanel.Height))) 
      { 
       PicBox.Width = Convert.ToInt32(PicBox.Width * ZOOMFACTOR); 
       PicBox.Height = Convert.ToInt32(PicBox.Height * ZOOMFACTOR); 
       PicBox.SizeMode = PictureBoxSizeMode.StretchImage; 
      } 
     } 

     /// <summary> 
     /// Make the PictureBox dimensions smaller to effect the Zoom. 
     /// </summary> 
     /// <remarks>Minimum 5 times smaller</remarks> 
     private void ZoomOut() 
     { 
      if ((PicBox.Width > (OuterPanel.Width/MINMAX)) && 
       (PicBox.Height > (OuterPanel.Height/MINMAX))) 
      { 
       PicBox.SizeMode = PictureBoxSizeMode.StretchImage; 
       PicBox.Width = Convert.ToInt32(PicBox.Width/ZOOMFACTOR); 
       PicBox.Height = Convert.ToInt32(PicBox.Height/ZOOMFACTOR); 
      } 
     } 

     #endregion 

     #region Mouse events 

     /// <summary> 
     /// We use the mousewheel to zoom the picture in or out 
     /// </summary> 
     /// <param name="sender"></param> 
     /// <param name="e"></param> 
     private void PicBox_MouseWheel(object sender, MouseEventArgs e) 
     { 
      if (e.Delta < 0) 
      { 
       ZoomIn(); 
      } 
      else 
      { 
       ZoomOut(); 
      } 
     } 

     /// <summary> 
     /// Make sure that the PicBox have the focus, otherwise it doesn´t receive 
     /// mousewheel events !. 
     /// </summary> 
     /// <param name="sender"></param> 
     /// <param name="e"></param> 
     private void PicBox_MouseEnter(object sender, EventArgs e) 
     { 
      if (PicBox.Focused == false) 
      { 
       PicBox.Focus(); 
      } 
     } 

     #endregion 

     #region Disposing 

     /// <summary> 
     /// Die verwendeten Ressourcen bereinigen. 
     /// </summary> 
     protected override void Dispose(bool disposing) 
     { 
      if (disposing) 
      { 
       if (components != null) 
        components.Dispose(); 
      } 
      base.Dispose(disposing); 
     } 

     #endregion 
    } 


private void Form2_Load(object sender, EventArgs e) 
{ 
     pictureBox1.PictureImage = Image.FromStream(Decrypt.ms1); 
} 
+0

我必須用這個替換我的整個代碼。因爲我在同一個班級有保護代碼。我的上面的代碼放在Image_Viewer.cs文件中。所以請打電話給我放置代碼的地方。 –

+0

這是一個自定義控件,用這個替換你的PictureBox。調整圖像大小的所有邏輯都在控件內部。 –

+0

我按照描述實現了這段代碼,但放大時沒有垂直滾動條。水平滾動條出現並工作 - 但沒有垂直滾動條。你能告訴我如何添加垂直滾動條? – JeffR

相關問題