zoukankan      html  css  js  c++  java
  • 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 
    ", 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
    ", gtk_major_version, 
            gtk_minor_version, gtk_micro_version);
        g_printf("Glib version: %d.%d.%d
    ", 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
    ", 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

  • 相关阅读:
    Android获取两条线之间的夹角度数
    Android字体度量(FontMetrics)
    Android下如何计算要显示的字符串所占的宽度和高度
    Android 颜色渲染PorterDuff及Xfermode详解
    从输入URL到页面加载的全过程
    滚动优化
    常用的前端相关chrome插件
    DNS预解析prefetch
    资源预加载preload和资源预读取prefetch简明学习
    使用chrome开发者工具中的performance面板解决性能瓶颈
  • 原文地址:https://www.cnblogs.com/chendeqiang/p/14429223.html
Copyright © 2011-2022 走看看