免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4749 | 回复: 7
打印 上一主题 下一主题

Gtk drawable互相拷贝的时候显示出错 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-10 09:31 |只看该作者 |倒序浏览
我想创建了一个GdkPixmap的drawable,并且在上面画线,添加字体。称这个为drawable1.
同时,我又创建了一个新的窗口,并在上边添加了drawarea widget.该widget的可绘区为drawable2.

现在用gdk_draw_drawable()把drawable1拷贝到drawable2中并且显示出来。发现显示的图象不对,能看到我想画的直线,但还有很多乱七八糟的图象。代码如下,希望高手给我看看,谢谢!百思不得其解。


#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>
#define WIDTH 100
#define HEIGHT 100
GdkPixmap* newPixmap;
int my_expose_event(GtkWidget *widget , GdkEventExpose *event , gpointer data)
{
        GdkFont*   newFont;
        GdkPixbuf* pixBuf = NULL;
        if(newPixmap)
                g_object_unref(newPixmap);

        newFont   = gdk_font_load("micro");
        newPixmap = gdk_pixmap_new(NULL, WIDTH, HEIGHT, 16);
//      newPixmap = gdk_pixmap_new(widget->window, WIDTH, HEIGHT, -1);
        GdkGC* gc = gdk_gc_new(newPixmap);
        GdkColor white;
        GdkColormap *colormap;
        colormap = gdk_colormap_get_system ();
        gdk_color_white (colormap, &white);

        gdk_gc_set_background(gc, &white);
//      gdk_gc_set_foreground(gc, &white);

/*
        gdk_draw_rectangle(newPixmap, gc, TRUE,
                        0, 0, 100, 100);
*/
        printf("hehe\n");
        gdk_draw_string(newPixmap, newFont, gc, WIDTH, HEIGHT, "Hello, Test ok?");
        gdk_draw_line(newPixmap, gc, 0, 0, 100, 100);
        printf("xixi\n");

//      gdk_draw_line(widget->window, gc, 0, 0, 100, 100);
        pixBuf = gdk_pixbuf_get_from_drawable(NULL, newPixmap,
                        gdk_drawable_get_colormap(newPixmap), 0, 0, 0, 0, 100, 100);
        if(pixBuf){
                printf("pixbuf is ok");
                gdk_pixbuf_unref(pixBuf);
        }
      gdk_draw_pixmap(widget->window ,
//              widget->style->fg_gc[GTK_WIDGET_STATE(widget)] ,
                gc,
                newPixmap , 0 , 0 , 0 , 0,
                widget->allocation.width ,
                widget->allocation.height);
      return 0;
}

int
main(int argc, char** argv){
        gtk_init(&argc, &argv);
        GtkWidget* window;
        GtkWidget* draw_area;
        GdkFont*   newFont;

        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        newFont   = gdk_font_load("micro");
/*
        gdk_draw_drawable(window->window, gdk_gc_new(newPixmap),
                        newPixmap, 10, 10, 30, 30, 10, 10);
*/
        draw_area = gtk_drawing_area_new();
        gtk_widget_set_size_request( draw_area, WIDTH*3, HEIGHT*2 );
        gtk_container_add(GTK_CONTAINER(window), draw_area);
/*
        printf("Hello \n");
        gdk_draw_string(draw_area->window, newFont, draw_area->style->fg_gc[GTK_WIDGET_STATE(draw_area)],
                WIDTH, HEIGHT, "Hell World!!");
        printf(" World\n");
*/
         g_signal_connect(G_OBJECT(draw_area) , "expose_event" ,
              G_CALLBACK(my_expose_event) , NULL);
        gtk_widget_show(draw_area);
        gtk_widget_show(window);
        gtk_main();
        return 0;
}

论坛徽章:
0
2 [报告]
发表于 2008-01-10 12:47 |只看该作者
问题应该处在这里吧!
     gdk_draw_pixmap(widget->window ,
              widget->style->fg_gc[GTK_WIDGET_STATE(widget)] ,
                gc,
                newPixmap , 0 , 0 , 0 , 0,
                widget->allocation.width ,
                widget->allocation.height);
因为
                widget->allocation.width == WIDTH*3
                widget->allocation.height ==  HEIGHT*2

                newPixmap = gdk_pixmap_new(NULL, WIDTH, HEIGHT, 16);

所以应该是你的pixmap小于目标drawable的缘故!

论坛徽章:
0
3 [报告]
发表于 2008-01-10 15:17 |只看该作者

回复 #2 xy_god 的帖子

把        widget->allocation.width ,
                widget->allocation.height);

改为     WIDTH, HEIGHT);
有同样的问题。

主要是图片中有乱码,可能是背景颜色不对

