【问题标题】:How to do off-screen drawing using Cairo in Gtk+?如何在 Gtk+ 中使用 Cairo 进行屏幕外绘图?
【发布时间】:2010-11-27 09:09:53
【问题描述】:

我正在尝试在开罗图像上下文中进行绘图。有没有办法在公开事件时将 Image 上下文的内容加载到 Cairo 上下文?

例如,我想根据光标在绘图区域上的移动绘制一系列点,如果我想保留所有点,我应该使用屏幕外缓冲区,所以我使用图像上下文,但我找不到一种在暴露事件上将其绘制到开罗上下文的方法...

有什么办法吗?

【问题讨论】:

    标签: graphics drawing gtk cairo vala


    【解决方案1】:

    我自己找到了解决方案!

    这里是:

    using Cairo; 
    using Gtk;
    
    public class Canvas : Gtk.DrawingArea{
    public Canvas(MainWindow mw){
        stdout.printf("-> Canvas\n");
    
        main_window = mw;
        is_pressed_down = false;
    
        add_events(Gdk.EventMask.BUTTON_PRESS_MASK |
                  Gdk.EventMask.BUTTON_RELEASE_MASK |
                          Gdk.EventMask.POINTER_MOTION_MASK);
    
                set_size_request(400, 300);
    }
    
    ~Canvas(){
        stdout.printf("<- Canvas\n");
    }
    
    public override void realize(){
        base.realize();
        stdout.printf("realize\n");
    }
    
    protected override bool configure_event(Gdk.EventConfigure event){
        int x, y;
    
        window.get_size(out x, out y);
        offscreen_surface = new Cairo.ImageSurface(Cairo.Format.RGB24, x, y);
        gc = new Cairo.Context(offscreen_surface);
        gc.set_antialias(Antialias.NONE);
        gc.set_line_width(1);
        gc.set_source_rgb(1, 1, 1);
        gc.paint(); // it will make trouble if user resize the window
    
        string msg = "x: " + x.to_string() + ", y: " + y.to_string();
        main_window.set_statusbar(msg);
    
        return true;
    }
    
    protected override bool expose_event(Gdk.EventExpose event){
    
        var tgc = Gdk.cairo_create(window); //!!!
        tgc.set_source_rgb(1, 1, 1);
        tgc.paint();
    
        tgc.set_source_surface(offscreen_surface, 0, 0);
        tgc.paint();
    
        return true;
    }
    
    public override bool motion_notify_event(Gdk.EventMotion event)
    {
        string msg = "x: " + event.x.to_string() + ", y: " + event.y.to_string();
        main_window.set_statusbar(msg);
    
        if(is_pressed_down){
            //gc.set_source_rgb(1, 1, 1);
            //gc.paint();
            gc.set_source_rgb(1, 0.5, 0);
    
            //gc.move_to(event.x, event.x);
            gc.arc(event.x, event.y, 1, 0, 360);        
            gc.stroke();
    
            weak Gdk.Region region = this.window.get_clip_region();
            this.window.invalidate_region(region, true);
            this.window.process_updates(true);
        }
    
        return true;
    }
    
    public override bool button_press_event(Gdk.EventButton event)
    {
        stdout.printf("Canvas.button_press_event\n");
        is_pressed_down = true;
        return true;
    }
    
    public override bool button_release_event(Gdk.EventButton event)
    {
        stdout.printf("Canvas.button_release_event\n");
        is_pressed_down = false;
        return true;
    }
    
    public Cairo.Context    get_context(){
        return gc;
    }
    
    private Cairo.Context       gc;
    private weak MainWindow main_window;
    private Cairo.ImageSurface  offscreen_surface;
    private bool                is_pressed_down;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-14
      • 2012-01-07
      • 2012-10-23
      相关资源
      最近更新 更多