2012-02-21 10 views
7

Sto progettando un semplice visualizzatore di immagini con la possibilità di eseguire alcune elaborazioni di base dell'immagine. Al momento ho il problema di mantenere il PictureBox centrato all'interno di un TabPage tutto il tempo oltre a mantenere la dimensione e la dimensione della picture box uguale a quella mostrata dall'immagine. Finora non ho avuto successo.Mantenere un PictureBox centrato all'interno di un contenitore

Ho il seguente codice che chiamo nel costruttore di moduli per posizionarlo al centro. funziona la prima volta a centrare l'picturebox:

private void SetPictureBoxOriginalSizeAndLocation(bool makeImageNull = false, DockStyle dockStyle = DockStyle.None) 
{ 
    if (makeImageNull) picBoxView.Image = null; 
    picBoxView.Dock = dockStyle; 

    var xPoint = tabImageView.Location.X + ((splitContainer.Panel2.Width/2)/2); 
    var yPoint = tabImageView.Location.Y; 

    var width = tabImageView.Width/2; 
    var height = (tabImageView.Height/2) - toolStripImageView.Height; 

    if (picBoxView.Image == null) return; 

    //Resize image according to width 
    picBoxView.Image = ImageMethods.ResizeImage(picBoxView.Image.Tag.ToString(), width, height, false); 

    picBoxView.Location = new Point(xPoint, yPoint); 
    picBoxView.Width = width; 
    picBoxView.Height = height; 
} 

Ma non ridimensionare il picturebox alla sua immagine (è possibile vedere la parte nera che è tornato colore per il controllo PictureBox):

IT is ok the first time

il problema sta peggiorando, non appena ho ridimensionare la forma, la posizione picturebox volontà va verso l'alto:

Form resized

Io chiamo il codice qui sopra anche nell'evento di ridimensionamento del modulo, non ho idea del perché funzioni all'avvio dell'applicazione. Sarebbe bello se qualcuno potesse dirmi quali proprietà dovrei prendermi cura di ottenere una immagine ben centrata che è sempre grande come la sua immagine.

+0

Provare a impostare Dock per riempire e impostare l'immagine come immagine di sfondo. BackgroundImageLayout può essere impostato su Center. E BackGroundColor to Transparent –

+0

La dimensione di 'picturebox.Image' è uguale alla dimensione di' picturebox'? perché ho bisogno di lavorare sui pixel dell'immagine, non so se la picturebox è più grande dell'immagine, l'immagine su cui sto lavorando sarà la picturebox stessa ?! sembra stupido, lo so! –

+0

ma poi penso di avere problemi se voglio ingrandire l'immagine! –

risposta

14

È abbastanza facile se si imposta lo stile di Anchor a nessuno:

picBoxView = new PictureBox(); 
picBoxView.SizeMode = PictureBoxSizeMode.AutoSize; 
picBoxView.Anchor = AnchorStyles.None; 
tabImageView.Controls.Add(picBoxView); 
CenterPictureBox(picBoxView, myImage); 

Poi basta centrare l'PictureBox inizialmente ogni volta che si cambia l'immagine del PictureBox:

private void CenterPictureBox(PictureBox picBox, Bitmap picImage) { 
    picBox.Image = picImage; 
    picBox.Location = new Point((picBox.Parent.ClientSize.Width/2) - (picImage.Width/2), 
           (picBox.Parent.ClientSize.Height/2) - (picImage.Height/2)); 
    picBox.Refresh(); 
} 

Avere il Anchor = None sarà un centesimo er il controllo PictureBox per te ogni volta che il contenitore genitore viene ridimensionato perché "non è" ancorato alle posizioni Left e Top predefinite.

1

Givien un Form con TabControl, che ha Dock insieme a Fill, sotto manterrà il vostro PictureBox al centro. Essa stabilisce inoltre PictureBox dimensioni per Bitmap dimensioni:

public partial class Form1 : Form 
    { 
     Bitmap b = new Bitmap(320, 200); 
     public Form1() 
     { 
      InitializeComponent(); 
      CenterTheBox(); 
     } 

     private void Form1_Resize(object sender, EventArgs e) 
     { 
      CenterTheBox(); 
     } 

     void CenterTheBox() 
     { 
      pictureBox1.Size = b.Size; 
      var left = (tabPage1.ClientRectangle.Width - pictureBox1.ClientRectangle.Width)/2; 
      var top = (tabPage1.ClientRectangle.Height - pictureBox1.ClientRectangle.Height)/2; 
      pictureBox1.Location = new Point(tabPage1.ClientRectangle.Location.X + left, tabPage1.ClientRectangle.Location.Y + top); 

     } 
    } 
1

Credo che il problema risiede qui

var xPoint = tabImageView.Location.X + ((splitContainer.Panel2.Width/2)/2); 
var yPoint = tabImageView.Location.Y; 

var width = tabImageView.Width/2; 
var height = (tabImageView.Height/2) - toolStripImageView.Height; 

ypoint è alwways impostato tabImageView Y, ma decorate deve essere impostato su

tabImageView.Location.Y + (tabImageView.Size.Height - picBoxView.Size.Height)/2 

dovrebbe essere quasi la stessa cosa con xPoint

tabImageView.Location.X + (tabImageView.Size.Width - picBoxView.Size.Width)/2 

e

width = picBoxView.Image.Width; 
height = picBoxView.Image.Height; 
Problemi correlati