2013-05-02 1 views
1

У меня есть proplem с cairo на окне, я не знаю, почему Он не может рисовать на моей панели Когда я использую GDI, все оке, но я могу " t draw, когда я использую cairo, Пожалуйста, помогите. спасибо.Почему нельзя рисовать на панели в winform с cairo


Wrap Каир рисовать

using System; 
using Cairo; 
using Gtk; 
namespace BT.LibExtend 
{ 
    public class CairoExt : BTGraphicLibExt 
    { 
     Surface s; 
     Context c; 
     public CairoExt(IntPtr hdc) 
     { 
      s = new Win32Surface(hdc); 
      c = new Context(s); 
     } 
     public override void DrawLine(double x1, double y1, double x2, double y2) 
     { 
      c.MoveTo(x1, y1); 
      c.LineTo(x2, y2); 
      c.Stroke(); 
     } 
    } 
} 

это MyForm

public partial class FigureDraw : Form 
{ 
    GraphicLibExt glip; 

    public FigureDraw() 
    { 
     InitializeComponent(); 
     glip = new CairoExt(pnMainDraw.CreateGraphics().GetHdc()); 

    } 

    private void btnLine_Click(object sender, EventArgs e) 
    { 
     glip.DrawLine(20, 20, 100, 100); 
    } 

} 

ответ

0

Возможно deive контекст не может быть приобретено, пока окно не появится, но я не уверен, ,

При использовании графического объекта PaintEventArgs в методе OnPaint с переопределением он работает.

using System.Windows.Forms; 
using Cairo; 
using Color = Cairo.Color; 
using Graphics = System.Drawing.Graphics; 

public partial class Form1 : Form 
{ 
    public Graphics Graphics1 { get; private set; } 
    public Context Context1 { get; set; } 
    public Win32Surface Surface1 { get; private set; } 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 

     Graphics1 = e.Graphics; 
     Surface1 = new Win32Surface(Graphics1.GetHdc()); 
     Context1 = new Context(Surface1); 

     var p1 = new PointD(10, 10); 
     var p2 = new PointD(100, 10); 
     var p3 = new PointD(100, 100); 
     var p4 = new PointD(10, 100); 

     Context1.MoveTo(p1); 
     Context1.LineTo(p2); 
     Context1.LineTo(p3); 
     Context1.LineTo(p4); 
     Context1.LineTo(p1); 
     Context1.ClosePath(); 
     Context1.Fill(); 

     Context1.MoveTo(140, 110); 
     Context1.SetFontSize(32); 
     Context1.SetSourceColor(new Color(0,0,0.8,1)); 
     Context1.ShowText("Hello Cairo!"); 

     Graphics1.Dispose(); 
     Context1.Dispose(); 
     Surface1.Dispose(); 
    } 
} 

Или использовать нативный метод GetDC, чтобы получить HDC when the form is shown.