您的位置:首页 > 其它

学习使用GTK+ 4.GTK+常用物件及API(窗口)

2010-12-30 16:28 411 查看

学习使用GTK+ 4.GTK+常用物件及API(窗口)

最后的叶子

学习使用GTK+
系列的第 5 篇 (本系列共6篇)

学习使用GTK+

学习使用GTK+ 0.概述

学习使用GTK+ 1.构建GTK+编译环境

学习使用GTK+ 2.GTK+“Hello World”——对GTK+运作机制的通俗介绍

学习使用GTK+ 3.使用GtkBuilder、界面设计器Glade和其他GTK+组件

学习使用GTK+ 4.GTK+常用物件及API(窗口)

学习使用GTK+ 5.GTK+常用物件及API(文本)

这一部分内容介绍有关GTK+常用窗口类物件的一些函数。如果对内容有疑问,请在下方留言,谢谢!

GTK+的窗口

窗口是GTK+最基本的物件之一,物件要被放在窗口里显示。GTK+里,常用的窗口包括顶级窗口(GtkWindow)、对话框(GtkDialog)和消息对话框(GtkMessageDialog)等。

GTK+有关窗口的操作很多,绝大多数情况下可以满足自定义窗口的需求;但有时候还是不可避免要直接访问底层库GDK。要注意的
是,GdkWindow与GtkWindow有很大差异,GdkWindow指一个显示区域,每一个可显示的GTK+物件都对应一个GdkWindow,
阅读文档时两者不可混淆。

窗口类物件在Glade中得到了良好的支持,复杂的窗口建议直接用Glade创建。

简易消息对话框

消息对话框是最简易的窗口,如果还在Glade中创建的话,很麻烦且会使Glade文件变得更大。下面这些函数,可以快速创建一个窗口而不需要Glade。

void
gtk_show_info(
gpointer window,
const
gchar*
message,
const
gchar*
title)

{

GtkWidget *
dialog;

dialog =
gtk_message_dialog_new_with_markup(
window,

GTK_DIALOG_DESTROY_WITH_PARENT,

GTK_MESSAGE_INFO,

GTK_BUTTONS_OK,

message)
;

gtk_window_set_title(
GTK_WINDOW(
dialog)
,
title)
;

gtk_dialog_run(
GTK_DIALOG(
dialog)
)
;

gtk_widget_destroy(
GTK_WIDGET(
dialog)
)
;

}

void
gtk_show_error(
gpointer window,
const
gchar*
message,
const
gchar*
title)

{

GtkWidget *
dialog;

dialog =
gtk_message_dialog_new_with_markup(
window,

GTK_DIALOG_DESTROY_WITH_PARENT,

GTK_MESSAGE_ERROR,

GTK_BUTTONS_OK,

message)
;

gtk_window_set_title(
GTK_WINDOW(
dialog)
,
title)
;

gtk_dialog_run(
GTK_DIALOG(
dialog)
)
;

gtk_widget_destroy(
dialog)
;

}

gint gtk_show_question(
gpointer window,
const
gchar*
message,
const
gchar*
title)

{

gint i;

GtkWidget *
dialog;

dialog =
gtk_message_dialog_new_with_markup(
window,

GTK_DIALOG_DESTROY_WITH_PARENT,

GTK_MESSAGE_QUESTION,

GTK_BUTTONS_YES_NO,

message)
;

gtk_window_set_title(
GTK_WINDOW(
dialog)
,
title)
;

i=
gtk_dialog_run(
GTK_DIALOG(
dialog)
)
;

gtk_widget_destroy(
dialog)
;

if
(
i==
GTK_RESPONSE_YES)

return
1
;

else

return
0
;

}

void
gtk_show_warning(
gpointer window,
const
gchar*
message,
const
gchar*
title)

{

GtkWidget *
dialog;

dialog =
gtk_message_dialog_new_with_markup(
window,

GTK_DIALOG_DESTROY_WITH_PARENT,

GTK_MESSAGE_WARNING,

GTK_BUTTONS_OK,

message)
;

gtk_window_set_title(
GTK_WINDOW(
dialog)
,
title)
;

gtk_dialog_run(
GTK_DIALOG(
dialog)
)
;

gtk_widget_destroy(
dialog)
;

}

以上四个函数分别是一个信息窗口、错误提示窗口、询问窗口、警告窗口,三个参数分别是母窗口、窗口内文字内容、窗口标题。在程序中直接调用函数即可。

文件选择对话框

文件选择对话框同样可以不用Glade创建,而直接调用API方便地创建。下面的函数可以创建文件打开对话框和文件保存对话框。

GtkWidget*
gtk_show_file_add_filter(
GtkWidget*
dialog,
const
gchar *
description,
gchar *
pattern)

{

GtkWidget *
filter;

filter=
GTK_WIDGET(
gtk_file_filter_new(
)
)
;

gtk_file_filter_set_name(
GTK_FILE_FILTER(
filter)
,
description)
;

gtk_file_filter_add_pattern(
GTK_FILE_FILTER(
filter)
,
pattern)
;

gtk_file_chooser_add_filter(
GTK_FILE_CHOOSER(
dialog)
,
GTK_FILE_FILTER(
filter)
)
;

return
filter;

}

