标签(GTKLabel) -- GTK开发资料


用过之后,你将会发现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.


2008.11.22修改.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章