【发布时间】:2019-02-18 18:16:39
【问题描述】:
我正在寻找类似于overflow: hidden 在 GTK 中的 HTML 和 CSS 中所做的事情。
示例
如下图所示,我们有一个有 2 个孩子的盒子,父小部件被 border-radius: 20px 圆角,但由于我们没有向孩子提供 border-radius,它们从父绘图区。
我知道我可以很容易地向孩子们提供border-radius,但它只在这个例子中有效:|假设我们有 100000 个子部件层次结构,所以我正在寻找一种方法来强制孩子尊重他们的父绘图区域。
我认为这在 CSS 中是不可能的,所以我们应该使用 GTK 和 Cairo 来解决这个问题。
感谢您的期待。
生成图像的代码
#include <gtk/gtk.h>
static void
app_activate(GtkApplication *app)
{
GtkWidget *window;
GtkWidget *parentbox;
GtkWidget *childbox1;
GtkWidget *childbox2;
window = gtk_application_window_new(app);
gtk_window_set_default_size(GTK_WINDOW(window), 540, 360);
parentbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 16);
childbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 16);
childbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 16);
GtkStyleContext *parentcontext;
parentcontext = gtk_widget_get_style_context(GTK_WIDGET(parentbox));
gtk_style_context_add_class(GTK_STYLE_CONTEXT(parentcontext), "parentbox");
GtkStyleContext *child1context;
child1context = gtk_widget_get_style_context(GTK_WIDGET(childbox1));
gtk_style_context_add_class(GTK_STYLE_CONTEXT(child1context), "childbox");
GtkStyleContext *child2context;
child2context = gtk_widget_get_style_context(GTK_WIDGET(childbox2));
gtk_style_context_add_class(GTK_STYLE_CONTEXT(child2context), "childbox");
gtk_box_pack_start(GTK_BOX(parentbox), childbox1, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(parentbox), childbox2, TRUE, TRUE, 0);
gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(parentbox));
gtk_widget_show_all(window);
}
int
main(int argc, char *argv[])
{
GtkApplication *app;
int status;
app = gtk_application_new(
"com.myapp",
G_APPLICATION_FLAGS_NONE
);
g_signal_connect(app, "activate", G_CALLBACK(app_activate), NULL);
status = g_application_run(G_APPLICATION(app), argc, argv);
g_object_unref(app);
return status;
}
样式
.parentbox {
margin: 40px;
background-color: rgba(120, 80, 40, 0.5);
border-radius: 20px;
}
.childbox {
background-color: rgba(40, 80, 120, 0.5);
}
【问题讨论】: