2014-03-04 4 views
3

아래 코드에서 마우스 휠을 통해 이미지를 확대하려고합니다. 그러나 코드가 제대로 작동하지 않습니다. 패널을 새로 고치기 만하면 크기가 조정되지 않습니다. 사실 저는 복호화 (decrypt)라는 다른 클래스에 의해 생성 된 메모리 스트림에서 이미지를 가져옵니다. 전체 이미지가 제대로 표시되지만 마우스 휠 이벤트를 사용하여 이미지 확대/축소를 수행 할 수 없습니다. 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

전체 코드를이 코드로 교체해야합니까? becoz 같은 클래스에 보호 코드가 있습니다. 그리고 위의 코드는 Image_Viewer.cs 파일에 있습니다. 그래서 plz 전화 코드를 배치 할 수 있습니다. –

+0

이것은 사용자 정의 컨트롤로 PictureBox를이 컨트롤로 바꿉니다. 이미지 크기를 조정하는 모든 논리는 컨트롤 내부에 있습니다. –

+0

설명대로이 코드를 구현했지만 확대 할 때 세로 스크롤 막대가 없습니다. 가로 스크롤 막대가 있으며 작동하지만 세로 스크롤 막대는 없습니다. 세로 스크롤 막대를 추가하는 방법을 알려주시겠습니까? – JeffR