<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 根窗口 > 原文: [https://zetcode.com/gfx/cairo/root/](https://zetcode.com/gfx/cairo/root/) 在 Cairo 圖形教程的這一部分中,我們將使用根窗口。 根窗口是我們通常具有圖標快捷方式的桌面窗口。 可以使用根窗口進行操作。 從程序員的角度來看,它只是一種特殊的窗口。 ## 透明窗 我們的第一個示例將創建一個透明窗口。 我們將看到窗口對象下方的內容。 ```c #include <cairo.h> #include <gtk/gtk.h> static void do_drawing(cairo_t *); static void tran_setup(GtkWidget *win) { GdkScreen *screen; GdkVisual *visual; gtk_widget_set_app_paintable(win, TRUE); screen = gdk_screen_get_default(); visual = gdk_screen_get_rgba_visual(screen); if (visual != NULL && gdk_screen_is_composited(screen)) { gtk_widget_set_visual(win, visual); } } static gboolean on_draw_event(GtkWidget *widget, cairo_t *cr, gpointer user_data) { do_drawing(cr); return FALSE; } static void do_drawing(cairo_t *cr) { cairo_set_source_rgba(cr, 0.2, 0.2, 0.2, 0.4); cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); cairo_paint(cr); } int main (int argc, char *argv[]) { GtkWidget *window; GtkWidget *darea; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); tran_setup(window); darea = gtk_drawing_area_new(); gtk_container_add(GTK_CONTAINER (window), darea); g_signal_connect(G_OBJECT(darea), "draw", G_CALLBACK(on_draw_event), NULL); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(window), 300, 250); gtk_window_set_title(GTK_WINDOW(window), "Transparent window"); gtk_widget_show_all(window); gtk_main(); return 0; } ``` 為了創建透明窗口,我們獲得了屏幕對象的視覺效果并將其設置為我們的窗口。 在`on_draw()`方法中,我們繪制屏幕的可視對象。 這產生了部分透明的幻覺。 ```c gtk_widget_set_app_paintable(win, TRUE); ``` 我們必須設置要繪制的應用。 ```c screen = gdk_screen_get_default(); ``` `gdk_screen_get_default()`方法返回屏幕對象。 ```c visual = gdk_screen_get_rgba_visual(screen); ``` 從屏幕窗口中,我們可以看到它。 視覺內容包含低級顯示信息。 ```c if (visual != NULL && gdk_screen_is_composited(screen)) { gtk_widget_set_visual(win, visual); } ``` 并非所有的顯示器都支持此操作。 因此,我們檢查屏幕是否支持合成并且返回的視覺效果不是`NULL`。 我們將屏幕的視覺效果設置為窗口的視覺效果。 ```c static void do_drawing(cairo_t *cr) { cairo_set_source_rgba(cr, 0.2, 0.2, 0.2, 0.4); cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); cairo_paint(cr); } ``` 我們使用部分透明的源來繪制屏幕窗口。 `CAIRO_OPERATOR_SOURCE`在我們繪制源代碼的地方創建了合成操作。 這是屏幕窗口。 為了獲得完全透明,我們將 alpha 值設置為 0 或使用`CAIRO_OPERATOR_CLEAR`運算符。 ![Transparent window](https://img.kancloud.cn/4c/c3/4cc35d7d24fe6addb8ca72f0fdfa4b6e_302x276.jpg) 圖:透明窗口 ## 截屏 根窗口對于截圖也是必不可少的。 ```c #include <cairo.h> #include <gdk/gdk.h> int main (int argc, char *argv[]) { gdk_init(&argc, &argv); GdkWindow *root_win = gdk_get_default_root_window(); gint width = gdk_window_get_width(root_win); gint height = gdk_window_get_height(root_win); cairo_surface_t *surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); GdkPixbuf *pb = gdk_pixbuf_get_from_window(root_win, 0, 0, width, height); cairo_t *cr = cairo_create(surface); gdk_cairo_set_source_pixbuf(cr, pb, 0, 0); cairo_paint(cr); cairo_surface_write_to_png(surface, "image.png"); cairo_destroy(cr); cairo_surface_destroy(surface); return 0; } ``` 該示例捕獲整個屏幕的快照。 在此示例中,我們不使用完整的 GTK 窗口系統。 我們使用 Cairo 和 GDK 庫來完成這項工作。 ```c gdk_init(&argc, &argv); ``` `gdk_init()`初始化 GDK 庫并連接到窗口系統。 ```c GdkWindow *root_win = gdk_get_default_root_window(); ``` 我們通過`gdk_get_default_root_window()`函數調用獲得了根窗口。 ```c gint width = gdk_window_get_width(root_win); gint height = gdk_window_get_height(root_win); ``` 我們確定根窗口的寬度和高度。 ```c cairo_surface_t *surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); ``` 空的圖像表面被創建。 它具有根窗口的大小。 ```c GdkPixbuf *pb = gdk_pixbuf_get_from_window(root_win, 0, 0, width, height); ``` 我們使用`gdk_pixbuf_get_from_window()`函數調用從根窗口中獲得一個`pixbuf`。 `pixbuf`是描述內存中圖像的對象。 ```c cairo_t *cr = cairo_create(surface); gdk_cairo_set_source_pixbuf(cr, pb, 0, 0); cairo_paint(cr); ``` 在上述代碼行中,我們在之前創建的圖像表面上創建了 Cairo 繪圖上下文。 我們將 pixbuf 放在繪圖上下文上并將其繪制在表面上。 ```c cairo_surface_write_to_png(surface, "image.png"); ``` 使用`write_to_png()`方法將圖像表面寫入 PNG 圖像。 ```c cairo_destroy(cr); cairo_surface_destroy(surface); ``` 我們清理資源。 ## 顯示信息 在第三個示例中,我們將在桌面窗口上顯示一條消息。 ```c #include <cairo.h> #include <gtk/gtk.h> #include <pango/pango.h> static void do_drawing(cairo_t *); static gboolean on_draw_event(GtkWidget *widget, cairo_t *cr, gpointer user_data) { do_drawing(cr); return FALSE; } static void do_drawing(cairo_t *cr) { cairo_set_operator(cr, CAIRO_OPERATOR_CLEAR); cairo_paint(cr); cairo_set_operator(cr, CAIRO_OPERATOR_OVER); } static void setup(GtkWidget *win) { gtk_widget_set_app_paintable(win, TRUE); gtk_window_set_type_hint(GTK_WINDOW(win), GDK_WINDOW_TYPE_HINT_DOCK); gtk_window_set_keep_below(GTK_WINDOW(win), TRUE); GdkScreen *screen = gdk_screen_get_default(); GdkVisual *visual = gdk_screen_get_rgba_visual(screen); if (visual != NULL && gdk_screen_is_composited(screen)) { gtk_widget_set_visual(win, visual); } } int main (int argc, char *argv[]) { GtkWidget *window; GtkWidget *lbl; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); setup(window); lbl = gtk_label_new("ZetCode, tutorials for programmers"); PangoFontDescription *fd = pango_font_description_from_string("Serif 20"); gtk_widget_modify_font(lbl, fd); gtk_container_add(GTK_CONTAINER(window), lbl); GdkColor color; gdk_color_parse("white", &color); gtk_widget_modify_fg(lbl, GTK_STATE_NORMAL, &color); g_signal_connect(G_OBJECT(window), "draw", G_CALLBACK(on_draw_event), NULL); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(window), 350, 250); gtk_widget_show_all(window); gtk_main(); return 0; } ``` 該代碼在根窗口上顯示消息標簽。 ```c static void do_drawing(cairo_t *cr) { cairo_set_operator(cr, CAIRO_OPERATOR_CLEAR); cairo_paint(cr); cairo_set_operator(cr, CAIRO_OPERATOR_OVER); } ``` 我們使用`CAIRO_OPERATOR_CLEAR`運算符清除窗口背景。 然后我們設置`CAIRO_OPERATOR_OVER`以繪制標簽窗口小部件。 ```c gtk_widget_set_app_paintable(win, TRUE); ``` 我們將操縱應用窗口,因此我們使其可繪制。 ```c gtk_window_set_type_hint(GTK_WINDOW(win), GDK_WINDOW_TYPE_HINT_DOCK); ``` 實現此窗口提示會刪除窗口邊框和裝飾。 ```c gtk_window_set_keep_below(GTK_WINDOW(win), TRUE); ``` 我們始終將應用始終放在根窗口的底部。 ```c GdkScreen *screen = gdk_screen_get_default(); GdkVisual *visual = gdk_screen_get_rgba_visual(screen); if (visual != NULL && gdk_screen_is_composited(screen)) { gtk_widget_set_visual(win, visual); } ``` 我們將屏幕的外觀設置為應用的外觀。 ```c lbl = gtk_label_new("ZetCode, tutorials for programmers"); ``` 我們創建一個消息標簽。 ```c PangoFontDescription *fd = pango_font_description_from_string("Serif 20"); gtk_widget_modify_font(lbl, fd); ``` 在 Pango 模塊的幫助下,我們為文本選擇特定的字體。 ```c gtk_container_add(GTK_CONTAINER(window), lbl); ``` 標簽貼在窗戶上。 ```c GdkColor color; gdk_color_parse("white", &color); gtk_widget_modify_fg(lbl, GTK_STATE_NORMAL, &color); ``` 我們將文本修改為白色。 ![Message on the root window](https://img.kancloud.cn/9f/c8/9fc81ce2659970758e6bd8a2639f39c6_545x126.jpg) 圖:根窗口上的消息 在本章中,我們使用了 Cairo 的桌面窗口。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看