Центрирование и прокрутка PictureBox в WinForms - PullRequest
3 голосов
/ 17 октября 2011

Я разрабатываю приложение WinForms и не могу понять, как решить проблему. Мне нужно показать изображение в форме. Поскольку изображение может быть произвольно большим, мне нужны полосы прокрутки в графическом окне, содержащем изображение, чтобы пользователь мог видеть его полностью. Поглядывая в глаза, я обнаружил, что лучший способ добиться этого - добавить PictureBox в качестве дочернего элемента управления панели, а также сделать панель автоматически изменяемой и автоматически прокручиваемой. Я сделал это программно, поскольку, используя конструктор, я не смог вставить изображение в качестве дочернего элемента управления панели. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что я не могу отцентрировать и прокрутить в окне изображения одновременно. Если я поставлю привязку в окне рисунка сверху, слева, снизу и справа, полосы прокрутки не будут отображаться, а отображаемое изображение будет странным, если я верну привязку только в верхний левый угол, изображение не будет отцентрировано.

Есть ли способ сделать оба одновременно? Вот код для моей панели и Picturebox:

this.panelCapturedImage = new System.Windows.Forms.Panel();
this.panelCapturedImage.SuspendLayout();
this.panelCapturedImage.AutoScroll = true;
this.panelCapturedImage.AutoSize = true;
this.panelCapturedImage.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.panelCapturedImage.Controls.Add(this.pictureBoxCapturedImage);
this.panelCapturedImage.Location = new System.Drawing.Point(0, 49);
this.panelCapturedImage.Name = "panelCapturedImage";
this.panelCapturedImage.Size = new System.Drawing.Size(3, 3);
this.panelCapturedImage.TabIndex = 4;

this.pictureBoxCapturedImage.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.pictureBoxCapturedImage.Location = new System.Drawing.Point(0, 0);
this.pictureBoxCapturedImage.Name = "pictureBoxCapturedImage";
this.pictureBoxCapturedImage.Size = new System.Drawing.Size(0, 0);
this.pictureBoxCapturedImage.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.pictureBoxCapturedImage.TabIndex = 0;
this.pictureBoxCapturedImage.TabStop = false;

this.panelCapturedImage.Controls.Add(this.pictureBoxCapturedImage);

И вот где я установил изображение:

public Image CapturedImage
{
    set 
    { 
        pictureBoxCapturedImage.Image = value;
        pictureBoxCapturedImage.Size = value.Size;
    }
}

Ответы [ 3 ]

4 голосов
/ 18 октября 2011

Для PictureBox установите SizeMode = AutoSize, Anchor it Top, Left и установите его Location на 0, 0.

Установите Panel.AutSize на False и Panel.AutoScroll до True.

Когда вы установите свойство PictureBox.Image, оно автоматически изменит размер изображения.Затем вы можете использовать этот размер для установки свойства панели AutoScrollPosition :

public Image CapturedImage
{
    set 
    { 
        pictureBoxCapturedImage.Image = value;
        panelCapturedImage.AutoScrollPosition = 
            new Point { 
                X = (pictureBoxCapturedImage.Width - panelCapturedImage.Width) / 2, 
                Y = (pictureBoxCapturedImage.Height - panelCapturedImage.Height) / 2 
            };
    }
}

Если изображение меньше, чем размер панели, оно останется в левом верхнем углу.Если вы хотите, чтобы он находился по центру панели, вам нужно добавить логику, чтобы соответствующим образом установить Location.

1 голос
/ 24 января 2012

На основании предыдущих ответов я смог создать полный пример:

private void testShowPictureBox()
    {
        /* format form */
        Form frmShowPic = new Form();
        frmShowPic.Width = 234;
        frmShowPic.Height = 332;
        frmShowPic.MinimizeBox = false;
        frmShowPic.MaximizeBox = false;
        frmShowPic.ShowIcon = false;
        frmShowPic.StartPosition = FormStartPosition.CenterScreen;

        frmShowPic.Text = "Show Picture";

        /* add panel */
        Panel panPic = new Panel();
        panPic.AutoSize = false;
        panPic.AutoScroll = true;
        panPic.Dock = DockStyle.Fill;

        /* add picture box */
        PictureBox pbPic = new PictureBox();
        pbPic.SizeMode = PictureBoxSizeMode.AutoSize;
        pbPic.Location = new Point(0, 0);

        panPic.Controls.Add(pbPic);
        frmShowPic.Controls.Add(panPic);

        /* define image */
        pbPic.ImageLocation = @"c:\temp\pic.png";

        frmShowPic.ShowDialog();
   }
0 голосов
/ 17 октября 2011

Picturebox должен быть установлен на автоматический размер.закрепленный в центре (или на границе).

Вы можете управлять всем этим в конструкторе, не решая при этом своих проблем.

Для панели должна быть установлена ​​автопрокрутка на значение true.

...