gtk+修改控件文本字体一例
因为家里电脑是Mac系统,所以就拿Mac系统来示范。
要注意的是gtk+2.0和3.0对字体的处理是有一些区别的:
1.后者使用的是pango的机制,我们这里以gtk+3.0为基础。
2.两者调用Font对话框的方法也不一样,前者用gtk_font_selection_dialog_new来建立对话框,还要设置button_ok按钮的回调函数,比较繁琐;后者用gtk_font_chooser_dialog_new建立对话框,可以直接取得字体名称,比较简洁。这里同样以3.0为基础。
下面上代码:
#include <gtk/gtk.h>
#include <string.h>
#define UI_PATH "./entry.ui"
#define MAIN_WINDOW "window"
#define ENTRY "entry"
#define CHK_EDITABLE "chk_editable"
#define CHK_VISIBLE "chk_visible"
static GtkWidget *w;
static GtkWidget *s_entry;
static GtkWidget *s_dialog_font = NULL;
void font_selection_ok(GtkWidget *button,gpointer user_data){
GtkStyle *style;
//GdkFont *font;
//gchar *font_name = gtk_font_selection_dialog_get_font_name(GTK_IS_FONT_SELECTION_DIALOG(s_dialog_font));
//printf("%s:font_name is %s\n",__func__,font_name);
/*
font = gtk_font_selection_dialog_get_font(GTK_IS_FONT_SELECTION_DIALOG(s_dialog_font));
if(font){
style = gtk_style_copy(gtk_widget_get_style(s_entry));
gdk_font_unref(style->font);
style->font = font;
gdk_font_ref(style->font);
gtk_widget_set_style(s_entry,style);
}
*/
}
void font_changed(GtkWidget *self,gpointer user_data){
s_dialog_font = gtk_font_chooser_dialog_new("Font Selection Dialog :)",GTK_WINDOW(w));
gtk_window_set_transient_for(GTK_WINDOW(s_dialog_font),GTK_WINDOW(w));
gtk_window_set_destroy_with_parent(GTK_WINDOW(s_dialog_font),TRUE);
gtk_font_chooser_set_font(GTK_FONT_CHOOSER(s_dialog_font),NULL);
if(gtk_dialog_run(GTK_DIALOG(s_dialog_font)) == GTK_RESPONSE_OK){
gchar *font_name = gtk_font_chooser_get_font(GTK_FONT_CHOOSER(s_dialog_font));
printf("%s:font_name is %s\n",__func__,font_name);
PangoFontDescription *pfd = pango_font_description_from_string(font_name);
//gtk_widget_modify_font(s_entry,pfd);
gtk_widget_override_font(s_entry,pfd);
pango_font_description_free(pfd);
}
gtk_widget_destroy(s_dialog_font);
/*
if(!s_dialog_font){
s_dialog_font = gtk_font_selection_dialog_new("Font Selection Dialog :)");
g_return_if_fail(GTK_IS_FONT_SELECTION_DIALOG(s_dialog_font));
//gtk_window_position(GTK_WINDOW(s_dialog_font),GTK_WIN_POS_MOUSE);
gtk_window_set_position(GTK_WINDOW(s_dialog_font),GTK_WIN_POS_MOUSE);
g_signal_connect(s_dialog_font,"destroy",
G_CALLBACK(gtk_widget_destroyed),&s_dialog_font);
g_signal_connect(gtk_font_selection_dialog_get_ok_button(
GTK_IS_FONT_SELECTION_DIALOG(s_dialog_font)),
"clicked",G_CALLBACK(font_selection_ok),NULL);
g_signal_connect_swapped(gtk_font_selection_dialog_get_cancel_button(
GTK_IS_FONT_SELECTION_DIALOG(s_dialog_font)),
"clicked",G_CALLBACK(gtk_widget_destroy),s_dialog_font);
}
//if(!GTK_WIDGET_VISIBLE(s_dialog_font))
if(!gtk_widget_get_visible(s_dialog_font))
gtk_widget_show(s_dialog_font);
else
gtk_widget_destroy(s_dialog_font);
*/
}
void editable_toggled(GtkWidget *self,GtkEntry *entry){
//gtk_entry_set_editable(entry,GTK_TOGGLE_BUTTON(self)->active);
printf("%s:enter function\n",__func__);
gtk_editable_set_editable((GtkEditable*)entry,gtk_toggle_button_get_active(
GTK_TOGGLE_BUTTON(self)));
}
void visible_toggled(GtkWidget *self,GtkEntry *entry){
//gtk_entry_set_visibility(entry,GTK_TOGGLE_BUTTON(self)->active);
printf("%s:enter function\n",__func__);
gtk_entry_set_visibility(entry,gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(self)));
}
void entry_changed(GtkWidget *self,gpointer user_data){
gchar *text = (gchar*)gtk_entry_get_text(GTK_ENTRY(self));
printf("%s:text is %s\n",__func__,text);
text = g_ascii_strup(text,strlen(text));
gtk_entry_set_text(GTK_ENTRY(self),text);
}
int main(int argc,char **argv){
//GtkWidget *w;
GError *error = NULL;
gtk_init(&argc,&argv);
GtkBuilder *builder = gtk_builder_new();
if(!gtk_builder_add_from_file(builder,UI_PATH,&error)){
g_critical("Couldn't load builder file: %s",error->message);
g_error_free(error);
}
w = GTK_WIDGET(gtk_builder_get_object(builder,MAIN_WINDOW));
if(!w){
g_critical("Widget \"%s\" is missing in file %s",MAIN_WINDOW,UI_PATH);
}
gtk_window_set_title(GTK_WINDOW(w),"clist todo list");
gtk_window_set_default_size(GTK_WINDOW(w),300,100);
gtk_window_set_position(GTK_WINDOW(w),GTK_WIN_POS_CENTER_ALWAYS);
gtk_container_set_border_width(GTK_CONTAINER(w),5);
s_entry = GTK_WIDGET(gtk_builder_get_object(builder,ENTRY));
gtk_builder_connect_signals(builder,NULL);
g_object_unref(builder);
gtk_widget_show_all(w);
gtk_main();
return 0;
}
entry.ui文件:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.18.3 -->
<interface>
<requires lib="gtk+" version="3.12"/>
<object class="GtkWindow" id="window">
<property name="height_request">100</property>
<property name="can_focus">False</property>
<signal name="destroy" handler="gtk_main_quit" swapped="no"/>
<child>
<object class="GtkBox" id="box1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">10</property>
<child>
<object class="GtkGrid" id="grid1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="column_spacing">5</property>
<property name="column_homogeneous">True</property>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">大写化</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_width_chars">50</property>
<property name="shadow_type">etched-out</property>
<property name="progress_pulse_step">0.089999999999999997</property>
<property name="secondary_icon_stock">gtk-help</property>
<property name="secondary_icon_tooltip_markup" translatable="yes">输入文本自动转换为大写</property>
<signal name="changed" handler="entry_changed" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">0</property>
<property name="width">2</property>
</packing>
</child>
<child>
<object class="GtkButton" id="btn_font">
<property name="label">gtk-select-font</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
<signal name="clicked" handler="font_changed" swapped="no"/>
</object>
<packing>
<property name="left_attach">3</property>
<property name="top_attach">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox" id="box2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="homogeneous">True</property>
<child>
<object class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<object class="GtkCheckButton" id="chk_editable">
<property name="label" translatable="yes">Editable</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="xalign">0</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="editable_toggled" object="entry" swapped="no"/>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkAlignment" id="alignment2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<object class="GtkCheckButton" id="chk_visible">
<property name="label" translatable="yes">Visible</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="xalign">0</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="visible_toggled" object="entry" swapped="no"/>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkAlignment" id="alignment3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xscale">0.5</property>
<property name="yscale">0</property>
<child>
<object class="GtkButton" id="btn_ok">
<property name="label" translatable="yes">O K</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="gtk_main_quit" swapped="yes"/>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
运行效果如下:
gtk+修改控件文本字体一例的更多相关文章
- Web控件文本框Reset的功能
在前一篇中<怎样实现Web控件文本框Reset的功能>http://www.cnblogs.com/insus/p/4120889.html Insus.NET只实现了文本框的功能.单个或 ...
- Delphi: 获取控件文本宽度(像素)
为适应多语言,需要对界面控件大小.位置多动态改变,因此需要根据其Caption计算实际像素大小. 找资料未有易用现成的,遂参数其它方法,写以函数处之,代码如下: uses TypInfo; funct ...
- 控件包含代码块(即 <% ... %>),因此无法修改控件集合
错误: “/”应用程序中的服务器错误. 控件包含代码块(即 <% ... %>),因此无法修改控件集合. 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解 ...
- selenium修改控件属性
起因:在进行退出的时候,控件属性显示为不可显示,于是在界面上是不可以点击的,如果想点击这个按钮,只能通过修改控件属性,进行点击 上图看控件,正常来说,点击坐边的用户名,下拉会出现一个logout,退出 ...
- asp.net 中的那些编译错误(1):控件包含代码块(即<% ... %>),因此无法修改控件集合
在编译页面的时候出现:控件包含代码块(即 <% ... %>),因此无法修改控件集合错误 一般原因是: 在<head runat="server">< ...
- WPF编程:textbox控件文本框数据显示最后一行
WPF编程:textbox控件文本框数据显示最后一行 TextBox控件在接收大量数据的时候,滚动条一般在最上方,如何使滚动条随着数据的接收而向下滚动呢?比如有一个TextBox'控件txbRecvD ...
- WPF-学习笔记 动态修改控件Margin的值
原文:WPF-学习笔记 动态修改控件Margin的值 举例说明:动态添加一个TextBox到Grid中,并设置它的Margin: TextBox text = new TextBox(); t_gri ...
- 将字符串映射为Delphi控件名,批量修改控件属性
http://blog.sina.com.cn/s/blog_4dfbd07c01000a81.html 将字符串映射为Delphi控件名,批量修改控件属性 (2007-10-08 14:50:51) ...
- win32 修改Edit控件文本颜色与背景色
#define WM_CTLCOLORMSGBOX 0x0132 #define WM_CTLCOLOREDIT 0x0133 //编辑控件Edit #define WM_CTLCOLORLISTBO ...
随机推荐
- activiti processEngineLifecycleListener使用
1.1.1. 前言 实际开发中,有需求如下: 第一:项目启动部署的时候,我们需要监控activiti 工作流引擎是否真正的已经实例化启动了,这里说的是工作流引擎的启动,不是流程实例的启动,对此要特别说 ...
- [mysql]创建数据库并指定编码
现在用orm比较多,很多mysql表啊都不用自己创建,但是数据库还是要自己创建,记录下sql, 备忘. CREATE DATABASE `mydb` CHARACTER SET utf8 COLLAT ...
- Google Dremel数据模型详解(上)
首先简单介绍一下Dremel是什么,能解决什么问题.第二部分着重讲Dremel的数据模型,即数据结构.第三部分将谈一下在此数据结构上设计的算法. 1 起源 Dremel的数据模型起源于分布式系统的应用 ...
- OpenMP与MPI联合编程
研究一下如何一起使用mpi和openmp 先上程序: #include <stdio.h> #include <stdlib.h> #ifdef _OPENMP #includ ...
- 1.2、Android Studio为新设备创建一个模块
模块为你的应用的源码.资源文件和app level设置(比如AndroidManifest.xml)提供了一个容器.每个模块可以独立的构建.测试和调试. 通过使用模块,Android Studio可以 ...
- String&StringBuilder&StringBuffer总结
一.String的JVM内存分配测试与分析 String a="a"; String b="b"; String c="ab&qu ...
- Cassandra使用pycassa批量导入数据
本周接手了一个Cassandra系统的维护工作,有一项是需要将应用方的数据导入我们维护的Cassandra集群,并且为应用方提供HTTP的方式访问服务.这是我第一次接触KV系统,原来只是走马观花似的看 ...
- UNIX网络编程——TCP 滑动窗口协议
什么是滑动窗口协议? 一图胜千言,看下面的图.简单解释下,发送和接受方都会维护一个数据帧的序列,这个序列被称作窗口.发送方的窗口大小由接受方确定,目的在于控制发送速度,以免接受方的缓存不够大, ...
- 【一天一道LeetCode】#105. Construct Binary Tree from Preorder and Inorder Traversal
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 来源:http ...
- 从Perforce到Git的迁移
公司经过多次兼并.收购之后,开发团队使用的工具自然会出现鱼龙混杂的现象.就拿源代码管理工具来说,我们同时在使用的就有Perforce.Team Foundation.Subversion等.为了节省成 ...