QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1297|回复: 2

GTK高手请进,因GTK版本变化而引起的同一函数的行为不一致

[复制链接]
发表于 2006-7-13 15:22:27 | 显示全部楼层 |阅读模式
小弟正在用gtk做一个gui跨平台的系统。目前是在windows平台上开发。
最开始我使用的gtk版本号是:2.8.18.

系统中有这样一个功能:在界面上根据鼠标的移动显示一个cross line,并且有相应的文字显示。这些显示都随着鼠标的移动而移动。

我的实现办法是:
1。对于line的移动,用GdkGC的GDK_XOR属性,画new line的时候,就将原来的line恢复到最初的界面。
2。对于动态的文字显示,我预先将动态文字出现的区域提前copy下来。在显示动态的文字之前,先将提前copy的区域画到对应的屏幕区域,然后再显示动态文字。这样子就可以解决那一块的刷新问题,保证以前的动态文字被擦掉。
对于第2种方法的具体实现方法需要两个关键的gtk函数:
首先copy区域,
m_pixbuf =gdk_pixbuf_get_from_drawable(NULL,
m_w->window,  //the window where we copy a specific area
NULL,x, y, 0, 0, width, height);
显示动态文字之前,将m_pixbuf的内容画到对应的区域:
GdkGC* m_gc=gdk_gc_new(m_w->window);
gdk_draw_pixbuf(m_w->window, m_gc,
        m_pixbuf,
        0, 0, x, y, -1, -1, GDK_RGB_DITHER_NONE, 0, 0);

对于第2种方法,在我使用2.8.18 gtk动态连接库的时候,工作的很好。
但当我使用2.4.14 gtk动态连接库(客户要求)重新连接后,问题出现了:
(test.exe): Gdk-WARNING **: gdkdrawable-win32.c:1498: SelectObject failed: Not enough storage is available to process this command.

这个错误应该是由gdk_pixbuf_get_from_drawable函数引起的。后来到网上搜索了一下,要求gdk_pixbuf_get_from_drawable的第2个参数应当是top level window才可以,于是我就这两个函数的第2个参数统统换成gtk_widget_get_toplevel(m_w)->window。此后上面的警告没有了,但是动态显示文字却也无法刷新了,动态文字显示后的区域一片花屏,表示m_pixbuf 根本就没有copy有原来的图像。最终结果相当于这两个函数没有做任何事情。

谢谢各位ggjjddmm。已经卡在这儿2,3天了,欲哭无泪,郁闷至极。
发表于 2006-7-13 19:52:13 | 显示全部楼层
刚开始的做法才是对的,src没要求是个top level window呀,是个GdkDrawable就行
至于为什么会出错,不解   是不是系统存在两个库的问题?
回复

使用道具 举报

 楼主| 发表于 2006-7-13 20:56:15 | 显示全部楼层
对于后一种方法,我把pixbuf中的内容打到屏幕上,发现它的值根据我的gui的变化而变化了,说明第一个函数成功了。那问题就在于我draw pixbuf那个函数了。我再看看是哪儿的问题。
谢谢。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 12:22 , Processed in 0.047891 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表