![](/img/trans.png)
[英]How to draw a line in a GtkDrawingArea using Cairo with Gtk3
[英]How to draw / render to a widget using the widgets Xid in GTK/Cairo in 'C'
我需要在C
中编写一个GTK
应用程序,它使用Cairo
执行一些动画,它将渲染到另一个正在运行的应用程序中的GTK
小部件中。 我们的想法是使用VLC
和Mplayer
做同样的事情。 例如, Mplayer
有-wid
选项:
-wid(另见-guiwid)(仅限X11,OpenGL和DirectX)这告诉MPlayer附加到现有窗口。 用于在浏览器中嵌入MPlayer(例如插件扩展)。 此选项完全填充给定窗口,因此MPlayer不再处理纵横比缩放,panscan等,但必须由创建窗口的应用程序管理。
使用此Mplayer
选项,您可以使用GTKImage小部件创建GTK应用程序,获取它的Xid,然后使用指定了Xid的Mplayer
在GTK
应用程序中播放电影。
我正在尝试做同样的事情,除了使用Cairo
渲染/绘制到外部窗口。 任何人都有建议或更好的小代码样本?
看看GtkSocket
和GtkPlug
课程。
主程序将创建一个GtkSocket
并且您可以传递给另一个程序的XID
将由函数gtk_socket_get_id()
返回。 然后另一个程序将它用作gtk_plug_new()
函数的参数。 所有渲染都将在这个新的GtkPlug
对象的子GtkPlug
。
更新 :嗯,如果你想......这里是GtkSocket/GtkPlug
的最小例子。 你没有说你是使用GTK + 2还是GTK + 3,所以我假设版本2。
#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;
}
#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
打印,必须作为参数复制/粘贴到client
:
$ ./server
60817441
^Z
[1]+ Stopped ./server
$ bg
$ ./client 60817441
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.