GTK里的label控件 颜色 大小 等

http://blog.csdn.net/tresss/archive/2009/01/08/3731853.aspx

 

 

用过之后,你将会发现GTK里的label控件比windows系统的label功能强大很多,很多.
与此同时,使用起来感觉也麻烦很多.

首先,在hello world的基础上添加一点代码.

#include <gtk/gtk.h>

void destroy (GtkWidget *widget, gpointer *data)
{
gtk_main_quit ();
}

int main(int argc, char *argv[])
{
GtkWidget *frmMain, *lblTest;

gtk_init (&argc, &argv);

frmMain = gtk_window_new (GTK_WINDOW_TOPLEVEL);

gtk_signal_connect (GTK_OBJECT (frmMain), "destroy",GTK_SIGNAL_FUNC (destroy), NULL);

gtk_container_border_width (GTK_CONTAINER (frmMain), 10);

lblTest = gtk_label_new("label for test!");
gtk_container_add(GTK_CONTAINER(frmMain), lblTest);

gtk_widget_show (frmMain);
gtk_widget_show(lblTest);

gtk_main ();

return 0;
}

这里,添加了一个GtkWidget变量 *lblTest;
就是我们的label.
然后lblTest = gtk_label_new("label for test!");
这里就相当于Windows编程中的create,创建了一个TLabel,当然这里是GtkLabel.参数就是lable的Caption
然后gtk_container_add(GTK_CONTAINER(frmMain), lblTest);
这里相当于Windows编程中的setparent,将这个label置于一个交窗口中,否则它不知道应该显示在哪里.
最后多了一行gtk_widget_show(lblTest);
与gtk_widget_show (frmMain);一样,相当于WIndows中的setVisible(*,TRUE);有了此句,才会显示出此控件.

*排版;
1.长度.
这里的label控件大多没有类似vc,delphi中setwidth,setheight的方法.
甚至Label这里基本没有width,height这个属性。
要改变宽度只有一个方法gtk_label_set_width_chars(GTK_LABEL(lblTest), 20);
设定label可以显示多少个字符,从而调整label的长度.
如果你做过java,则不用急于了解这些,因为gtk的排版与java类似,后面会有介绍.
2.对齐.
对齐的方法应该是gtk_label_set_justify(GTK_LABEL(lblTest), GTK_JUSTIFY_LEFT);
但我试了一下不起作用,这里介绍一个更强大的对齐方法.
gtk_misc_set_alignment(GTK_MISC(lblTest), 1, 0);
第一个参数是lblTest,第二个参数是左右方向的对齐值,第三个参数是上下方向的对齐值;
对齐值的取值范围为0-1.取0时,为左对齐,取1时,为右对齐,取0.5时,为中间对齐.
当然,你也可以取0.3,0.8试一下.这可是我从来没见过的对齐方式.
*其它属性;
1.可选.
windows中标准label是不可以做任何操作的,这里可以给label做一个可选设定,用户可以用鼠标选择并进行复制等操作.
gtk_label_set_selectable (GTK_LABEL(lblTest), TRUE); 2.字体,大小,颜色.
这里的设置比较麻烦一点,GTKLABEL本身并没有提供直接的方法来操作这些属性,其它库的操作方法见后面补充。
而是提供了一种类似html浏览器的方法,需要在代码中设定.
如:

gtk_label_set_markup(GTK_LABEL(lblTest),
"<span foreground='red' underline='double' underline_color='blue' font_desc='32'>label for test!</span>");

这里的<span>标签就是用来操作label显示的属性的,包括背景色,字体色,字体,字体大小,下划线,等等.
其中foreground='red' 就是定义前景色(字体颜色)为红色,也可以foreground='#00FF00',这两个值是相等的.
underline='double' 是下划线为双线,还可以设值为'none', 'single', 'double', 'low', 'error' 等.
underline_color='blue' 是下划线的颜色.
此外,还可以选的属性有:
font_desc 字体大小,值如'12',官方文档说明为字体描述,但我测试结果为字体大小
size 官方文档为字体大小,但我测试结果不起作用.
stype 样式,值如'normal', 'oblique', 'italic' 等.
weight 字型,值如'ultralight', 'light', 'normal', 'bold', 'ultrabold'等
stretch 拉伸,值如'ultracondensed', 'extracondensed', 'condensed', 'semicondensed', 'normal', 'semiexpanded', 'expanded', 'extraexpanded', 'ultraexpanded'
属性值不一一列出,你可以参考安装时程序携带的文档,相对位置为"share/gtk-doc/html/pango/PangoMarkupFormat.html"
注意:官方文档中有好多错误,可以参考但不可全信.
主要内容如下:

