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

目录
  • 主要代码
    • 字面量以及数据结构
    • 定义一个回调函数,刷新福字
    • 应用初始化程序
    • 主程序
  • 效果展示

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

主要代码

字面量以及数据结构

#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语言生成福字内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 用python画个敬业福字代码

    目录 前言 海龟画笔的介绍 “福”字源码 结果展示 总结 前言 春节快到了,一年一度的支付宝集五福活动就要来了,阿牛也是突发奇想,看能不能用python的turtle库画个"福"字,试了很久,我的这个“福“”字终于看起来可以了,现将源码分享给大家,拿过去放到python的环境中就可以直接运行哦!嘿嘿嘿!这五福手到擒来啦! 海龟画笔的介绍 海龟绘图是 Python 内置的一个比较有趣的模块,模块名称为 turtle,并且依赖python内置的tkinter模块.它最初源于 20世纪60年

  • 用python写一个福字(附完整代码)

    目录 前言: 一,扫五福活动如此火爆,为何不自己利用编程来生成福字! 二,完整代码 三,总结 前言: 支付宝 2022 集五福活动正式开启 数据显示,过去六年累计参与支付宝集五福的人数已经超过了 7 亿,每 2 个中国人里就有 1 个曾扫福.集福.送福. 一,扫五福活动如此火爆,为何不自己利用编程来生成福字! 首先作品奉上: ①,导入python库 import io from PIL import Image import requests ②,利用爬虫,获取单个汉字 def get_word

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

    目录 主要代码 字面量以及数据结构 定义一个回调函数,刷新福字 应用初始化程序 主程序 效果展示 快新年了,支付宝扫福活动又开始了,每次都要百度找福,这次不想找了,自己写一个程序生成各种字体的福字. 主要代码 字面量以及数据结构 #define FONT_DISPLAY "福" // g_fu_label中的每一个控件都是一个福字 static GtkWidget *g_fu_label[3][3]; // 记录所有的字体family typedef struct { int n_fa

  • Python tkinter库绘制春联和福字的示例详解

    马上要过年了,用 Python 写一副春联&福字送给大家,本文我们主要用到的 Python 库为 tkinter,下面一起来看一下具体实现. 首先,我们创建一个画布,代码实现如下: root=Tk() root.title('新年快乐') canvas=Canvas(root,width=500,height=460,bg='lightsalmon') 看一下效果: 我们接着写上联,主要代码实现如下: for i in range(0,451): canvas.create_rectangle(

  • Go语言基础go build命令用法及示例详解

    目录 go build 一个Go项目在GOPATH下,会有如下三个目录 使用: 注意: go build 1. 用于测试编译多个包或一个main包 2. build命令编译包丢弃非main包编译结果,只是检查是否能够被编译 3. 保留main包编译结果 一个Go项目在GOPATH下,会有如下三个目录 bin存放编译后的可执行文件 pkg存放编译后的包文件 src存放项目源文件 一般,bin和pkg目录可以不创建,go命令会自动创建(如 go install),只需要创建src目录即可. 使用:

  • Go语言学习教程之结构体的示例详解

    目录 前言 可导出的标识符 嵌入字段 提升 标签 结构体与JSON相互转换 结构体转JSON JSON转结构体 练习代码步骤 前言 结构体是一个序列,包含一些被命名的元素,这些被命名的元素称为字段(field),每个字段有一个名字和一个类型. 结构体用得比较多的地方是声明与数据库交互时需要用到的Model类型,以及与JSON数据进行相互转换.(当然,项目中任何需要多种数据结构组合在一起使用的地方,都可以选择用结构体) 代码段1:声明一个待办事项的Model类型: type Todo struct

  • 语言编程花絮内建构建顺序示例详解

    目录 1 构建 顺序 1.1 交叉编译 1.2 设置 2 构建测试支持 1 构建 顺序 依据词法名顺序 当导入一个包,且这个包 定义了 init(), 那么导入时init()将被执行. 具体执行顺序: 全局变量定义时的函数 import 执行导入 -> cont 执行常量 --> var 执行变量 --> 执行初始化 init() --> 执行 main() ----> main import pk1 ---> pk1 const ... import pk2 ---&

  • 对python 生成拼接xml报文的示例详解

    最近临时工作要生成xml报名,通过MQ接口发送.简单小程序. 自增长拼成xml报文 Test_001.py # encoding=utf-8 import time orderId = '' s1= "\n" # for ID in range(1,5): item1 = "<item>" + \ "<orderID>" + str(ID) + "</orderID>" + \ "

  • C语言编程C++旋转字符操作串示例详解

    目录 旋转字符串 字符串左旋 题前认知: 暴力移位: 三步翻转: 判断字符串旋转 题前认知 字符串追加判断 旋转字符串 字符串左旋 实现一个函数,可以左旋字符串中的k个字符. 例如: ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 题前认知: 一个字符串如果就定死了.eg:char arr[]="dfdf"什么的那多没意思,一点都没有人机交互的感觉,(虽然现在人机交互适合个体,不适合集群,但也是比死板的定死字符串舒服) 所以字符串得是我们可输入的,才有可玩性,玩的不

  • Go语言基础切片的创建及初始化示例详解

    目录 概述 语法 一.创建和初始化切片 make 字面量 二.使用切片 赋值和切片 切片增长 遍历切片 总结 总示例 示例一  两个slice是否相等 示例二 两个数字是否包含 概述 切片是一种动态数组 按需自动改变大小 与数组相比,切片的长度可以在运行时修改 语法 一.创建和初始化切片 make 使用内置函数make()创建切片: var slice []type = make([]type, len, cap) //简写: slice := make([]type, len, cap) 字面

  • Go语言基础变量的声明及初始化示例详解

    目录 一.概述 二.声明变量 三.编译器推导类型的格式[一定要赋值] 四.短变量声明并初始化 五.匿名变量--没有名字的变量 六.注意 七.案例 一.概述 变量的功能是存储用户的数据 二.声明变量 Go语言的每一个变量都拥有自己的类型,必须经过声明才能开始用 变量的声明格式: var <变量名称> [变量类型] var a int //声明一个整型类型的变量,可以保存整数数值 var b string //声明一个字符串类型的变量 var c float32 //声明一个32位浮点切片类型的变

  • Go语言基础if条件语句用法及示例详解

    目录 概述 语法 格式规则 概述 条件语句需要开发者通过指定一个或多个条件 并通过测试条件是否为 true 来决定是否执行指定语句 并在条件为 false 的情况再执行另外的语句. 语法 package main func main() { //第一种格式 if 条件表达式 { 语句1 } //第二种格式 if 初始化表达式; 条件表达式 { 语句1 } //第三种格式 if 初始化表达式; 条件表达式 { 语句1 }else{ 语句2 } //第四种格式 if 初始化表达式; 条件表达式 {

随机推荐