2012-03-17 18 views
7

Hiện nay tôi đang cố gắng để làm những gì tôi nghĩ sẽ là một nhiệm vụ đơn giản:Vẽ một hình ảnh vào một điều khiển Bảng điều chỉnh cho các đồ tạo tác khi thay đổi kích thước

Vẽ một hình ảnh vào khu vực đầy đủ của một Panel control trong Windows Forms. (Xin vui lòng bỏ qua cho thời điểm này mà tôi có thể sử dụng BackgroundImage property)

Những hình ảnh để vẽ trông như sau:

enter image description here

Tức là một hộp màu vàng với khung màu xanh lam 1 pixel xung quanh.

Để vẽ, Tôi đang sử dụng sự kiện Paint của Panel kiểm soát:

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.DrawImage(Resources.MyImage, panel1.ClientRectangle); 
} 

này có vẻ tốt đẹp khi ban đầu hiển thị có dạng:

enter image description here

Khi thay đổi kích thước hình thức (và bảng điều khiển được gắn) cũng có thể cắt các cạnh khi được làm nhỏ hơn ...

enter image description here

... hoặc nó thu hút các đồ tạo tác, khi được thực hiện lớn hơn:

enter image description here

Tôi khá chắc chắn rằng có một cái gì đó đang xảy ra khá đơn giản và thẳng về phía trước nhưng tôi thực sự không thể hiểu được lý do.

Vì tôi bỏ qua ClipRectangle và luôn vẽ mọi thứ, tôi nghĩ hình ảnh sẽ được thu nhỏ mọi lúc.

Câu hỏi của tôi là:

  • lý do cho hiện vật là gì? (I yêu thích để hiểu điều này!)
  • Tôi phải làm gì để loại bỏ các đồ tạo tác? (Bên cạnh gọi Invalidate trên mỗi thay đổi kích thước)

Update, GIẢI PHÁP:

Nhờ Ryan's answer, tôi đã có thể tìm thấy một giải pháp chấp nhận được. Về cơ bản tôi bắt nguồn từ một lớp học từ Panel, đã ghi đè số OnPaintBackground và đã làm không phải là gọi phương thức cơ sở. Cuối cùng, tôi đã thêm đoạn mã sau vào hàm tạo của bảng dẫn xuất của tôi:

base.DoubleBuffered = true; 

SetStyle(ControlStyles.AllPaintingInWmPaint, true); 
SetStyle(ControlStyles.ResizeRedraw, true); 
SetStyle(ControlStyles.UserPaint, true); 
SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 

UpdateStyles(); 
+1

có thể trùng lặp của http://stackoverflow.com/questions/1970196/c-sharp-panel-backgroundimage-transparent-controls-flickering – ionden

Trả lời

4

Lý do tạo tác phẩm là toàn bộ bề mặt không được vẽ lại khi biểu mẫu được thay đổi kích thước; chỉ những phần cần thiết là. Giải pháp chung tốt nhất là những gì bạn không muốn làm, gọi Invalidate trên mỗi thay đổi kích thước. Tuy nhiên, nếu đây là tình huống của bạn, chỉ cần sử dụng một số PictureBox.Nếu không, bạn có thể xem xét ghi đè OnPaint trong biểu mẫu của mình thay vào đó và sử dụng this.SetStyle(ControlStyles.ResizeRedraw, true) để tự động thực hiện việc này.

+0

Bất kỳ cơ hội nào để giảm nhấp nháy khi gọi 'Invalidate'? (Tôi nghĩ rằng điều này xuất phát từ nền được rút ra đầu tiên) Có lẽ chuyển bản vẽ nền/điền? –

+2

@UweKeim: Bạn cần kích hoạt bộ đệm đôi; phân lớp 'Panel', sử dụng' OnPaint' thay vì xử lý 'Paint' và đặt thuộc tính' DoubleBuffered' thành 'true'. – Ryan

Các vấn đề liên quan