The root tag of a marked-up document is <markup>, but pango_parse_markup() allows you to
omit this tag, so you will most likely never need to use it. The most
general markup tag is <span>, then there are some convenience
tags. <span> has the following attributes:



<span> attributes


font_desc


A font description string, such as "Sans Italic 12". See
pango_font_description_from_string()
for a description of the format of the string representation . Note that any
other span attributes will override this description. So if you have
"Sans Italic" and also a style="normal" attribute, you will get Sans normal,
not italic.

font_family


A font family name

face


Synonym for font_family

size


Font size in 1024ths of a point, or one of the absolute sizes
'xx-small', 'x-small', 'small', 'medium', 'large', 'x-large',
'xx-large', or one of the relative sizes 'smaller' or 'larger'.
If you want to specify a absolute size, it's usually easier
to take advantage of the ability to specify a partial
font description using 'font_desc'; you can use
font_desc='12.5' rather than
size='12800'.

style


One of 'normal', 'oblique', 'italic'

weight


One of 'ultralight', 'light', 'normal', 'bold', 'ultrabold', 'heavy',
or a numeric weight

variant


'normal' or 'smallcaps'

stretch



One of 'ultracondensed', 'extracondensed', 'condensed',
'semicondensed', 'normal', 'semiexpanded', 'expanded',
'extraexpanded', 'ultraexpanded'

foreground


An RGB color specification such as '#00FF00' or a color name such as
'red'

background


An RGB color specification such as '#00FF00' or a color name such as
'red'

underline


One of 'none', 'single', 'double', 'low', 'error'

underline_color


The color of underlines; an RGB color specification such as '#00FF00'
or a color name such as 'red'

rise


Vertical displacement, in 10000ths of an em. Can be negative for
subscript, positive for superscript.

strikethrough


'true' or 'false' whether to strike through the text

strikethrough_color


The color of strikethrough lines; an RGB color specification such as
'#00FF00' or a color name such as 'red'

fallback


'true' or 'false' whether to enable fallback. If disabled, then characters
will only be used from the closest matching font on the system. No fallback
will be done to other fonts on the system that might contain the characters
in the text. Fallback is enabled by default. Most applications should not
disable fallback.

lang


A language code, indicating the text language

letter_spacing


Inter-letter spacing in 1024ths of a point.

gravity


One of 'south', 'east', 'north', 'west', 'auto'.

gravity_hint


One of 'natural', 'strong', 'line'.




The following convenience tags are provided:


Convenience tags


b


Bold

big


Makes font relatively larger, equivalent to <span size="larger">

i


Italic

s


Strikethrough

sub


Subscript

sup


Superscript

small


Makes font relatively smaller, equivalent to <span size="smaller">

tt


Monospace font

u


Underline



整体看起来这个label就像是一个特定功能的webBrowse.
尽管功能比较强大,但给我们动态控制label属性带来很大的麻烦.

*事件
GtkLabel提供了三个事件:move_cursor,copy_clipboard, populate_popup.
第一个事件为光标移动事件。第二个是内容被复制.
第一个我测试了好长时间,没有触发,而且头文件中函数原型与官方文档定义不符.
第二个测试成功,当我选择label中内容并复制后,窗体的标题被修改.

总代码如下:

#include <gtk/gtk.h>

GtkWidget *frmMain;

