gtk+笔记

安装gtk+

sudo apt-get install libgtk3.0*
sudo apt install libgtk-3-dev

HelloWord

main.c

#include <gtk/gtk.h>

int main( int   argc, char *argv[] )
{
    /* GtkWidget 是构件的存储类型 */
    GtkWidget *window;

    /* 这个函数在所有的 GTK 程序都要调用。参数由命令行中解析出来并且送到该程序中*/
    gtk_init (&argc, &argv);

    /* 创建一个新窗口 */
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);


    /* 最后一步是显示新创建的窗口 */
    gtk_widget_show (window);

    /* 所有的 GTK 程序必须有一个 gtk_main() 函数。程序运行停在这里
     * 等待事件 (如键盘事件或鼠标事件) 的发生。*/
    gtk_main ();

    return 0;
}

编译:

gcc main.c `pkg-config --libs --cflags gtk+-2.0`

#如果是使用gtk3.0
#gcc main.c `pkg-config --libs --cflags gtk+-3.0`

执行:

./a.out

打开文件对话框

在windows下:

#include <windows.h>  
#include <Shlobj.h>  
#include <tchar.h>  
#include <Commctrl.h>  
 
#pragma comment(lib, "comctl32.lib")  
int main()
{
    LPITEMIDLIST pil = NULL;
    INITCOMMONCONTROLSEX InitCtrls = { 0 };
    TCHAR szBuf[4096] = { 0 };
    BROWSEINFO bi = { 0 };
    bi.hwndOwner = NULL;
    bi.iImage = 0;
    bi.lParam = NULL;
    bi.lpfn = NULL;
    bi.lpszTitle = _T("请选择文件路径");
    bi.pszDisplayName = szBuf;
    bi.ulFlags = BIF_BROWSEINCLUDEFILES;
 
    InitCommonControlsEx(&InitCtrls);//在调用函数SHBrowseForFolder之前需要调用该函数初始化相关环境  
    pil = SHBrowseForFolder(&bi);
    if (NULL != pil)//若函数执行成功,并且用户选择问件路径并点击确定  
    {
        SHGetPathFromIDList(pil, szBuf);//获取用户选择的文件路径  
        wprintf_s(_T("%s"), szBuf);
    }
 
    return 0;
}

在Ubuntu下的代码为:

#include <gtk/gtk.h>
 
void select_file()
{
    GtkWidget *dialog;
 
    //dialog = gtk_file_selection_new("文件选择对话框");  //这条和下边的区别有待考察
dialog=gtk_file_chooser_dialog_new("SelectFile",NULL,GTK_FILE_CHOOSER_ACTION_OPEN,GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,GTK_STOCK_OK,GTK_RESPONSE_ACCEPT,NULL);
    if(gtk_dialog_run(GTK_DIALOG(dialog))==GTK_RESPONSE_ACCEPT)
    {
        char *filename;
        filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
        printf("file name is : %s \n", filename);
    }
    gtk_widget_destroy(dialog);
}
 
int main(int argc,char **argv)
{
    gtk_init(&argc,&argv);
    select_file();
    return 0;
}

GTK+介绍

GTK+是创建图形化用户接口的库,使用C语言创建,也可以使用C++,Python,Perl,Java,C#来创建。

GTK+依赖以下的库:

  • Glib
  • Pango
  • ATK
  • GDK
  • GdkPixbuf
  • Cairo

编译GTK+应用

使用pkg-config会返回被安装库的元数据,如果我们使用一个指定的库,它会帮助我们提供必要的库和我们需要的库。

gcc -o simple simple.c `pkg-config --libs --cflags gtk+-2.0`

cflags参数输出要编译的GTK+程序的每个处理器和编译标志:

$ pkg-config --cflags gtk+-2.0 | xargs -n3
-pthread -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include
-I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0
-I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/freetype2
-I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1
-I/usr/include/libpng12 -I/usr/include/harfbuzz

libs参数列举了必要的库文件:

$ pkg-config --libs gtk+-2.0 | xargs -n5
-lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0
-lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfontconfig
-lgobject-2.0 -lglib-2.0 -lfreetype

GTK版本

version.c

#include <gtk/gtk.h>

int main(int argc, char *argv[]) {

    gtk_init(&argc, &argv);

    g_printf("GTK+ version: %d.%d.%d\n", gtk_major_version, 
        gtk_minor_version, gtk_micro_version);
    g_printf("Glib version: %d.%d.%d\n", glib_major_version,
        glib_minor_version, glib_micro_version);    
        
    return 0;
}

第一个GTK+程序

样例程序

创建一个基本窗口:
simple.c

#include <gtk/gtk.h>

