2017-07-16 17 views
3

DrawingAreaウィジェットをサブクラス化してカスタムウィジェットを実装したいと思っています。このためには、カイロを使用して描画する必要があります。 gtk3のように、 'draw'という新しいシグナルが導入されたようです。ウィジェットはどのように描画しますか?マップと信号もまたオーバーライドする必要がありますか?サブクラス化されたDrawingAreaウィジェットを描画するには?

単純なコード例が非常に役に立ちます。ありがとう。そして、あなたは、ウィジェットの実際の内容を描画するCairoContext crを使用することができます

gboolean 
user_function (GtkWidget *widget, 
       CairoContext *cr, 
       gpointer  user_data) 

答えて

4

簡単に言えば、あなたはカイロのコンテキストを提供します引き分け信号をオーバーライドする必要があります。 C APIから

GtkDrawingAreaウィジェットはカスタムユーザーインターフェイスに 要素を作成するために使用されます。基本的に空白のウィジェットです。あなたはそれを描くことができます。 描画領域を作成した後、アプリケーションは次の場所に接続したいことがあります。

ユーザーからの入力に応答するためのマウスとボタンの押下信号。 (あなたが受け取りたいイベントを有効にする gtk_widget_add_events()を使用してください。)

  • 「実現」信号をウィジェットが特定のディスプレイ上でインスタンス化されるときに必要なアクションを取ること。

  • ウィジェットのサイズが変更されたときに必要なアクションを実行するための「サイズ割り当て」信号。

  • ウィジェットの内容を再描画するための "draw"シグナル。ウィジェットの変更は、例えば、サイズに再度itsef描画するウィジェットを強制的にgtk_widget_queue_drawを使用する必要があります割り当てる際に一部をキューに入れる必要があります

ウィジェットを描画します。

例 - 描画領域を使用していないサブとしてそれをクラス分けが、コンセプトが残る: はGtkWidget

gboolean 
draw_callback (GtkWidget *widget, cairo_t *cr, gpointer data) 
{ 
    guint width, height; 
    GdkRGBA color; 
    GtkStyleContext *context; 

    context = gtk_widget_get_style_context (widget); 

    width = gtk_widget_get_allocated_width (widget); 
    height = gtk_widget_get_allocated_height (widget); 

    gtk_render_background (context, cr, 0, 0, width, height); 

    cairo_arc (cr, 
      width/2.0, height/2.0, 
      MIN (width, height)/2.0, 
      0, 2 * G_PI); 

    gtk_style_context_get_color (context, 
           gtk_style_context_get_state (context), 
           &color); 
    gdk_cairo_set_source_rgba (cr, &color); 

    cairo_fill (cr); 

return FALSE; 
} 
[...] 
    GtkWidget *drawing_area = gtk_drawing_area_new(); 
    gtk_widget_set_size_request (drawing_area, 100, 100); 
    g_signal_connect (G_OBJECT (drawing_area), "draw", 
        G_CALLBACK (draw_callback), NULL); 

あなたはまた、高さ - のための幅のジオメトリ管理についてお読みください(Gnome C APIから撮影)

私はあなたの質問にプログラミング言語への参照がなく、同時に他のすべてが書かれている元のAPIなので、Cを使用しました。

インターネット上にGtk +カスタムウィジェットを作成する例がいくつかあります。

関連する問題