服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言实现生成新春福字的示例详解

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

2022-09-03 14:36从善若水 C/C++

这篇文章主要介绍了如何利用C语言实现生成各个字体的新春福字,再也不用担心支付宝扫福找不到图片了,感兴趣的同学可以跟随小编学习一下

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

主要代码

字面量以及数据结构

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#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;

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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);
        }
    }
}

应用初始化程序

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
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);
}

主程序

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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语言生成福字内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_31985307/article/details/122645243

延伸 · 阅读

精彩推荐
  • C/C++VC中LINK 2001 和 LINK 2009 的错误的解决方法

    VC中LINK 2001 和 LINK 2009 的错误的解决方法

    最近将两个开源C++项目编译成windows版本的时候遇到很多问题,编译的时候总是报错,报的最多的是无法解析的外部符号”,经过近3天的折腾总算都通过了...

    薰衣草的旋律6572021-09-28
  • C/C++实例详解C++中指针与引用的区别

    实例详解C++中指针与引用的区别

    引用是C++引入的重要机制(C语言没有引用),它使原来在C中必须用指针来实现的功能有了另一种实现的选择,在书写形式上更为简洁,那么引用的本质是什么...

    ZhiboZhao8722021-11-21
  • C/C++使用C语言操作文件的基本函数整理

    使用C语言操作文件的基本函数整理

    这篇文章主要介绍了使用C语言操作文件的基本函数整理,包括创建和打开以及关闭文件的操作方法,需要的朋友可以参考下...

    C语言教程网9932021-03-09
  • C/C++C++实现LeetCode(161.一个编辑距离)

    C++实现LeetCode(161.一个编辑距离)

    这篇文章主要介绍了C++实现LeetCode(161.一个编辑距离),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    Grandyang3762021-12-08
  • C/C++C语言 联合(union)用法案例详解

    C语言 联合(union)用法案例详解

    这篇文章主要介绍了C语言 联合(union)用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    时光漫走6152021-12-23
  • C/C++C++继承的定义与注意事项

    C++继承的定义与注意事项

    这篇文章主要给大家介绍了关于C++继承的定义与注意事项的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值...

    程序字母K4612021-11-05
  • C/C++C++调用Go方法的字符串传递问题及解决方案

    C++调用Go方法的字符串传递问题及解决方案

    这篇文章主要介绍了C++调用Go方法的字符串传递问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需...

    华为云开发者社区10182021-10-06
  • C/C++c++容器list、vector、map、set区别与用法详解

    c++容器list、vector、map、set区别与用法详解

    这篇文章主要介绍了c++容器list、vector、map、set区别与用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    潘雪雯10212021-09-08