我想通過繼承DrawingArea Widget實現自定義小部件,爲此我需要使用cairo進行繪製。似乎在gtk3中引入了一個名爲「draw」的新信號。如何在小部件內繪製?地圖和實現信號是否應該被忽略?如何繪製子類DrawingArea小部件?
一個簡單的示例代碼將非常有幫助。謝謝。
我想通過繼承DrawingArea Widget實現自定義小部件,爲此我需要使用cairo進行繪製。似乎在gtk3中引入了一個名爲「draw」的新信號。如何在小部件內繪製?地圖和實現信號是否應該被忽略?如何繪製子類DrawingArea小部件?
一個簡單的示例代碼將非常有幫助。謝謝。
簡單地說,你需要重寫,這將提供一個開羅背景下平局信號:
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 +自定義窗口小部件的例子。