En el código de abajo estoy tratando de hacer un zoom de la imagen a través de una rueda del ratón. Pero el código no está funcionando adecuadamente, es refrescante el panel, pero no su tamaño. En realidad, yo estoy tomando la imagen de la secuencia de memoria que es creado por otra clase llamada como descifrar. Para completar la Imagen se muestra correctamente, pero no soy capaz de realizar el zoom de la imagen con la rueda del ratón evento.
Que Me ayude 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));
}
}
}
}      
  • Por favor, no incluir información acerca de un lenguaje que se utiliza en la pregunta del título, a menos que no tendría sentido sin ella. Las etiquetas sirven a este propósito.

1 Comentario

  1. 4

    Fuente

    Código actualizado mediante la adición de un nuevo ImageProperty así que usted puede fijar directamente el 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);
    }
    • ¿Tengo que reemplazar toda mi código con este. becoz estoy teniendo el código de protección en la misma clase. Y mi código de arriba se coloca en el Image_Viewer.cs archivo. Así plz mi tel dónde colocar el código.
    • Este es un control personalizado basta con sustituir su PictureBox con este. Toda la lógica del cambio de tamaño de la imagen está dentro del control.
    • He implementado este código como se describe, pero no hay ninguna barra de desplazamiento vertical cuando acercar. La barra de desplazamiento horizontal está presente y funciona, pero no hay barra de desplazamiento vertical. Puede usted decirme cómo agregar la barra de desplazamiento vertical?
    • Se está trabajando, tal vez usted juega con algunos de los de control/propiedades de formulario y ahora está oculto, salí de las propiedades con sus valores predeterminados.

Dejar respuesta

Please enter your comment!
Please enter your name here