私は幸運のない描画領域に画像を描画しようとしています。私はいくつかのPythonの例を見ましたが、私はそれらを私が使用しているCに実装できませんでした(例えばdraw an image to gtk.DrawingArea?)描画領域に画像を描画
描画領域に描画したい画像を格納するためのPixbuf変数を既に作成していますが、gtk_drawing_area_draw_pixbufなどの関数はありません。何か提案がありがとうございます。
私は幸運のない描画領域に画像を描画しようとしています。私はいくつかのPythonの例を見ましたが、私はそれらを私が使用しているCに実装できませんでした(例えばdraw an image to gtk.DrawingArea?)描画領域に画像を描画
描画領域に描画したい画像を格納するためのPixbuf変数を既に作成していますが、gtk_drawing_area_draw_pixbufなどの関数はありません。何か提案がありがとうございます。
描画エリアにpixbufを描画するには、expose-event
コールバック(Gtk + 2.0を使用していると仮定します)を使用する必要があります。代わりにgtk_drawing_area_draw_pixbuf
はありません。gdk_draw_pixbuf
です。バージョン2.22以降はgdk_cairo_set_source_pixbuf
が推奨されていません。あなたはcairo
の使用を加える必要がありますあなたのGtkのバージョンが< 2.22
static gboolean
da_expose (GtkWidget *da, GdkEvent *event, gpointer data)
{
(void)event; (void)data;
GdkPixbuf *pix;
GError *err = NULL;
/* Create pixbuf */
pix = gdk_pixbuf_new_from_file("/usr/share/icons/cab_view.png", &err);
if(err)
{
printf("Error : %s\n", err->message);
g_error_free(err);
return FALSE;
}
GdkDrawable *draw = gtk_widget_get_window(da);
/* Draw pixbuf */
gdk_draw_pixbuf(draw, NULL, pix, 0, 0, 0, 0, -1, -1, GDK_RGB_DITHER_NONE, 0, 0);
return FALSE;
}
ある場合
バージョン以降2.22:あなたは、これらのライン上のイベントコールバックの何かを(目安としてそれらを使用してください)公開でこれらの関数を呼び出すことができますこれらの行に何か:もちろん
static gboolean
da_expose (GtkWidget *da, GdkEvent *event, gpointer data)
{
(void)event; (void)data;
GdkPixbuf *pix;
GError *err = NULL;
/* Create pixbuf */
pix = gdk_pixbuf_new_from_file("/usr/share/icons/cab_view.png", &err);
if(err)
{
printf("Error : %s\n", err->message);
g_error_free(err);
return FALSE;
}
cairo_t *cr;
cr = gdk_cairo_create (da->window);
gdk_cairo_set_source_pixbuf(cr, pix, 0, 0);
cairo_paint(cr);
cairo_fill (cr);
cairo_destroy (cr);
return FALSE;
}
あなたがg_signal_connect
を使用して、コールバックに接続されているだろう(g_signal_connect (da, "expose-event", G_CALLBACK (da_expose), NULL);
を言います)。 Gtk + 3.0を使用している場合はexpose-event
の代わりにdraw
を使用します。 gtk-demo
/gtk3-demo
アプリケーションを参照して、コードとともにサンプルを見ることができます。これはあなたのディストリビューションのパッケージリポジトリで利用できるようにするか、いつでもソースから入手できます。
これが役立つことを願っています!
PS:This linkは、いくつかのポインタを提供するかもしれません。
GTK +バージョンはGTK + 3.0です。 GTK + 3.0を使用している場合は、次のように使用してください。
// gcc expose.c -o expose `pkg-config gtk+-3.0 --cflags --libs`
#include <gtk/gtk.h>
#include <stdlib.h>
static gboolean
on_window_draw (GtkWidget *da, GdkEvent *event, gpointer data)
{
(void)event; (void)data;
GdkPixbuf *pix;
GError *err = NULL;
/* Create pixbuf */
pix = gdk_pixbuf_new_from_file("/usr/share/icons/cab_view.png", &err);
if(err)
{
printf("Error : %s\n", err->message);
g_error_free(err);
return FALSE;
}
cairo_t *cr;
cr = gdk_cairo_create (gtk_widget_get_window(da));
// cr = gdk_cairo_create (da->window);
gdk_cairo_set_source_pixbuf(cr, pix, 0, 0);
cairo_paint(cr);
// cairo_fill (cr);
cairo_destroy (cr);
// return FALSE;
}
int main (int argc, char **argv) {
GtkWidget *window;
GtkWidget *canvas;
gtk_init (&argc , &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_size_request (window,
50, 50);
g_signal_connect (window, "destroy",
G_CALLBACK (gtk_main_quit) , NULL);
canvas = gtk_drawing_area_new();
gtk_container_add (GTK_CONTAINER (window), canvas);
g_signal_connect (canvas, "draw", (GCallback) on_window_draw, NULL);
gtk_widget_set_app_paintable(canvas, TRUE);
gtk_widget_show_all (window);
gtk_main();
return 0;
}
私はあなたに可能な限り100票を与えます!私は「公開イベント」信号を使用していましたが、カイロは必要ではないと推測しました。もう一度 – Rrjrjtlokrthjji
両方の例は機能しません。 – Bitterblue
@ mini-me:申し訳ありませんが、私はかつてこれまで慣れていたようにGtkに積極的に従っていません。あなたは何をしようとしていますか? gtk-demoをチェックしましたか? –