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

标签 c gtk drawing xlib gdk

我有一个问题。

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

相关文章:

c - 我想将 gdb 用于一个 c 文件,该文件具有类似 #include "config.h"的头文件?

python - 是否有等效的方法从 XML 加载 GMenu?

c++ - 如何将 gtk::label 与目录中文件的创建或抑制同步?

java - 在 Java/android Canvas 上创建具有深度/3D 外观的形状

c - 为什么有些文件指针在 64 位操作系统上有 28 位地址?

c - 用C格式化pendrive

c - 可以使用 ioctl() 将 9 针串行端口用作 "GPIO"吗?

c - 绘制到 gtk 窗口

python - 在 python 中绘制具有不同角度的填充矩形

javascript - HTML5 canvas 绘制带旋转的图像部分