2012-02-21 59 views
7

Tôi đang desiging một trình xem ảnh đơn giản với khả năng thực hiện một số xử lý hình ảnh cơ bản. Tại thời điểm này tôi có vấn đề giữ PictureBox tập trung bên trong một TabPage tất cả các thời gian cũng như giữ chiều rộng và kích thước hình ảnh giống như hình ảnh hiển thị của nó. Cho đến nay tôi đã không thành công.Giữ PictureBox tập trung bên trong một vùng chứa

Tôi có mã sau mà tôi gọi trong hàm tạo biểu mẫu để định vị nó ở chính giữa. nó hoạt động lần đầu tiên để tập trung các 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; 
} 

Nhưng nó không thay đổi kích thước picturebox để hình ảnh của mình (bạn có thể nhìn thấy một phần đen mà là trở lại màu sắc cho sự kiểm soát picturebox):

IT is ok the first time

vấn đề ngày càng nghiêm trọng ngay sau khi tôi thay đổi kích thước hình thức, vị trí picturebox sẽ leo lên top:

Form resized

Tôi gọi mã ở trên trong sự kiện thay đổi kích thước của biểu mẫu là tốt, không có ý tưởng tại sao nó hoạt động khi ứng dụng bắt đầu. Sẽ rất tuyệt nếu ai đó có thể cho tôi biết những thuộc tính nào tôi nên quan tâm để đạt được một hình ảnh độc đáo ở giữa mà luôn luôn lớn như hình ảnh của nó.

+0

Hãy thử đặt Dock để điền và đặt Hình ảnh làm hình nền. Có thể đặt BackgroundImageLayout thành Trung tâm. Và BackGroundColor to Transparent –

+0

Kích thước 'picturebox.Image' có tương đương với kích thước' picturebox' không? bởi vì tôi cần phải làm việc trên các điểm ảnh của hình ảnh, tôi không biết nếu hình tượng là lớn hơn hình ảnh, hình ảnh tôi đang làm việc trên sẽ là picturebox chính nó ?! âm thanh ngu ngốc tôi biết! –

+0

nhưng sau đó một lần nữa tôi nghĩ rằng tôi sẽ có vấn đề nếu tôi muốn phóng to trong hình ảnh! –

Trả lời

14

Nó khá dễ dàng nếu bạn chỉ cần thiết lập các Anchor phong cách không ai sánh kịp:

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

Sau đó chỉ cần tập trung các PictureBox ban đầu bất cứ khi nào bạn thay đổi hình ảnh của 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(); 
} 

Có tỷ lệ Anchor = None sẽ là xu er kiểm soát PictureBox cho bạn bất cứ khi nào vùng chứa mẹ được thay đổi kích thước vì vùng chứa "không được" neo vào các vị trí Mặc định và Vị trí trên cùng.

1

Givien a Form với TabControl, trong đó có Dock được đặt thành Fill, bên dưới sẽ giữ PictureBox ở giữa. Nó cũng đặt PictureBox kích thước để Bitmap kích thước:

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

Tôi tin rằng vấn đề của bạn nằm ở đây

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 được alwways thiết lập để tabImageView Y, mặc dù nó nên được đặt thành

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

phải gần như giống với xPoint

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

width = picBoxView.Image.Width; 
height = picBoxView.Image.Height; 
Các vấn đề liên quan