GtkFrame学习记录

📖 官方学习网站
👁 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;
}
  • 运行结果
    在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值