欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C语言实现生成新春福字的示例详解

程序员文章站 2022-01-23 10:24:10
目录主要代码字面量以及数据结构定义一个回调函数,刷新福字应用初始化程序主程序效果展示快新年了,支付宝扫福活动又开始了,每次都要百度找福,这次不想找了,自己写一个程序生成各种字体的福字。主要代码字面量以...

快新年了,支付宝扫福活动又开始了,每次都要百度找福,这次不想找了,自己写一个程序生成各种字体的福字。

主要代码

字面量以及数据结构

#define font_display "福"

 // g_fu_label中的每一个控件都是一个福字
static gtkwidget *g_fu_label[3][3];

// 记录所有的字体family
typedef struct {
    int n_faces;
    pangofontface **faces;
}custom_pangofontface_t;

//字体family 的总数
static int n_families=0;

//当前正在使用的family 字体的索引
static int family_id=0;

// 记录每个字体family中的face(字模)
static custom_pangofontface_t *custom_pangofontface;

定义一个回调函数,刷新福字

static void
change_fu_cb(gtkbutton *button , gpointer user_data)
{
    char *markup_fu_str = null;
    
    // 3*3 的矩阵中一共有9个福字,分别设置每个福字的字体
    for(int i=0;i<3;++i)
    {
        for(int j=0;j<3;++j)
        {
    		// 获取当前family中的下一个字模,如果当前family中的字模都是用了,自动更新family_id 指向下一个family
            if(family_id >= n_families) family_id=0;
            if(++face_id >= custom_pangofontface[family_id].n_faces){
                ++family_id;
                if(family_id >= n_families)
                    family_id=0;
                
                face_id = 0;
            }
            
            
            markup_fu_str = g_markup_printf_escaped("<span font-weight=\"bold\" font_desc=\"%s 99\">%s</span>",
                    pango_font_description_to_string(pango_font_face_describe(custom_pangofontface[family_id].faces[0])),
                    font_display);
            
            gtk_label_set_markup(gtk_label(g_fu_label[i][j]),markup_fu_str);
    
            g_free(markup_fu_str);
        }
    }
}

应用初始化程序

static void
activate (gtkapplication* app,
          gpointer user_data)
{
    gtkwidget *window;
    gtkwidget *maingrid;
    gtkwidget *overlay;
    gtkwidget *picture;
	gtkcssprovider *cssprovider;
	const char *cssmaingrid = "grid {background-color:#ed3c43;}";
	const char *cssbutton = "* {background-color:#ff0000;}";
	pangofontmap *pangofontmap;
	gtkwidget *box;
	gtkwidget *button;
	
    window = gtk_application_window_new (app);
    gtk_window_set_title (gtk_window (window), "");
    gtk_window_set_default_size (gtk_window (window), 900, 900);
    
    maingrid = gtk_grid_new();
    gtk_widget_set_hexpand(maingrid,true);
    gtk_widget_set_vexpand(maingrid,true);
    
    box = gtk_box_new(gtk_orientation_vertical,0);
    gtk_widget_set_hexpand(box,true);
    gtk_widget_set_vexpand(box,true);
    gtk_box_append(gtk_box(box),maingrid);
    
    button = gtk_button_new_with_label("换一批");
    gtk_widget_set_hexpand(button,true);
    gtk_widget_set_vexpand(button,true);
    cssprovider = gtk_css_provider_new();
    gtk_css_provider_load_from_data(gtk_css_provider(cssprovider),
                                    cssbutton,
                                    -1);
    gtk_style_context_add_provider(gtk_widget_get_style_context(button),
            gtk_style_provider(cssprovider),
            gtk_style_provider_priority_user);
    gtk_style_context_add_provider(gtk_widget_get_style_context(gtk_widget_get_first_child(button)),
                                   gtk_style_provider(cssprovider),
                                   gtk_style_provider_priority_user);
    g_object_unref(cssprovider);
    g_signal_connect(button,"clicked",g_callback(change_fu_cb),null);
    gtk_box_append(gtk_box(box),button);
    
    gtk_window_set_child(gtk_window(window),box);
    
    cssprovider = gtk_css_provider_new();
    gtk_css_provider_load_from_data(gtk_css_provider(cssprovider),
                                    cssmaingrid,
                                    -1);
    gtk_style_context_add_provider(gtk_widget_get_style_context(maingrid),
            gtk_style_provider(cssprovider),
            gtk_style_provider_priority_user);
    g_object_unref(cssprovider);
    
    
    //获取当前系统中可用的字体 family
    pangofontfamily **families;
    pangofontmap = pango_cairo_font_map_get_default();
    pango_font_map_list_families(pangofontmap,&families,&n_families);
    
    custom_pangofontface = (custom_pangofontface_t *)g_malloc0(n_families*sizeof(custom_pangofontface_t));
    
    for(int i=0;i<n_families;++i)
    {
    	//获取每个字体 family 中可用的face
        pango_font_family_list_faces(families[i],
                &custom_pangofontface[i].faces,
                &custom_pangofontface[i].n_faces);
    }
    g_free(families);
    
    // 初始化每个福字控件
    for(int i=0;i<3;++i)
    {
        for(int j=0;j<3;++j)
        {
            overlay = gtk_overlay_new();
            gtk_widget_set_hexpand(overlay,true);
            gtk_widget_set_vexpand(overlay,true);
            
            // 福字的背景图,需要放在执行程序所在的目录
            picture = gtk_picture_new_for_filename("./fu.png");
            gtk_widget_set_hexpand(picture,true);
            gtk_widget_set_vexpand(picture,true);
            
            g_fu_label[i][j] = gtk_label_new("");
            gtk_widget_set_hexpand(g_fu_label[i][j],true);
            gtk_widget_set_vexpand(g_fu_label[i][j],true);
            
            gtk_overlay_set_child(gtk_overlay(overlay),picture);
            gtk_overlay_add_overlay(gtk_overlay(overlay),g_fu_label[i][j]);
            
            gtk_grid_attach(gtk_grid(maingrid),overlay,i,j,1,1);
        }
    }
    
    //初始化福字
    change_fu_cb(gtk_button(button) , null);
    
    gtk_window_set_resizable(gtk_window(window),false);
    gtk_widget_show (window);
}

主程序

int
main(int argc, char *argv[])
{
    gtkapplication *app;
    int status;

    app = gtk_application_new ("org.gtk.example", g_application_flags_none);
    g_signal_connect (app, "activate", g_callback (activate), null);
    
    status = g_application_run (g_application (app), argc, argv);
    g_object_unref (app);
    
    //释放资源
    for(int i=0;i<n_families;++i){
        g_free(custom_pangofontface[i].faces);
    }
    g_free(custom_pangofontface);

    return status;
}

效果展示

C语言实现生成新春福字的示例详解

到此这篇关于c语言实现生成新春福字的示例详解的文章就介绍到这了,更多相关c语言生成福字内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

相关标签: C语言 福字