|
小弟正在用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天了,欲哭无泪,郁闷至极。 |
|