鱼C论坛

 找回密码
 立即注册
查看: 2636|回复: 0

[技术交流] C语言GUI程序设计-GTK图文系列-对话框

[复制链接]
发表于 2014-11-22 12:44:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这一讲主要讲解GTK中的对话框部件,GtkDialog
GtkDialog提供一种弹出窗口与用户交互,就是所谓的对话框。GtkDialog是GTK中所有对话框的“基类”,我们常用的对话框有关于对话框和消息框。

例程截图:
gtk_dialog_demo.png


  1. #include <gtk/gtk.h>

  2. void button_about_click(GtkButton *button,gpointer user_data)
  3. {
  4.     GtkWidget *about_dialog = gtk_about_dialog_new();
  5.     const gchar *author[] = {"G0398",NULL};
  6.     gtk_about_dialog_set_program_name(GTK_ABOUT_DIALOG(about_dialog),"dialog demo.exe");
  7.     gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(about_dialog),"v1.0");
  8.     gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(about_dialog),"2014 fishc inc.");
  9.     gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(about_dialog),"a simple program to display dialogs.");
  10.     gtk_about_dialog_set_license(GTK_ABOUT_DIALOG(about_dialog),"no license");
  11.     gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(about_dialog),"http://bbs.fishc.com");
  12.     gtk_about_dialog_set_authors(GTK_ABOUT_DIALOG(about_dialog),&author);
  13.     gtk_about_dialog_set_logo_icon_name(GTK_ABOUT_DIALOG(about_dialog),"favicon.ico");
  14.     gtk_dialog_run(GTK_DIALOG(about_dialog));
  15.     gtk_widget_destroy(about_dialog);
  16. }
  17. void button_info_message_click(GtkButton *button,gpointer user_data)
  18. {
  19.     GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(user_data), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO,GTK_BUTTONS_OK,"information");
  20.     gtk_dialog_run(GTK_DIALOG(dialog));
  21.     gtk_widget_destroy(dialog);
  22. }
  23. void button_warning_message_click(GtkButton *button,gpointer user_data)
  24. {
  25.     GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(user_data), GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING,GTK_BUTTONS_OK,"warning");
  26.     gtk_dialog_run(GTK_DIALOG(dialog));
  27.     gtk_widget_destroy(dialog);
  28. }
  29. void question_answer_callback(GtkDialog *dialog,gint response_id,gpointer user_data)
  30. {
  31.     if(response_id == GTK_RESPONSE_YES)
  32.     {
  33.         g_print("your anwser is yes!\n");
  34.     }
  35.     else if(response_id == GTK_RESPONSE_NO)
  36.     {
  37.         g_print("your anwser is no!\n");
  38.     }
  39. }
  40. void button_question_message_click(GtkButton *button,gpointer user_data)
  41. {
  42.     gint response_id = 0;
  43.     GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(user_data), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION,GTK_BUTTONS_YES_NO,"are you sure?");
  44.     g_signal_connect(GTK_WIDGET(dialog), "response", G_CALLBACK(question_answer_callback), NULL);
  45.     gtk_dialog_run(GTK_DIALOG(dialog));
  46.     gtk_widget_destroy(dialog);
  47. }
  48. void button_warning_error_click(GtkButton *button,gpointer user_data)
  49. {
  50.     GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(user_data), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR,GTK_BUTTONS_OK,"something wrong!");
  51.     gtk_dialog_run(GTK_DIALOG(dialog));
  52.     gtk_widget_destroy(dialog);
  53. }
  54. void button_login_dialog_click(GtkButton *button,gpointer user_data)
  55. {
  56.     GtkWidget *dialog;
  57.     GtkLabel *label = GTK_LABEL(user_data);
  58.     gint response_id = 0;
  59.     GtkWidget *content_area,*fixed;
  60.     GtkWidget *label_name,*entry_name,*label_pwd,*entry_pwd;

  61.     dialog = gtk_dialog_new();
  62.     content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
  63.     fixed = gtk_fixed_new();
  64.     gtk_widget_set_size_request(GTK_WIDGET(fixed),220,120);
  65.     gtk_container_add(GTK_CONTAINER(content_area), fixed);
  66.     label_name = gtk_label_new("name: ");
  67.     label_pwd = gtk_label_new("password: ");
  68.     gtk_fixed_put(GTK_FIXED(fixed), label_name, 5,20);
  69.     gtk_fixed_put(GTK_FIXED(fixed), label_pwd, 5,50);
  70.     entry_name = gtk_entry_new();
  71.     entry_pwd = gtk_entry_new();
  72.     gtk_entry_set_visibility(GTK_ENTRY(entry_pwd), FALSE);
  73.     gtk_fixed_put(GTK_FIXED(fixed), entry_name, 85,20);
  74.     gtk_fixed_put(GTK_FIXED(fixed), entry_pwd, 85,50);
  75.     gtk_widget_show_all(fixed);
  76.     gtk_dialog_add_button(GTK_DIALOG(dialog), "login", 0xa1);
  77.     gtk_dialog_add_button(GTK_DIALOG(dialog), "cancel", 0xa2);
  78.     response_id = gtk_dialog_run(GTK_DIALOG(dialog));
  79.     if(response_id == 0xa1)
  80.     {
  81.         gtk_label_set_text(label, gtk_entry_get_text(GTK_ENTRY(entry_name)));
  82.     }
  83.     else if(response_id == 0xa2)
  84.     {
  85.         gtk_label_set_text(label, "user cancel");
  86.     }

  87.     gtk_widget_destroy(dialog);
  88. }
  89. int main(int argc,char *argv[])
  90. {
  91.     GtkWidget *window,*fixed;
  92.     GtkWidget *button_about,*button_info_message,*button_warning_message,*button_question_message,*button_error_message;
  93.     GtkWidget *button_dialog_for_user_login,*label_user_info;

  94.     gtk_init(&argc,&argv);
  95.     window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
  96.     gtk_window_set_title(GTK_WINDOW(window),"hello fishc - GtkDialog");
  97.     gtk_widget_set_size_request(GTK_WIDGET(window),300,200);

  98.     fixed = gtk_fixed_new();
  99.     gtk_container_add(GTK_CONTAINER(window), fixed);

  100.     button_about = gtk_button_new_with_label("about this program");
  101.     g_signal_connect(GTK_WIDGET(button_about), "clicked", G_CALLBACK(button_about_click), NULL);
  102.     gtk_fixed_put(GTK_FIXED(fixed), button_about, 5,5);

  103.     button_info_message = gtk_button_new_with_label("info message");
  104.     g_signal_connect(GTK_WIDGET(button_info_message), "clicked", G_CALLBACK(button_info_message_click), window);
  105.     gtk_fixed_put(GTK_FIXED(fixed), button_info_message, 5,45);

  106.     button_warning_message = gtk_button_new_with_label("warning message");
  107.     g_signal_connect(GTK_WIDGET(button_warning_message), "clicked", G_CALLBACK(button_warning_message_click), window);
  108.     gtk_fixed_put(GTK_FIXED(fixed), button_warning_message, 125,45);

  109.     button_question_message = gtk_button_new_with_label("question message");
  110.     g_signal_connect(GTK_WIDGET(button_question_message), "clicked", G_CALLBACK(button_question_message_click), window);
  111.     gtk_fixed_put(GTK_FIXED(fixed), button_question_message, 5,85);

  112.     button_error_message = gtk_button_new_with_label("error message");
  113.     g_signal_connect(GTK_WIDGET(button_error_message), "clicked", G_CALLBACK(button_warning_error_click), window);
  114.     gtk_fixed_put(GTK_FIXED(fixed), button_error_message, 145,85);

  115.     label_user_info = gtk_label_new("user info ");
  116.     gtk_fixed_put(GTK_FIXED(fixed), label_user_info, 5,165);

  117.     button_dialog_for_user_login = gtk_button_new_with_label("a dialog for user login");
  118.     g_signal_connect(GTK_WIDGET(button_dialog_for_user_login), "clicked", G_CALLBACK(button_login_dialog_click), label_user_info);
  119.     gtk_fixed_put(GTK_FIXED(fixed), button_dialog_for_user_login, 5,125);

  120.     gtk_widget_show_all(window);
  121.     gtk_main();

  122.     return 0;
  123. }
复制代码

先看下关于对话框,关于对话框一般在软件的菜单栏Help->About里出现,显示了这个软件的名称,版本号,描述,作者,授权等信息。

gtk_about_dialog.png


GtkAboutDialog
GtkAboutDialog提供了一种简便的方式来设置关于对话框,我们不用考虑对话框中子部件的布局,以及对话框的大小,只要设置一些需要显示的属性就可以了。
  1. gtk_about_dialog_new()
复制代码

这个函数用来创建一个关于对话框,无参数。
然后通过以系列的set函数设置对话框中要显示的属性。
  1. gtk_about_dialg_set_xxxx
复制代码
xxxx就是我们要设置的属性名称,比如这里要设置软件的版本号,就使用这个函数:
  1. gtk_about_dialog_set_version
复制代码
这个函数有两个参数,第一个为GtkAboutDialog,第二个为要设置的版本号值。

一个个设置完后,调用对话框的显示函数来显示对话框。
  1. gtk_dialog_run
复制代码
这个函数用来显示对话框,第一个参数为要显示的对话框。
显示完成后通过
  1. gtk_widget_destroy
复制代码

函数销毁对话框资源。

GtkMessageDialog
GtkMessageDialog是GTK中的消息框,和win32下的MessageBox api作用是一样的。
gtk_info_dialog.png gtk_warning_dialog.png gtk_error_dialog.png gtk_question_dialog.png


