【问题标题】:Making a GtkButton round制作一个 GtkButton 圆形
【发布时间】:2010-11-18 07:00:38
【问题描述】:

如何让 GtkBtton 变成圆形?

【问题讨论】:

    标签: gtk


    【解决方案1】:

    接受的答案是:

    基础集中没有圆度选项。

    嗯,现在有!见the GTKWidget documentation

    在特殊情况下,可以通过添加 .circular 样式类使按钮变为圆形。

    所以,例如:

    gtk_style_context_add_class (gtk_widget_get_style_context (button),
                                 "circular");
    

    这适用于标准主题 Adwaita 和 HighContrast。

    在 GTK4 中,有convenience functions 以避免必须自己获取StyleContext

    gtk_widget_add_css_class (button, "circular");
    

    以上假设buttonGtkWidget*。相反,如果它是 GtkButton* 或子类,当然只需替换为 GTK_WIDGET (button)

    【讨论】:

      【解决方案2】:

      有几个选项。

      • 调整样式。基本组中没有圆度选项。一些主题引擎可能会提供边框图像规范或圆度,但它并不适用于任何地方。
      • 强制使用您想要的主题。这并不难,您只需加载指定所需主题的 gtkrc 字符串。您需要确保用户拥有该主题或可以接受回退。
      • 子类化按钮并自己绘制。一种方法是将边框和浮雕设置为 0,打包图像,并响应状态更改事件以使用适当的预光照(悬停)图像。另一种方法是重写暴露事件并根据需要绘制按钮。

      【讨论】:

      • 感谢您的建议。你能发布一个在expose事件方法中进行绘图按钮的示例吗?
      • G_DEFINE_TYPE( RButton, rbutton, GTK_TYPE_BUTTON ) static void rbutton_class_init( RButtonClass klass ) { ((GtkWidgetClass)klass)->expose_event = rbutton_expose; }
      • 将 gtk_button_paint 替换为: static gint rbutton_expose (GtkWidget *widget, GdkEventExpose *event) { if(GTK_WIDGET_DRAWABLE (widget)) { GtkWidget *child = GTK_BIN(widget)->child; GtkButton *button = GTK_BUTTON(widget); GtkStateType state_type = GTK_WIDGET_STATE (widget); GtkShadowType shadow_type = button->depressed ? GTK_SHADOW_IN:GTK_SHADOW_OUT; _gtk_button_paint (button, &event->area, state_type, shadow_type, "button", "buttondefault"); if(child) gtk_container_propagate_expose(GTK_CONTAINER(widget), child, event); } 返回假; }
      猜你喜欢
      • 2017-03-04
      • 1970-01-01
      • 1970-01-01
      • 2019-05-07
      • 2020-05-02
      • 1970-01-01
      • 1970-01-01
      • 2013-09-20
      • 1970-01-01
      相关资源
      最近更新 更多