gchar*
gtk_show_file_open(
GtkWidget*
parent_window,
const
gchar *
title,
const
gchar *
filters)

{

GtkWidget *
dialog,*
FF[
16
]
;

gchar *
filename,
des[
256
]
,
pattern[
64
]
;

long
i,
j,
FFc=
0
;

dialog =
gtk_file_chooser_dialog_new (
title,

GTK_WINDOW(
parent_window)
,

GTK_FILE_CHOOSER_ACTION_OPEN,

/*GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,*/

GTK_STOCK_OPEN,
GTK_RESPONSE_ACCEPT,

NULL)
;

//filters

for
(
i=
0
;
i<
strlen(
filters)
;
i++
)

{

j=
0
;

while
(
i<
strlen(
filters)
&&
filters[
i]
!=
'|'
)

des[
j++
]
=
filters[
i++
]
;

if
(
j>=
256
)
break
;

des[
j]
=
0
;

j=
0
;

i++;

if
(
i>=
strlen(
filters)
)
break
;

while
(
i<
strlen(
filters)
&&
filters[
i]
!=
'|'
)

pattern[
j++
]
=
filters[
i++
]
;

if
(
j>=
64
)
break
;

pattern[
j]
=
0
;

FF[
FFc++
]
=
gtk_show_file_add_filter(
dialog,
des,
pattern)
;

if
(
FFc>=
16
)
break
;

}

if
(
gtk_dialog_run (
GTK_DIALOG (
dialog)
)
==
GTK_RESPONSE_ACCEPT)

{

filename =
gtk_file_chooser_get_filename (
GTK_FILE_CHOOSER (
dialog)
)
;

gtk_object_destroy(
GTK_OBJECT(
dialog)
)
;

return
filename;

}

return
NULL;

}

gchar*
gtk_show_file_save(
GtkWidget*
parent_window,
const
gchar *
title,
const
gchar *
default_folder,
const
gchar *
default_name,
const
gchar *
filters)

{

GtkWidget *
dialog,*
FF[
16
]
;

gchar *
filename,
des[
256
]
,
pattern[
64
]
;

long
i,
j,
FFc=
0
;

dialog =
gtk_file_chooser_dialog_new (
title,

GTK_WINDOW(
parent_window)
,

GTK_FILE_CHOOSER_ACTION_SAVE,

/*GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,*/

GTK_STOCK_SAVE,
GTK_RESPONSE_ACCEPT,

NULL)
;

gtk_file_chooser_set_do_overwrite_confirmation (
GTK_FILE_CHOOSER (
dialog)
,
TRUE)
;

if
(
default_folder[
0
]
!=
0
)
gtk_file_chooser_set_current_folder (
GTK_FILE_CHOOSER (
dialog)
,
default_folder)
;

gtk_file_chooser_set_current_name (
GTK_FILE_CHOOSER (
dialog)
,
default_name)
;

//filters

for
(
i=
0
;
i<
strlen(
filters)
;
i++
)

{

j=
0
;

while
(
i<
strlen(
filters)
&&
filters[
i]
!=
'|'
)

des[
j++
]
=
filters[
i++
]
;

if
(
j>=
256
)
break
;

des[
j]
=
0
;

j=
0
;

i++;

if
(
i>=
strlen(
filters)
)
break
;

while
(
i<
strlen(
filters)
&&
filters[
i]
!=
'|'
)

pattern[
j++
]
=
filters[
i++
]
;

if
(
j>=
64
)
break
;

pattern[
j]
=
0
;

FF[
FFc++
]
=
gtk_show_file_add_filter(
dialog,
des,
pattern)
;

if
(
FFc>=
16
)
break
;

}

if
(
gtk_dialog_run (
GTK_DIALOG (
dialog)
)
==
GTK_RESPONSE_ACCEPT)

{

filename =
gtk_file_chooser_get_filename (
GTK_FILE_CHOOSER (
dialog)
)
;

gtk_widget_destroy (
dialog)
;

return
filename;

}

//destroy

gtk_widget_destroy (
dialog)
;

for
(
i=
0
;
i<
FFc;
i++
)

gtk_object_destroy(
GTK_OBJECT(
FF[
i]
)
)
;

return
NULL;

}

gtk_show_file_open()建立一个文件打开窗口供用户选择文件,参数依次是母窗口、标题、过滤器。

gtk_show_file_save()建立一个文件保存窗口供用户选择文件,参数依次是母窗口、标题、默认文件夹、默认文件名、过滤器。

其中“过滤器”是一串字符,字符内用“|”分离,其形式像这样:文件类型名称1|对应通配符1|文件类型名称2|对应通配符2|……

使用GDK函数

GTK+提供好了丰富的功能,但也有缺陷——某些常用功能无法直接使用,需要访问GDK库。下面这个函数,用来确定窗口是不是处于全屏状态。

gboolean gtk_window_is_fullscreen(
GtkWindow*
window)

{

return
(
gdk_window_get_state(
gtk_widget_get_window(
GTK_WIDGET(
window)
)
)
&
GDK_WINDOW_STATE_FULLSCREEN)
==
GDK_WINDOW_STATE_FULLSCREEN;

}

其他用法,请参阅GTK+参考。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: