私はここで少し気になりません。GtkDrawingArea - 描画可能にするにはどうすればいいですか?
私はカイロを使用してGTKフォームに簡単なグラフィックを描こうとしています。 IA__gdk_cairo_create:
#include <stdio.h>
#include <gtk/gtk.h>
#include <cairo.h>
GtkWidget* window;
GtkWidget* darea;
int main(int argc, char **argv)
{
gtk_init(&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(window), 390, 240);
darea = gtk_drawing_area_new();
gtk_container_add(GTK_CONTAINER(window), darea);
cairo_t *cr;
cr = gdk_cairo_create(darea->window);
cairo_rectangle(cr, 0, 0, 100, 100);
cairo_fill(cr);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
これは
に失敗しました。私は tutorial hereGDK-CRITICAL **コンパイルしますが、私に与えアサーション `GDK_IS_DRAWABLE (描画可能)」がセグメンテーション違反が続く
で見てきた
だから私は、次のように、私のコードを変更カイロコールが公開するイベントの内部で発生しました。
#include <stdio.h>
#include <gtk/gtk.h>
#include <cairo.h>
GtkWidget* window;
GtkWidget* darea;
static gboolean
on_expose_event(GtkWidget *widget,
GdkEventExpose *event,
gpointer data)
{
cairo_t *cr;
cr = gdk_cairo_create(darea->window);
cairo_rectangle(cr, 0, 0, 100, 100);
cairo_fill(cr);
}
int main(int argc, char **argv)
{
gtk_init(&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(window), 390, 240);
darea = gtk_drawing_area_new();
gtk_container_add(GTK_CONTAINER(window), darea);
g_signal_connect(darea, "expose-event",
G_CALLBACK(on_expose_event), NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
なぜこれが解決されますか? 私の理解では、再:公開です:
g_signal_connect(darea, "expose-event", G_GCALLBACK(on_expose_event), NULL);
プログラム、「公開するイベントがDAREAに発生したとき、その後、on_expose_event呼び出し」を伝えます。 nullは、使用する関数の追加情報の構造体へのポインタを渡すことができる場所です。
と
static gboolean
on_expose_event(GtkWidget *widget,
GdkEventExpose *event,
gpointer data)
{
は、それが公開するイベントだからon_expose_eventこの場合andin、イベントはに起こったことをウィジェットへのポインタが渡されることを公開するイベントに関する情報を含む構造体へのポインタを意味し、追加したい他の情報へのポインタへのポインタ。あなたがgdk_cairo_create
を呼び出すとき
私たちのフォームには2つのボタンがあり、1つは描画エリアに赤い円を描画し、もう1つは青い四角形を描きます。 これを行う方法です - 各ボタンクリックイベントは 'mode'変数を変更し、gtk_widget_queue_draw()を呼び出し、expose_eventsはモードが何であるかによって描画するものを決定します。 サンプルコード:http://pastebin.com/7ZvwcCXb – dwjohnston
はい、それは私に聞こえます。 – ptomato
昔は何かをダブルバッファーにするか、アンダーを使って設定することができましたが、それは何とかGTKで可能です。ウィンドウをピクスマップにコピーして、必要に応じてコピーすることもできます。しかし、XLibとMotifで何かを描き、それを覆い隠すと、私の描くものは元に戻りません。 –