我有一些問題,在這一刻我嘗試使用gtkbin在gtk中創建一個自定義小部件,所以我想知道是否可以繼承gtkbin以及如何做到這一點... 感謝您的幫助。gtkbin似乎沒有從我的gtkwindow頂層部件中獲取事件
0
A
回答
0
我終於設法實現了這一點。以下是想要推導出gtkbin widget
的人的方法。
1)理解小部件的層次結構很重要。
>Hierarchy of widgets:
GtkWidget <- GtkContainer <- GtkBin
如果Gtkcontainer
和GtkBin
不重寫contumize功能GtkWidgetClass->draw
,例如自定義部件類直接從GtkBin
派生將使用默認繪製GtkWidgetClass
的功能。
2)約gtkbin信息:
下載的gtk
和開放gtkwidget.c
,gtkcontainer.c
,gtkwindow.c
的源代碼,並期待在class_init
功能所有這些文件。
在GtkWidgetClass
:
1)我們必須看到的是,部件類沒有實現 「畫圖」 功能:
GtkWidgetClass->draw
2)我們必須看到, ,執行
GtkWidgetClass->get_preferred_width
和GtkWidgetClass_preferred_width_height
總是返回「0」,這是不正確的。我們還看到,
GtkWidgetClass->size_allocate
只爲您想要派生的小部件分配大小,它不需要對自定義小部件的子部件進行計數。
您必須重寫這四個函數才能正常工作。
由於GtkWindow
是一個從GtkBin
直接派生的小部件,我們可以通過查看GtkWindow.c
文件中的相應實現來實現我們的功能並進行一些更改。
這是我實現:
widget_class->get_preferred_width = item_list_get_preferred_width;
widget_class->get_preferred_height = item_list_get_preferred_height;
widget_class->draw = dsn_itemlist_draw;
widget_class->size_allocate = item_list_size_allocate;
void item_list_size_allocate (GtkWidget *widget,
GtkAllocation *allocation)
{
GtkAllocation child_allocation;
GtkWidget *child;
guint border_width;
gtk_widget_set_allocation (widget, allocation);
child = gtk_bin_get_child (GTK_BIN(widget));
if (child && gtk_widget_get_visible (child))
{
border_width = gtk_container_get_border_width (GTK_CONTAINER (widget));
child_allocation.x = border_width;
child_allocation.y = border_width;
child_allocation.width = MAX (1, allocation->width - border_width * 2);
child_allocation.height = MAX (1, allocation->height - border_width * 2);
gtk_widget_size_allocate (child, &child_allocation);
}
}
gboolean dsn_itemlist_draw(GtkWidget *widget, cairo_t *cr)
{
GtkWidget *child;
GtkBin *bin = GTK_BIN(widget);
GtkContainer *container = GTK_CONTAINER(widget);
child = gtk_bin_get_child(bin);
gtk_container_propagate_draw(container, child, cr);
printf("bonnnnnnn\n");
return TRUE;
}
void item_list_get_preferred_width(GtkWidget *widget,
gint *minimum_size,
gint *natural_size)
{
//GtkWindow *window;
GtkWidget *child;
guint border_width;
//window = GTK_WINDOW (widget);
child = gtk_bin_get_child (GTK_BIN (widget)/*(window)*/);
border_width = 0;//gtk_container_get_border_width (GTK_CONTAINER (window));
*minimum_size = border_width * 2;
*natural_size = border_width * 2;
if (child && gtk_widget_get_visible (child))
{
gint child_min, child_nat;
gtk_widget_get_preferred_width (child, &child_min, &child_nat);
*minimum_size += child_min;
*natural_size += child_nat;
}
}
void item_list_get_preferred_height(GtkWidget *widget,
gint *minimum_size,
gint *natural_size)
{
//GtkWindow *window;
GtkWidget *child;
guint border_width;
//window = GTK_WINDOW (widget);
child = gtk_bin_get_child (GTK_BIN (widget)/*(window)*/);
border_width = 0;//gtk_container_get_border_width (GTK_CONTAINER (window));
*minimum_size = border_width * 2;
*natural_size = border_width * 2;
if (child && gtk_widget_get_visible (child))
{
gint child_min, child_nat;
gtk_widget_get_preferred_height (child, &child_min, &child_nat);
*minimum_size += child_min;
*natural_size += child_nat;
}
}
Note:
在init
功能,我們必須告訴gtk
我們widget
不擁有一個窗口(gdkwindow
),但它會通過調用一個繼承從其父控件
gtk_widget_set_has_window(GTK_WIDGET(this_instance),FALSE);
總結...
相關問題
- 1. SqlCacheDependency似乎沒有OnChange事件?
- 2. 事件似乎沒有正確連接
- 3. OverlayLayout似乎沒有分層
- 4. 在我的Firefox擴展中,onUninstalled事件似乎沒有觸發
- 5. onTouch事件似乎
- 6. 'add'事件在取出時似乎沒有觸發
- 7. Python似乎沒有從文本文件中讀取
- 8. 我似乎在從文件
- 9. 的jQuery懸停()事件,我似乎
- 10. H1在Chrome中似乎沒有邊距頂部
- 11. 獲取-PrintConfiguration似乎沒有工作
- 12. 我的應用程序似乎並沒有從UI文件
- 13. OWIN中間件似乎沒有工作
- 14. Jade模板似乎沒有從Express中獲取數據
- 15. 我似乎無法從Pinterest JSON獲取JSON文件
- 16. 我的$ .getJSON似乎沒有從我的JSON文件中檢索信息
- 17. ReadDirectoryChangesW似乎丟失事件
- 18. 我的HTML頁面似乎沒有運行我的JavaScript文件
- 19. jQuery的拖動事件似乎沒有deltaX屬性
- 20. 的ObservableCollection CollectionChanged事件似乎並沒有被解僱 - 爲什麼?
- 21. jQuery的延遲似乎並沒有給這類事件
- 22. java - 獲取似乎是從另一個類分層的內容
- 23. 的Rails似乎沒有隨機部署
- 24. PHPExcel閱讀器似乎沒有在文件中讀取?
- 25. Robomongo似乎沒有更新文件
- 26. Git似乎沒有添加新文件
- 27. 期望條件似乎沒有工作
- 28. 郵件()函數似乎沒有工作
- 29. Vim rails.vim插件似乎沒有工作
- 30. idleTimer插件似乎沒有工作