2009-09-28 27 views
9

Tôi vẽ biểu đồ trên điều khiển, nhưng 0,0 là ở góc trên cùng bên trái của điều khiển. Có cách nào lật các tọa độ sao cho 0,0 nằm ở góc dưới bên trái của điều khiển không?lật tọa độ khi vẽ để điều khiển

+0

Bạn đang sử dụng WinForms hoặc WPF? Bạn có thể muốn cập nhật các thẻ trên câu hỏi của mình. –

Trả lời

13

Nếu bạn đang sử dụng WinForms, sau đó bạn có thể thấy rằng bạn có thể lật Y-Axis sử dụng Graphics.ScaleTransform:

private void ScaleTransformFloat(PaintEventArgs e) 
{ 
    // Begin graphics container 
    GraphicsContainer containerState = e.Graphics.BeginContainer(); 

    // Flip the Y-Axis 
    e.Graphics.ScaleTransform(1.0F, -1.0F); 

    // Translate the drawing area accordingly 
    e.Graphics.TranslateTransform(0.0F, -(float)Height); 

    // Whatever you draw now (using this graphics context) will appear as 
    // though (0,0) were at the bottom left corner 
    e.Graphics.DrawRectangle(new Pen(Color.Blue, 3), 50, 0, 100, 40); 

    // End graphics container 
    e.Graphics.EndContainer(containerState); 

    // Other drawing actions here... 
} 

Bạn chỉ cần bao gồm bắt đầu/cuộc gọi chứa kết thúc nếu bạn muốn làm thêm bản vẽ sử dụng hệ thống tọa độ thông thường. Thông tin thêm về vùng chứa đồ họa là available on MSDN.

Như đã đề cập trong Tom trong nhận xét, phương pháp này yêu cầu giá trị Height để có sẵn với giá trị chính xác. Nếu bạn thử điều này và thấy không có gì được rút ra, đảm bảo rằng giá trị là chính xác trong một trình gỡ lỗi.

+0

Bạn cũng cần thêm bản dịch để công việc này hoạt động chính xác. – Eric

+0

Cảm ơn Eric. Tôi đã cập nhật câu trả lời của mình và bao gồm thông tin về cách sử dụng các vùng chứa đồ họa để tách biệt các biến đổi này khỏi các thay đổi khác. –

+0

Đã không làm việc cho tôi. Tôi chưa phải là một WinForms wiz. Khi nó quay ra "Chiều cao" không liên quan đến điều khiển hiện tại. Tôi gọi nó trong bảng điều khiển của tôi.OnPaint và không có gì được sơn. Đề cập rằng bạn cho rằng bạn đang vẽ lên biểu mẫu có thể tiết kiệm cho người khác một thời gian, vì nó có thể đã tiết kiệm cho tôi một số thời gian gỡ lỗi;) – Tom

0

Không, nhưng sử dụng thuộc tính Size (hoặc Height) của điều khiển, thật dễ dàng để tính toán tọa độ đã lật: Chỉ cần vẽ tới Height-y.

0

Không phải là tôi biết nhưng nếu bạn sử dụng (x, Control.Height-y) bạn sẽ có được hiệu ứng tương tự.

-1

trong ngắn hạn không, tuy nhiên nếu tôi đang vẽ trên điều khiển rất nhiều tôi có một vài chức năng mà giúp tôi:

Point GraphFromRaster(Point point) {...} 
Point RasterFromGraph(Point point) {...} 

cách này tôi giữ tất cả các chuyển đổi ở một nơi, không lo lắng về những thứ như y - this.Height phân tán về mã.

+0

lý do bỏ phiếu xuống? – Pondidum

1

Dưới đây là một usercontrol đơn giản mà chứng tỏ làm thế nào để làm điều này:

public partial class UserControl1 : UserControl 
{ 
    public UserControl1() 
    { 
     SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true); 

     InitializeComponent(); 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     e.Graphics.ScaleTransform(1.0F, -1.0F); 
     e.Graphics.TranslateTransform(0.0F, -(float)Height); 
     e.Graphics.DrawLine(Pens.Black, new Point(0, 0), new Point(Width, Height)); 

     base.OnPaint(e); 
    } 
} 
Các vấn đề liên quan