论坛徽章:
0
4 [报告]
发表于 2008-01-10 17:04 |只看该作者
你的颜色分配有问题。比较混乱。有的函数在新的gtk版本中已经不用了。比如gdk_draw_string,应该用PangoLayout来处理文本。使用PangoLayout可以显示出文本。但是乱码问题没有找出来,应该是colomap的问题。
#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>
#include<string.h>
#define WIDTH 100
#define HEIGHT 100
GdkPixmap* newPixmap;
int my_expose_event(GtkWidget *widget , GdkEventExpose *event , gpointer data)
{
        GdkFont*   newFont;
         PangoLayout *pl;
          PangoRectangle pr;
          pl = gtk_widget_create_pango_layout (GTK_WIDGET (widget), NULL);
         
        GdkPixbuf* pixBuf = NULL;
        if(newPixmap)
                g_object_unref(newPixmap);

        newFont   = gdk_font_load("micro");
        //newPixmap = gdk_pixmap_new(NULL, WIDTH, HEIGHT, 16);
       newPixmap = gdk_pixmap_new(widget->window, WIDTH, HEIGHT, -1);
          GdkColormap *colormap;
       colormap = gdk_window_get_colormap (widget->window);
      
         GdkGC* gc = gdk_gc_new(newPixmap);
        gdk_gc_copy (gc, widget->style->black_gc);
         GdkColor white;
      

        white.red =65535;
        white.green = 65535;
        white.blue= 65535;
         gdk_colormap_alloc_color (colormap, &white, FALSE, TRUE);
        //gdk_gc_set_background(gc, &white);
      gdk_gc_set_foreground(gc, &white);

/*
        gdk_draw_rectangle(newPixmap, gc, TRUE,
                        0, 0, 100, 100);
*/
        printf("hehe\n");
        pango_layout_set_text (pl, "Hello, Test ok?", strlen ("Hello, Test ok?"));
        pango_layout_get_pixel_extents (pl, &pr, NULL);
        
       gdk_draw_layout(newPixmap, gc,  0, 0, pl);
     
     
     
        gdk_draw_line(newPixmap, gc, 0, 0, 100, 100);
        printf("xixi\n");

//      gdk_draw_line(widget->window, gc, 0, 0, 100, 100);
        /*
        pixBuf = gdk_pixbuf_get_from_drawable(NULL, newPixmap,
                        gdk_drawable_get_colormap(newPixmap), 0, 0, 0, 0, 100, 100);
        if(pixBuf){
                printf("pixbuf is ok");
                gdk_pixbuf_unref(pixBuf);
        }*/
      gdk_draw_pixmap(widget->window ,
             widget->style->fg_gc[GTK_WIDGET_STATE(widget)] ,
                newPixmap , 0 , 0 , 0 , 0,
                widget->allocation.width ,
                widget->allocation.height);
      return 0;
}

int
main(int argc, char** argv){
        gtk_init(&argc, &argv);
        GtkWidget* window;
        GtkWidget* draw_area;
        GdkFont*   newFont;

        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        newFont   = gdk_font_load("micro");
/*
        gdk_draw_drawable(window->window, gdk_gc_new(newPixmap),
                        newPixmap, 10, 10, 30, 30, 10, 10);
*/
        draw_area = gtk_drawing_area_new();
        gtk_widget_set_size_request( draw_area, WIDTH*3, HEIGHT*2 );
        gtk_container_add(GTK_CONTAINER(window), draw_area);
/*
        printf("Hello \n");
        gdk_draw_string(draw_area->window, newFont, draw_area->style->fg_gc[GTK_WIDGET_STATE(draw_area)],
                WIDTH, HEIGHT, "Hell World!!");
        printf(" World\n");
*/
         g_signal_connect(G_OBJECT(draw_area) , "expose_event" ,
              G_CALLBACK(my_expose_event) , NULL);
       // gtk_widget_show(draw_area);
        gtk_widget_show_all(window);
        gtk_main();
        return 0;
}

因为在工作,没有太多时间来找出这个错误。呵呵,你自己慢慢找一下吧

论坛徽章:
0
5 [报告]
发表于 2008-01-10 17:05 |只看该作者
gdk_color_white (colormap, &white);这个函数在新版本中也不用了

论坛徽章:
0
6 [报告]
发表于 2008-01-11 19:10 |只看该作者

回复 #4 biach 的帖子

biach 太感谢了。
昨天下午折腾很久,也找到用pango和layout来绘制字体到pixmap中。
走了很多冤枉路,感觉缺乏系统的GTK的教程,你都是怎么学的?介绍点经验

论坛徽章:
0
7 [报告]
发表于 2008-01-12 09:43 |只看该作者
有一个简单的教程。你可以参考下。给个邮箱可以发给你。也可以去www.gtk.org上下源码来看,上面还有gtk的API手册,很有效果。http://www.gtk.org/tutorial/这个教程也不错。很看完以后基本的东西都没问题了

论坛徽章:
0
8 [报告]
发表于 2008-01-29 17:32 |只看该作者
Thanks biach

你发到samueltx@gmail.com,谢谢了。

现在碰到另一个问题。

如果我只是想利用Gtk 来生成图片pixel buffer,并不创建窗口。不知道是不是可行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP