我的代码(下面)做了什么:
- 创建一个带有背景色的 XLIB 窗口
- 在窗口上绘制字符串
- 在窗口上画一条线
- 创建一个 GTK+ 窗口
- 通过GDK窗口使GTK+窗口实现XLIB窗口的存在
- 在 GTK+ 窗口中显示 XLIB 窗口的输出
它可以工作并创建一个颜色正确的窗口,但它不会在屏幕上绘制字符串或线条。关于如何让它出现或哪里出错的任何想法?
我不使用 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;
}
最佳答案
我认为这仅仅是因为误解了“绘图”在这里的真正含义。
Xlib 绘图模型不是“有状态的”,它不会记住您的特定窗口已经在特定位置绘制了一些文本,然后是一条线,等等。绘图会在您请求时立即发生,然后被视为“完成”,即在协议(protocol)级别被遗忘。
当您将 X 窗口包装在 GTK+ 小部件中时,它可能会导致 X 窗口系统尝试刷新 X 窗口的内容,但这并没有做任何事情,这就是您的初始图形丢失的原因。
简而言之,您需要能够响应请求以根据需要重绘窗口。
关于c - 使文字和线条出现在 GTK 窗口上...使用 XLIB 和 GDK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18228087/