int main(int argc, char *argv[]) {

  GtkWidget *window; //所有GTK+部件的基础类,他管理部件的生命周期,状态和样式。

  gtk_init(&argc, &argv); //初始化GTK+并解析一些标准命令行选项。

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);//创建一个顶级窗口
  gtk_widget_show(window);
  
  g_signal_connect(window, "destroy",
      G_CALLBACK(gtk_main_quit), NULL);  //给窗口对象绑定一个回调函数,并传递一个destroy信号,

  gtk_main(); //进入GTK+主循环

  return 0;
}
gcc -o simple simple.c `pkg-config --libs --cflags gtk+-2.0`

居中窗口

center.c

#include <gtk/gtk.h>

int main(int argc, char *argv[]) {
    
  GtkWidget *window;

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(window), "Center");
  gtk_window_set_default_size(GTK_WINDOW(window), 230, 150);
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_widget_show(window);

  g_signal_connect(G_OBJECT(window), "destroy",
      G_CALLBACK(gtk_main_quit), NULL);

  gtk_main();

  return 0;
}

应用图标

icon.c

#include <gtk/gtk.h>

GdkPixbuf *create_pixbuf(const gchar * filename) {
    
   GdkPixbuf *pixbuf;
   GError *error = NULL;
   pixbuf = gdk_pixbuf_new_from_file(filename, &error);
   
   if (!pixbuf) {
       
      fprintf(stderr, "%s\n", error->message);
      g_error_free(error);
   }

   return pixbuf;
}

int main(int argc, char *argv[]) {
    
  GtkWidget *window;
  GdkPixbuf *icon;

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(window), "Icon");
  gtk_window_set_default_size(GTK_WINDOW(window), 230, 150);
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  
  icon = create_pixbuf("web.png");  
  gtk_window_set_icon(GTK_WINDOW(window), icon);
  
  gtk_widget_show(window);

  g_signal_connect(G_OBJECT(window), "destroy",
      G_CALLBACK(gtk_main_quit), NULL);
      
  g_object_unref(icon);    //析构图标

  gtk_main();

  return 0;
}

工具提示

tooltip.c

#include <gtk/gtk.h>

int main(int argc, char *argv[]) {

  GtkWidget *window;
  GtkWidget *button;
  GtkWidget *halign;

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(window), "Tooltip");
  gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
  gtk_container_set_border_width(GTK_CONTAINER(window), 15); //设置边界空间
  
  button = gtk_button_new_with_label("Button");
  gtk_widget_set_tooltip_text(button, "Button widget"); //设置提示语
  
  halign = gtk_alignment_new(0, 0, 0, 0); //对齐方式为左上角
  gtk_container_add(GTK_CONTAINER(halign), button); //设置子部件button的对齐方式
  gtk_container_add(GTK_CONTAINER(window), halign);  //设置窗口的主容器

  gtk_widget_show_all(window); //显示所有窗口和部件
  
  g_signal_connect(G_OBJECT(window), "destroy",
      G_CALLBACK(gtk_main_quit), NULL);  

  gtk_main();

  return 0;
}

菜单和工具栏

菜单栏逻辑图

菜单栏样例

simplemenu.c

#include <gtk/gtk.h>

int main(int argc, char *argv[]) {

  GtkWidget *window;
  GtkWidget *vbox;

  GtkWidget *menubar;
  GtkWidget *fileMenu;
  GtkWidget *fileMi;
  GtkWidget *quitMi;

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
  gtk_window_set_title(GTK_WINDOW(window), "Simple menu");

  vbox = gtk_vbox_new(FALSE, 0);
  gtk_container_add(GTK_CONTAINER(window), vbox);

  menubar = gtk_menu_bar_new();
  fileMenu = gtk_menu_new();

  fileMi = gtk_menu_item_new_with_label("File");
  quitMi = gtk_menu_item_new_with_label("Quit");

  gtk_menu_item_set_submenu(GTK_MENU_ITEM(fileMi), fileMenu);
  gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), quitMi);
  gtk_menu_shell_append(GTK_MENU_SHELL(menubar), fileMi);
  gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);

  g_signal_connect(G_OBJECT(window), "destroy",
        G_CALLBACK(gtk_main_quit), NULL);

  g_signal_connect(G_OBJECT(quitMi), "activate",
        G_CALLBACK(gtk_main_quit), NULL);

  gtk_widget_show_all(window);

  gtk_main();

  return 0;
}

参考链接:
https://www.cnblogs.com/libra13179/p/12531758.html
https://blog.csdn.net/SeaTalks/article/details/53130088

posted @ 2021-02-22 11:33  多弗朗强哥  阅读(175)  评论(0编辑  收藏  举报