首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

XCB 程式設計教學(二):視窗繪圖基元與 GC 機制詳解

     編輯:關於C++

繪圖核心概念:GC 與 Drawable

  • GC (Graphics Context):封裝畫筆屬性(顏色、線寬、線型、字體等),避免每次繪圖呼叫傳遞大量參數。
  • Drawable:繪圖目標抽象,包含 Window、Pixmap、Colormap 等,XCB 中以 32-bit ID 表示。

完整繪圖範例


#include <stdlib.h> #include <stdio.h> #include <xcb/xcb.h>

int main() {
    // 幾何圖元定義
    xcb_point_t points[] = {{40,40},{40,80},{80,40},{80,80}};
    xcb_point_t polyline[] = {{200,40},{20,80},{100,-80},{40,40}}; // 相對座標
    xcb_segment_t segments[] = {{400,40,560,120},{440,100,520,240}};
    xcb_rectangle_t rects[] = {{40,200,160,80},{320,200,40,160}};
    xcb_arc_t arcs[] = {{40,400,240,160,0,90<<6},{360,400,220,160,0,270<<6}}; // 角度單位 1/64 度

    xcb_connection_t *conn = xcb_connect(NULL, NULL);
    xcb_screen_t *screen = xcb_setup_roots_iterator(xcb_get_setup(conn)).data;

    // 建立 GC(黑色前景)
    xcb_drawable_t drawable = screen->root;
    xcb_gcontext_t gc = xcb_generate_id(conn);
    uint32_t mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES;
    uint32_t vals[2] = {screen->black_pixel, 0};
    xcb_create_gc(conn, gc, drawable, mask, vals);

    // 建立視窗(白底)
    xcb_window_t win = xcb_generate_id(conn);
    mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
    vals[0] = screen->white_pixel; vals[1] = XCB_EVENT_MASK_EXPOSURE;
    xcb_create_window(conn, XCB_COPY_FROM_PARENT, win, screen->root, 0, 0,
                      800, 600, 10, XCB_WINDOW_CLASS_INPUT_OUTPUT,
                      screen->root_visual, mask, vals);
    xcb_map_window(conn, win); xcb_flush(conn);

    // 事件迴圈:EXPOSE 事件觸發繪圖
    xcb_generic_event_t *ev;
    while ((ev = xcb_wait_for_event(conn))) {
        if ((ev->response_type & ~0x80) == XCB_EXPOSE) {
            xcb_poly_point(conn, XCB_COORD_MODE_ORIGIN, win, gc, 4, points);
            xcb_poly_line(conn, XCB_COORD_MODE_PREVIOUS, win, gc, 4, polyline);
            xcb_poly_segment(conn, win, gc, 2, segments);
            xcb_poly_rectangle(conn, win, gc, 2, rects);
            xcb_poly_arc(conn, win, gc, 2, arcs);
            xcb_flush(conn);
        }
        free(ev);
    }
    return 0;
}

執行結果

關鍵點解析

1. 何時繪圖?

僅在 XCB_EXPOSE 事件(視窗初次顯示、從遮蔽恢復、需重繪)中呼叫繪圖函式。符合 MVC 模式:資料變更標記需重繪,實際繪製延遲至 EXPOSE,兼顧正確性與效能。

2. GC 建立與屬性遮罩

xcb_create_gc() 使用 mask + values[] 陣列指定屬性。常用 XCB_GC_* 列舉:

3. 視窗建立遮罩

XCB_CW_* 列舉控制視窗屬性:

本範例指定 XCB_CW_BACK_PIXEL 設白底,故視窗有背景色。

4. 繪圖函式族

  • xcb_poly_point:多點(模式 ORIGIN 絕對座標 / PREVIOUS 相對座標)
  • xcb_poly_line:折線
  • xcb_poly_segment:獨立線段
  • xcb_poly_rectangle:矩形
  • xcb_poly_arc:弧形(角度單位 1/64 度)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved