2010-04-28 36 views

Trả lời

-1

các picturebox là một điều khiển và có một hình ảnh như nguồn - vì vậy bạn phải vẽ vào hình ảnh và đưa hình ảnh để điều khiển để hiển thị nó

MyImage = new Bitmap(fileToDisplay); 
pictureBox1.ClientSize = new Size(xSize, ySize); 
pictureBox1.Image = MyImage; 
+0

Điều này vẽ __into một bitmap__, không __onto picturebox__. Nó hoạt động nhưng nó là somethng hoàn toàn khác nhau! – TaW

2

Cách tốt nhất là KHÔNG vẽ hình tròn và đường thẳng trong hình tượng! Nó không được thiết kế cho mục đích đó.

Từ GDI + blog của Bob Powell:

Các gốc rễ của vấn đề này là các quy tắc cơ bản của cửa sổ lập trình đã bị phá vỡ. Và hậu quả của hộp hình ảnh là nguyên nhân của một thứ không phải là lỗi của nó. Để giúp giải thích lý do tại sao, bốn điểm dưới đây mô tả những gì đã xảy ra trong trường hợp này.

  • Điều khiển PictureBox là để hiển thị hình ảnh. Nó không phải là một giữ chỗ tiện dụng cho một bề mặt đồ họa.

  • Windows là một hệ thống điều khiển sự kiện trong đó mỗi sự kiện phải được phục vụ trong ngữ cảnh và sự kiện đúng để xử lý các sự kiện nhấp chuột hoặc di chuyển chuột không được sử dụng để vẽ trên màn hình hoặc các nội dung lạ khác.

  • PictureBox tự làm mới bằng cách vẽ đối tượng dựa trên System.Drawing.Image được lưu trữ trong thuộc tính Hình ảnh của nó. Nếu không có hình ảnh, nó sẽ hiển thị màu nền.

  • Đánh cắp và vẽ trên đối tượng Đồ họa của bất kỳ điều khiển nào là không tốt, nên được khuyến khích mạnh mẽ và phá vỡ các quy tắc xử lý sự kiện ở đúng nơi vào đúng thời điểm. Về cơ bản, nếu bạn làm điều này, nó sẽ khiến bạn đau đớn. Khi bạn đập đầu vào tường, nó làm bạn đau. đó là dấu hiệu cho thấy bạn nên ngừng làm việc đó. Nó giống nhau cho các cuộc gọi PictureBox.CreateGraphics.

Cách đúng để thực hiện.

Thực hiện theo các quy tắc của hệ thống điều khiển sự kiện thật dễ dàng nhưng yêu cầu một số tiền nhỏ được khuyến nghị là . Vì vậy, nếu bạn muốn vẽ một ít đồ họa và giữ nó ở đó khi một cửa sổ di chuyển trước mặt nó và quay lại hoặc khi bạn thu nhỏ và khôi phục, bạn phải phục vụ sự kiện Sơn bất kỳ đối tượng nào mà bạn muốn vẽ lên. PictureBox mang hành lý xung quanh với nó là không cần thiết cho loại ứng dụng này. Nếu bạn chỉ muốn vẽ một thứ gì đó trong một địa điểm , hãy vẽ nó trên biểu mẫu bằng cách trả lời sự kiện Form.Paint. Nếu bạn muốn trình giữ chỗ tiện dụng cho hình ảnh hoạt động trong giới hạn được đặt, hãy sử dụng điều khiển Bảng điều khiển và dịch vụ là sự kiện Paint. Nếu bạn muốn sao chép ảnh lặp lại cho hình ảnh công ty của mình, hãy tạo điều khiển và thực hiện thao tác vẽ trong ghi đè OnPaint.

gốc liên kết (không còn giá trị): http://bobpowell.net/picturebox.htm

Chú ý: Các link gốc vào blog Bob Powell là không còn chức năng. Tôi đã để nó ở đây vì mục đích lịch sử. Nội dung của trang vẫn có thể được xem trên lưu trữ internet (https://web.archive.org/web/20120330003635/http://bobpowell.net/picturebox.htm) kể từ ngày bài đăng này được chỉnh sửa.

+2

+1 Đây thực sự là câu trả lời đúng. Cảm ơn bạn đã liên kết, mô tả vấn đề gốc. – Sabuncu

+8

-1 "Linkrot" ... và câu trả lời này đưa ra vài gợi ý về vấn đề là gì hoặc phải làm gì thay thế. "Liên kết với các tài nguyên bên ngoài được khuyến khích, nhưng hãy thêm ngữ cảnh xung quanh liên kết để người dùng đồng nghiệp của bạn sẽ biết nó là gì và tại sao lại có liên kết đó. không thể truy cập hoặc ngoại tuyến vĩnh viễn ". Nguồn: http://stackoverflow.com/help/how-to-answer Tuy nhiên, tôi đã tìm thấy các trang bobpowell được lưu giữ trong "Máy Wayback": https://web.archive.org/web/20120216111903/http: //bobpowell.net/picturebox.htm –

+0

Đây là một câu trả lời khủng khiếp. Các trang (nếu không tuyệt vời) của bobpowell không chỉ biến mất mà không có cách nào đề nghị bạn không nên vẽ lên một PictureBox. Trong thực tế, DoubleBuffering mặc định của chúng làm cho nó trở thành các điều khiển duy nhất phù hợp để vẽ ra khỏi hộp. Bob chỉ đơn thuần cảnh báo chống lại việc sử dụng 'Control.CreateGraphics' được rút ra khỏi tất cả các bản sao mới từ trang ví dụ MSDN khủng khiếp. – TaW

24

hay:

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
    { 
     e.Graphics.DrawLine(
      new Pen(Color.Red,2f), 
      new Point(0,0), 
      new Point(pictureBox1.Size.Width, pictureBox1.Size.Height)); 

     e.Graphics.DrawEllipse(
      new Pen(Color.Red, 2f), 
      0,0, pictureBox1.Size.Width, pictureBox1.Size.Height ); 
    } 

Xử lý sự kiện sơn của hộp hình ảnh và vẽ tùy chỉnh của bạn ở đó.

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