消息框的类型有信息框,警告框,错误提示框和提供选择的问题框。

  1. gtk_message_dialog_new
复制代码
用来创建一个消息框,这个函数有5个必选参数和1个可选参数。

第一个参数为承载这个消息框的父窗体,
第二个参数为对话框的标志位,用来设置对话框为模态对话框,
第三个参数为对话框的类型,如信息框,警告框,等。这是一个枚举类型,定义为:
  1. typedef enum {
  2.   GTK_MESSAGE_INFO,
  3.   GTK_MESSAGE_WARNING,
  4.   GTK_MESSAGE_QUESTION,
  5.   GTK_MESSAGE_ERROR,
  6.   GTK_MESSAGE_OTHER
  7. } GtkMessageType;
复制代码
第四个参数为按钮类型,用来指示对话框中显示的按钮,也是一个枚举类型,定义为:
  1. typedef enum {
  2.   GTK_BUTTONS_NONE,
  3.   GTK_BUTTONS_OK,
  4.   GTK_BUTTONS_CLOSE,
  5.   GTK_BUTTONS_CANCEL,
  6.   GTK_BUTTONS_YES_NO,
  7.   GTK_BUTTONS_OK_CANCEL
  8. } GtkButtonsType;
复制代码
第五个参数为一个格式化字符串,和printf函数的第一个参数一样的,用来格式化字符串。
最后一个可选参数是为了给格式化字符串提供参数值。

我们可以注册GtkDialog的 response 信号来获取对话框的反馈信息(还有其它的方式),比如要获取


的用户选择,可以注册回调函数来获取response_id,通过判断response_id 来获取用户选择。
response id 取值为一个整形,其预定义取值为枚举类型,定义为:
  1. typedef enum {
  2.   GTK_RESPONSE_NONE         = -1,
  3.   GTK_RESPONSE_REJECT       = -2,
  4.   GTK_RESPONSE_ACCEPT       = -3,
  5.   GTK_RESPONSE_DELETE_EVENT = -4,
  6.   GTK_RESPONSE_OK           = -5,
  7.   GTK_RESPONSE_CANCEL       = -6,
  8.   GTK_RESPONSE_CLOSE        = -7,
  9.   GTK_RESPONSE_YES          = -8,
  10.   GTK_RESPONSE_NO           = -9,
  11.   GTK_RESPONSE_APPLY        = -10,
  12.   GTK_RESPONSE_HELP         = -11
  13. } GtkResponseType;
复制代码

GtkDialog
下面来看看GtkDialog,它为我们提供了一种显示对话框的方式,将要显示的内容添加到其内部,调用run函数就可以显示出来了,例如这个登录框:
gtk_dialog_userlogin.png


先新建一个GtkDialog,然后获取其内容区域,把要显示的东西添加到其内容区域即可。
  1. gtk_dialog_get_content_area
复制代码
这个函数用来获取对话框的内容区域,返回值为内容区域的指针。
使用函数
  1. gtk_dialog_add_button
复制代码
为对话框添加按钮,可以设置按钮的response_id,为自定义的id。
例程中添加了两个按钮,一个login一个cancel,其响应id分别为0xa1,0xa2。
设置完成后,调用
  1. gtk_dialog_run
复制代码
函数即可显示自定义的对话框,其实这个函数有个返回值就是response_id,可以直接用它的返回值来判断用户选择状态,不用注册 response 信号的回调那种方式了。

好了,对话框就说这么多,下一讲来说GTK中的树状部件和列表部件。

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-18 05:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表