gpt4 book ai didi

c - 使用 Xlib 函数在 GtkDrawingArea 上绘图

转载 作者:行者123 更新时间:2023-11-30 17:54:20 26 4
gpt4 key购买 nike

我有一个问题。

我需要使用函数 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。

谁能告诉我这是什么问题?

我将不胜感激!

还有...抱歉英语这么差!

最佳答案

我认为您需要做的就是添加 XFlush(dpy);在 XFillRectangle 命令之后。我写了一个简短的例程,它似乎有效。

#include <X11/Xlib.h> //-lX11
#include <gtk/gtk.h> //$$(pkg-config --cflags --libs gtk+-3.0)
#include <gdk/gdkx.h>
void DrawOnWidget(GtkWidget *widget)
{
GdkDisplay *gdk_dis = gdk_display_get_default();
Display *dis = gdk_x11_display_get_xdisplay (gdk_dis);
GC gc = DefaultGC(dis, DefaultScreen(dis));
GdkWindow *gdk_window = gtk_widget_get_window(widget);
Window win = gdk_x11_window_get_xid(gdk_window);
unsigned long valuemask = GCForeground;
XGCValues vColor;
vColor.foreground = 0x000000FF;
XChangeGC(dis, gc, valuemask, &vColor);
XFillRectangle(dis, win, gc, 0, 0, 100, 100);
XFlush(dis);
}

关于c - 使用 Xlib 函数在 GtkDrawingArea 上绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15000945/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com