gpt4 book ai didi

c - 如何在 'C' 中使用 GTK/Cairo 中的小部件 Xid 绘制/渲染到小部件

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:40:50 27 4
gpt4 key购买 nike

我需要用 C 编写一个 GTK 应用程序,它使用 Cairo 制作一些动画,然后渲染成 GTK 存在于另一个正在运行的应用程序中的小部件。这个想法是做与 VLCMplayer 相同的事情。例如 Mplayer-wid 选项:

-wid (also see -guiwid) (X11, OpenGL and DirectX only) This tells MPlayer to attach to an existing window. Useful to embed MPlayer in a browser (e.g. the plugger extension). This option fills the given window completely, thus aspect scaling, panscan, etc are no longer handled by MPlayer but must be managed by the application that created the window.

使用这个 Mplayer 选项,您可以使用 GTKImage 小部件创建 GTK 应用程序,获取它的 Xid,然后使用 Mplayer< 在 GTK 应用程序中播放电影 带有指定的 Xid。

除了使用 Cairo 渲染/绘制到外部窗口外,我正在尝试做同样的事情。有人有建议或更好的小代码示例吗?

最佳答案

查看 GtkSocketGtkPlug 类。

主程序将创建一个GtkSocket,您可以传递给其他程序的XID 将由函数gtk_socket_get_id() 返回.然后其他程序将使用它作为 gtk_plug_new() 函数的参数。所有渲染都将在这个新的 GtkPlug 对象的子对象中完成。

更新:好吧,如果你想...这是GtkSocket/GtkPlug 的一个最小示例。你没有说你使用的是 GTK+2 还是 GTK+3,所以我假设是版本 2。

服务器.c:

#include <gtk/gtk.h>

int main(int argc, char **argv)
{
gtk_init(&argc, &argv);

GtkWidget *wnd = gtk_window_new(GTK_WINDOW_TOPLEVEL);
GtkWidget *sck = gtk_socket_new();
gtk_container_add(GTK_CONTAINER(wnd), sck);
gtk_window_set_default_size(GTK_WINDOW(wnd), 400, 300);
gtk_widget_show_all(wnd);

GdkNativeWindow nwnd = gtk_socket_get_id(GTK_SOCKET(sck));
g_print("%lu\n", nwnd);

gtk_main();
return 0;
}

客户端.c:

#include <stdlib.h>
#include <gtk/gtk.h>
#include <cairo/cairo.h>
#include <math.h>

gboolean OnDraw(GtkWidget *w, GdkEvent *ev, gpointer data)
{
GtkAllocation size;
gtk_widget_get_allocation(w, &size);

cairo_t *cr = gdk_cairo_create(gtk_widget_get_window(w));
cairo_set_source_rgb(cr, 1, 0, 0);
cairo_arc(cr, size.width/2, size.height/2, size.height/2, 0, 2*M_PI);
cairo_fill(cr);
cairo_destroy(cr);
return TRUE;
}

int main(int argc, char **argv)
{
gtk_init(&argc, &argv);

GdkNativeWindow nwnd = strtoul(argv[1], NULL, 10);

GtkWidget *plug = gtk_plug_new(nwnd);
GtkWidget *canvas = gtk_drawing_area_new();
gtk_container_add(GTK_CONTAINER(plug), canvas);
g_signal_connect(canvas, "expose-event", (GCallback)OnDraw, NULL);
gtk_widget_show_all(plug);

gtk_main();
return 0;
}

要使用的 XID 由服务器打印,必须作为参数复制/粘贴到客户端:

$ ./server
60817441
^Z
[1]+ Stopped ./server
$ bg
$ ./client 60817441

关于c - 如何在 'C' 中使用 GTK/Cairo 中的小部件 Xid 绘制/渲染到小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11142520/

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