首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不能在面板上用winform与cairo

为什么不能在面板上用winform与cairo
EN

Stack Overflow用户
提问于 2013-05-02 07:28:21
回答 1查看 564关注 0票数 1

我在窗口上有cairo的问题,我不知道为什么它不能在我的面板上画画,当我使用GDI时,一切都是oke,但是当我使用cairo时,我不能画,请帮助。谢谢。

把开罗画出来

代码语言:javascript
复制
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();
        }
    }
}

这是我的形式

代码语言:javascript
复制
   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);
    }

}
EN

回答 1

Stack Overflow用户

发布于 2015-09-17 17:48:35

在窗口显示之前,可能无法获得该上下文,但我不确定。

当在覆盖的PaintEventArgs方法中使用OnPaint的图形时,它可以工作。

代码语言:javascript
复制
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 当表单显示时

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16332576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档