網誌存檔

2010年11月17日 星期三

「轉貼來源-http://xy0811.spaces.live.com/default.aspx」使用gdk_text_draw顯示中英文混合字體

一、 說明
我們可以很容易把控件上的字體設成中文,但在gdk層上直接顯示文字,並具按要求字體顯示,相比就比較困難,以下是我測試通過的簡化的例程,僅供說明中文字體的顯示問題。

二、 例程

1. 代碼
#include
#include
#include

gboolean draw_text(gpointer data)
// timeout
的回調函數
{
GtkWidget *drawing_area = (GtkWidget *) data;
// 顯示文字的畫布
GdkFont *font = gdk_fontset_load
("-adobe-helvetica-medium-r-normal--36-*-*-*-*-*-iso8859-1, misc-simsun-medium-r-normal--36-*-*-*-*-*-gb18030.2000-0");
// 設定英文字體用adobe, 中文用宋體(simsun),宋體是我從xp中複製過去使用的,ubuntu自帶中文字體見/usr/share/fonts/X11/misc/fonts.dir中帶gb的行
char str[128] = "test
雙色球"; // 顯示的文字,因為系統設定為zh_CN.UTF8,所以沒有做轉換,如果設成了zh_CN.GB2312的話,可以用gtk_local_to_utf8()轉成UTF8,才能識別;utf8為一個漢字佔三字節,可以通過取字串的長度判定是何種編碼方式

gdk_draw_rectangle(drawing_area->window,
drawing_area->style->white_gc, TRUE, 0, 0, 200, 200);
// 畫矩形填背景
gdk_draw_text(drawing_area->window, font, drawing_area->style->black_gc,
10, 36, str, strlen(str));
// 顯示文字,注意坐標指字的左下角位置
return TRUE;
}

int main(int argc, char *argv[])
{
GtkWidget *window1;
gtk_set_locale();
gtk_init(&argc, &argv);

window1 = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_show(window1);
gtk_timeout_add(110, (GtkFunction) draw_text, window1);
// 設置時間回調
gtk_main();
return 0;
}

2. 編譯
all:
gcc main.c -o main `pkg-config --cflags --libs gtk+-2.0`

3. 執行結果

沒有留言:

張貼留言