天天看点

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

学习使用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+参考。