0

私は問題があります。

関数 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;
}
...

画像と小さな黒い四角形が表示されるのは 1 つのケースのみです。ウィンドウがデスクトップを超えて移動し、デスクトップに戻ると、画像が表示されます。それ以外の場合は表示されません。別の関数で DrawingArea を消去している印象です。

何が問題なのか誰に教えてもらえますか?

私は感謝されます!

そして… 下手な英語でごめんなさい!

4

3 に答える 3

0

これらの関数X Window System Interactionを使用する必要がありますが、注意が必要ですが、他にも落とし穴がある可能性があります。gtk_widget_set_double_bufferedを使用して GtkDrawingArea のダブルバッファリングも無効にする必要があると思います

于 2013-02-21T13:26:54.647 に答える