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

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

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

这一部分内容介绍有关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+参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值