void destroy (GtkWidget *widget, gpointer *data)
{
gtk_main_quit ();
}
void lblStrCopy (GtkLabel *label) {
gtk_window_set_title (GTK_WINDOW (frmMain), "Hello GKT+");
}
int main(int argc, char *argv[])
{
GtkWidget *lblTest;

gtk_init (&argc, &argv);

frmMain = gtk_window_new (GTK_WINDOW_TOPLEVEL);

gtk_signal_connect (GTK_OBJECT (frmMain), "destroy",GTK_SIGNAL_FUNC (destroy), NULL);

gtk_container_border_width (GTK_CONTAINER (frmMain), 10);
//Label about
lblTest = gtk_label_new("label for test!");
gtk_container_add(GTK_CONTAINER(frmMain), lblTest);
gtk_label_set_width_chars(GTK_LABEL(lblTest),30);
gtk_misc_set_alignment(GTK_MISC(lblTest), 1, 0);
gtk_label_set_selectable (GTK_LABEL(lblTest), TRUE);
gtk_label_set_markup(GTK_LABEL(lblTest),
"label for test!");

gtk_signal_connect (GTK_OBJECT (lblTest), "copy_clipboard",GTK_SIGNAL_FUNC (lblStrCopy), NULL);

gtk_widget_show (frmMain);
gtk_widget_show(lblTest);

gtk_main ();

return 0;
}




补充:
良久之后,才发现,原来可以用pango和gdk库来操作label的颜色,字体,大小等.
其实不仅仅是label,其它的一些gtk控件也可以用同样的方法操作.
看代码:

#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <pango/pango.h>

GtkWidget *frmMain;

void destroy (GtkWidget *widget, gpointer *data)
{
gtk_main_quit ();
}

int main(int argc, char *argv[])
{
GtkWidget *lbl1;

gtk_init (&argc, &argv);

frmMain = gtk_window_new (GTK_WINDOW_TOPLEVEL);

gtk_signal_connect (GTK_OBJECT (frmMain), "destroy",GTK_SIGNAL_FUNC (destroy), NULL);
gtk_container_border_width (GTK_CONTAINER (frmMain), 10);
//button Create;
lbl1 = gtk_label_new("Quit");
gtk_container_add(GTK_CONTAINER(frmMain), lbl1);

GdkColor color1;
gdk_color_parse ("red", &color1);
gtk_widget_modify_fg(lbl1, GTK_STATE_NORMAL, &color1);

PangoFontDescription *font1 = pango_font_description_from_string("Sans");
pango_font_description_set_size (font1, 25 * PANGO_SCALE);
gtk_widget_modify_font (lbl1, font1);

//Show everything;
gtk_widget_show (frmMain);
gtk_widget_show (lbl1);

gtk_main ();

return 0;
}



比之前多引用了两个头文件:gdk和pango.
用gtk_widget_modify_fg函数来改变控件的前景色,用gtk_widget_modify_font来改变控件的字体(包含字体大小).
当然,在makefile中别忘了也要加上这两个库文件:gdk-win32-2.0.lib和pango-1.0.lib.

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GtkButton是GTK+图形用户界面工具包中的一个控件,它是一个带有标签的按钮,用户可以单击它来触发相应的操作。GtkButton可以用于创建各种类型的按钮,例如命令按钮、选项按钮、切换按钮等。 GtkButton的常用属性包括: - label:按钮上显示的文本。 - image:按钮上显示的图像。 - relief:按钮的边框样式。 - default:指定按钮是否为默认按钮。 - sensitive:指定按钮是否可用。 - visible:指定按钮是否可见。 GtkButton还可以设置回调函数,当用户单击按钮时,回调函数会被调用,这样可以执行相应的操作。例如,可以将一个GtkButton连接到一个GtkEntry控件,当用户单击按钮时,将GtkEntry中的文本清空。 下面是一个简单的示例程序,演示了如何创建一个GtkButton控件: ```c #include <gtk/gtk.h> void button_clicked(GtkWidget *widget, gpointer data) { g_print("Hello, World!\n"); } int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *button; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); button = gtk_button_new_with_label("Click me!"); g_signal_connect(button, "clicked", G_CALLBACK(button_clicked), NULL); gtk_container_add(GTK_CONTAINER(window), button); gtk_widget_show_all(window); gtk_main(); return 0; } ``` 该程序创建了一个包含一个GtkButton控件的窗口。当用户单击按钮时,将在控制台上打印"Hello, World!"。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值