2017-07-16 71 views
3

我想通過繼承DrawingArea Widget實現自定義小部件,爲此我需要使用cairo進行繪製。似乎在gtk3中引入了一個名爲「draw」的新信號。如何在小部件內繪製?地圖和實現信號是否應該被忽略?如何繪製子類DrawingArea小部件?

一個簡單的示例代碼將非常有幫助。謝謝。

回答

4

簡單地說,你需要重寫,這將提供一個開羅背景下平局信號:

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

然後你可以使用CairoContext cr繪製控件的實際內容。

從C API:

的GtkDrawingArea插件用於創建自定義用戶界面 元素。它本質上是一個空白部件;你可以借鑑它。 創建繪圖區後,應用程序可能想要連接到:

鼠標和按鈕按下信號以響應來自用戶的輸入。 (使用 gtk_widget_add_events()使您希望收到的事件。)

  • 的「實現」信號時,小部件是特定的顯示器上實例採取任何必要的行動。 (創建GDK資源 響應此信號。)

  • 「大小分配」信號在小部件更改大小時採取任何必要的操作。

  • 「draw」信號來處理重畫小部件的內容。

小部件應排隊一些借鑑當小部件的變化,例如,在大小分配,你應該使用gtk_widget_queue_draw迫使小部件itsef再次戰平。

示例 - 使用繪製區域而不是分分級,但這個概念仍然是: (從Gnome C API拍攝)在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); 

你也應該閱讀有關身高換寬度幾何管理

我已經使用了C語言,因爲在你的問題中沒有提及編程語言,同時它是所有其他編寫語言的原始API。

有一些關於在互聯網上創建Gtk +自定義窗口小部件的例子。