1

私のコード(以下)が行うこと:

  1. 背景色付きの XLIB ウィンドウを作成します
  2. ウィンドウに文字列を描画します
  3. ウィンドウに線を引く
  4. GTK+ ウィンドウを作成します
  5. GTK+ ウィンドウに、GDK ウィンドウを介して XLIB ウィンドウが存在することを認識させます。
  6. XLIB ウィンドウの出力を GTK+ ウィンドウ内に表示する

それは機能し、正しい色のウィンドウを作成しますが、画面に文字列や線を描画しません。それをどのように表示するか、またはどこが間違っているかについてのアイデアはありますか?

私が GTK+ 描画関数を使用しない理由は、これがテスト プログラムであり、実際にはすべての描画が xlib ウィンドウから取得される必要があるためです。

#include <gtk/gtk.h>
#include <gdk/gdkx.h>
#include <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static void destroy(GtkWidget *widget, gpointer data ) {
    gtk_main_quit ();
}

int main(int argc, char** argv) {

    GtkWidget *xwindow;

    //Open the display
    Display *display = XOpenDisplay(NULL);
    int screen = DefaultScreen(display);

    //Create the window
    Window w = XCreateSimpleWindow(display, DefaultRootWindow(display), 0, 0,
    200, 100, 20, black, 10201020);
    XSelectInput(display, w, StructureNotifyMask);
    XMapWindow(display, w);
    GC gc = XCreateGC(display, w, 0, NULL);
    for(;;) {
          XEvent e;
          XNextEvent(display, &e);
          if (e.type == MapNotify)
                break;
    } 
    XDrawString(display, w, gc, 10, 10, "HelloWorld!", 12);
    XDrawLine(display, w, gc, 10, 60, 180, 20);
    XFlush(display);

    //SET UP
    gtk_init (&argc, &argv);

    //xwindow
    xwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    g_signal_connect (xwindow, "destroy",
          G_CALLBACK (destroy), NULL);
    g_signal_connect (xwindow, "destroy",
          G_CALLBACK (print), NULL);
    gtk_widget_realize(xwindow);
    xwindow->window = gdk_window_foreign_new((guint32)w);

    //SET UP
    gtk_widget_show(xwindow);

    gtk_main ();

    return 0;
}
4

1 に答える 1

1

これは単純に、ここでの「描画」が実際に何を意味するのかを誤解しているためだと思います。

Xlib 描画モデルは「ステートフル」ではありません。特定のウィンドウの特定の場所にテキストが描画され、次に線が描画されたことなどを記憶しません。描画は要求するとすぐに行われ、「完了」と見なされます。つまり、プロトコル レベルでは忘れられます。

X ウィンドウを GTK+ ウィジェットでラップすると、X ウィンドウ システムが X ウィンドウの内容を更新しようとする可能性がありますが、何もしないため、最初のグラフィックが失われます。

つまり、必要に応じてウィンドウを再描画する要求に応答できる必要があります。

于 2013-08-14T09:42:34.210 に答える