【发布时间】:2013-02-21 11:20:20
【问题描述】:
我有问题。
我需要使用函数 Xlib(XDrawLine 等)在小部件类型 GtkDrawingArea 上绘制。
为什么?
我使用库,它使用 Xlib 绘制。而且我需要在渲染函数drawSome(...)中传递任何参数(Display、Window、GC)。一切都很好。我获取这些参数(通过 gdk_x11_...()、GdkDrawable、GdkGC)并使用获取的参数调用 drawSome(...)。
但也有问题 - 绘图并不总是完成。最大化窗口、拖动、调整 DrawingArea 大小等时不显示图像。仅在对顶部窗口进行异常操作时才显示图像。
然后我测试了函数 XDrawPoint/Line/Rectangle - 同样的问题。如果我们使用 gdk_draw_rectangle (...) - 一切正常。
下面是代码:
...
GtkDrawingArea* area;
...
int main (int argc, char *argv[])
{
...
area=GTK_DRAWING_AREA(gtk_builder_get_object(builder,"area"));
gtk_widget_realize (GTK_WIDGET(area));
...
g_signal_connect (G_OBJECT(area), "expose_event", G_CALLBACK(expose_event_callback), NULL);
...
}
...
gboolean expose_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data)
{
Display *dpy = gdk_x11_drawable_get_xdisplay(widget->window);
Window win =gdk_x11_drawable_get_xid(widget->window);
GC gc = DefaultGC(dpy, DefaultScreen(dpy));
//draw image on (0,0) in widget DrawingArea and a small black rectangle over image
drawSome(dpy, win, gc, ...);
XFillRectangle(dpy, win, gc, 0, 0, 10, 10);
return FALSE;
}
...
图像和一个黑色的小矩形仅在一种情况下显示:如果窗口超出桌面并返回桌面 - 图像会出现。在其他情况下,它不会显示。 印象是另一个函数擦除了 DrawingArea。
谁能告诉我有什么问题?
不胜感激!
还有……抱歉英语这么差!
【问题讨论】:
-
除非你有真正令人信服的理由来使用 xlib,否则不要使用它。改用 cairo,它的更高级别适用于 gtk。你可以在这里找到一个例子:stackoverflow.com/questions/9395111/… 看看第二个代码框架。使用 cairo 可以在 GtkDrawingArea 上使用非常漂亮的图形
-
cairo 将无济于事。因为我使用了一个特殊的库 where 函数。它有以下参数:someFunction (long int, Display *, Window, GC, DRAWPOINT)。所以 cairo 和 gdk 绘图原语将无济于事。因为问题不在这个函数上,而是在错误的组织中使用低级 GtkDrawingArea(通过 Xlib)。