📖 官方学习网站
👁 Youtube视频学习
直接上案例代码
#include <gtk/gtk.h>
static void load_css(void);
static GtkWidget *create_window(const gint, const gint);
int main(int argc, char *argv[])
{
gtk_init(&argc, &argv);
load_css();
GtkWidget *window;
GtkWidget *frame;
GtkWidget *button;
/// ***创建一个窗口
window = create_window(400, 350);
/// 创建一个frame并带有标签
// frame = gtk_frame_new("Frame");
/// 创建一个不带标签的frame,并使用函数进行设置标签
frame = gtk_frame_new(NULL);
// gtk_frame_set_label(GTK_FRAME(frame), "Frame");
/// 设置标签的位置 x默认为0.0(最左边) y默认为0.5(线的中间)
// gtk_frame_set_label_align(GTK_FRAME(frame), 0.5, 1.0); // 设置为x方向为中间,y方向在线的上方
/// 将标签小部件设置为button
// button = gtk_button_new_with_mnemonic("_Click Me");
button = gtk_button_new_from_icon_name("weather-clear", GTK_ICON_SIZE_DIALOG);
g_object_set(button, "margin", 20, NULL);
// gtk_frame_set_label_widget(GTK_FRAME(frame), button);
///
// gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_NONE);
// gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN);
// gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_OUT);
gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN);
/// 上边的所有设置都可以通过以下函数一并达成
g_object_set(frame,
"label", "Frame",
"label-xalign", 0.5,
"label-yalign", 0.5,
// "label-widget", button,
"shadow-type", GTK_SHADOW_ETCHED_IN,
/// *** 添加GtkContainer的属性
"border-width", 0,
/// *** 这里使用"child"属性将button作为frame的child,而不是part of frame,
/// *** 功能类似gtk_container_add
"child", button,
"parent", window,
NULL);
/// *** 使用"parent"属性来实现一下代码
// gtk_container_add(GTK_CONTAINER(window), frame);
gtk_widget_show_all(window);
gtk_main();
}
static GtkWidget *create_window(const gint w, const gint h)
{
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_window_set_default_size(GTK_WINDOW(window), w, h);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_title(GTK_WINDOW(window), "Hello GTK3");
gtk_container_set_border_width(GTK_CONTAINER(window), 50);
return window;
}
static void load_css(void)
{
GtkCssProvider *provider;
GdkDisplay *display;
GdkScreen *screen;
const char *css_style_file = "style.css";
GFile *css_fp = g_file_new_for_path(css_style_file);
GError *error = 0;
provider = gtk_css_provider_new();
display = gdk_display_get_default();
screen = gdk_display_get_default_screen(display);
gtk_style_context_add_provider_for_screen(screen, GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
gtk_css_provider_load_from_file(provider, css_fp, &error);
g_object_unref(provider);
}
// style.css
window {
background-color: thistle;
}
frame {
background-color: wheat;
padding: 30px;
border:5px solid;
border-color: black;
}
frame > border {
background-color: cadetblue;
border:5px solid;
color: cyan;
}
frame > label {
background-color: green;
color: white;
font-size: 15px;
font-weight: bold;
padding: 30px;
border-radius: 30%;
border:5px solid;
border-color: cornflowerblue;
}
frame > button {
background-color: chartreuse;
}
- 运行结果