Tôi đang cố gắng tìm ra cách chính xác các thùng chứa đồ họa gdi + hoạt động với các đơn vị đồ họa khác nhau. Hãy xem mã dưới đây. Nó biên dịch, bạn có thể dán nó vào một mẫu mới.Vùng chứa đồ họa hoạt động như thế nào?
void Form2_Paint(object sender, PaintEventArgs e)
{
var gfx = e.Graphics;
System.Diagnostics.Debug.WriteLine("DpiX={0}, DpiY={1}", gfx.DpiX, gfx.DpiY);
gfx.PageUnit = GraphicsUnit.Inch;
var pen = new Pen(Color.Black, 0.01f);
// Create outer container, 2 inches in size with X and Y set to 0.1 inches
var outerContainer = gfx.BeginContainer(
new RectangleF(0.1f, 0.1f, 2, 2),
new RectangleF(0, 0, 2, 2),
GraphicsUnit.Pixel);
// Draw the outer rectangle
gfx.DrawRectangle(pen, new Rectangle(0, 0, 2, 2));
// Create inner container, 1 inch in size with X and Y set to 0.1 inches
var innerContainer = gfx.BeginContainer(
new RectangleF(0.1f, 0.1f, 1, 1),
new RectangleF(0, 0, 1, 1),
GraphicsUnit.Pixel);
// Draw the inner rectangle
gfx.DrawRectangle(pen, new Rectangle(0, 0, 1, 1));
gfx.EndContainer(innerContainer);
gfx.EndContainer(outerContainer);
}
Trên mã là một ví dụ khá đơn giản của container đồ họa lồng nhau, tôi đã sử dụng không chuyển đổi rộng. Đây là cách thức trông giống như khi ở trên handler sơn được sử dụng:
Nó khá đơn giản. Bây giờ, tôi sẽ cố gắng mô tả vấn đề là gì.
Đây là một chữ ký của phương pháp BeginContainer
:
public GraphicsContainer BeginContainer(
RectangleF dstrect,
RectangleF srcrect,
GraphicsUnit unit
)
Những gì tôi đang thất bại trong việc hiểuGraphicsUnit unit
đối số là.
Từ MSDN:
thành viên thuộc kiểu liệt kê GraphicsUnit chỉ định đơn vị đo lường cho container.
Điều này xuất hiện không là đúng!
Như bạn thấy trong mã của tôi, tôi đang sử dụng đơn vị Inch như vậy: gfx.PageUnit = GraphicsUnit.Inch
.
Tuy nhiên, khi tôi tạo vùng chứa, đây là những gì tôi chuyển qua dưới dạng đối số đơn vị cho phương thức BeginContainer
: GraphicsUnit.Pixel
. Điều gì xảy ra sau khi vùng chứa được tạo? Inch đang được sử dụng (những gì tôi thực sự muốn). Nhưng nếu tôi vượt qua GraphicsUnit.Inch
(hoặc mm hoặc bất kỳ điều gì khác) với đối số, pixel được sử dụng. Vì vậy, có vẻ như để hoàn thành những gì tôi muốn (sử dụng inch), tôi phải xác định điểm ảnh?
Điều này không có ý nghĩa với tôi. Bạn có thể thử thay đổi các đơn vị trong các phương thức BeginContainer
ở mã trên và quan sát kết quả lạ. Tôi đã đọc MSDN và tất cả mọi thứ tôi có thể thu thập về điều này nhưng tôi vẫn không biết gì.
Tôi đang viết phần mềm vẽ nhiều thứ bằng gdi + và sử dụng đơn vị milimet cho mục đích in - khi tôi bắt đầu sử dụng vùng chứa, tôi khá ngạc nhiên khi tôi chỉ định pixel là đơn vị. Tôi thực sự nghi ngờ về bất kỳ mã in nào trong đó pixel được đề cập. Nó phải là tôi có một sự hiểu lầm lớn về vấn đề này.
Vì vậy, tất cả ở trên được xem xét, câu hỏi của tôi là: mục đích của đối số unit
là gì trong phương pháp này?
Kết quả sẽ là gì? Hình chữ nhật có kích thước 1 pixel? Tôi nghĩ * các hình chữ nhật bạn đang sử dụng trong hàm tạo có liên quan đến điều đó. Nó trở nên khó hiểu. – LarsTech
@Lars hình chữ nhật được tính bằng đơn vị inch. Ban đầu tôi đã có nhiều con số "bình thường tìm kiếm" tính bằng milimét nhưng tôi nghĩ rằng có thể dễ dàng hơn để gỡ lỗi các inch do DPI là các chấm trên mỗi inch. Cả hai hình chữ nhật bạn nhìn thấy trên biểu mẫu chính xác là kích thước của các vùng chứa. – bokibeg