やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

描画ライブラリcairoを使ってみる

cairoを使って文字列を描画してみた。でも日本語が使えない。

HelloCairo

入手先

GitHub MEGA

開発環境

ライブラリ

VC++

追加インクルードディレクト

$(GTK_HOME)\include\;
$(GTK_HOME)\include\atk-1.0;
$(GTK_HOME)\include\cairo;
$(GTK_HOME)\include\gail-1.0;
$(GTK_HOME)\include\glib-2.0;
$(GTK_HOME)\include\gtk-2.0;
$(GTK_HOME)\include\pango-1.0;
$(GTK_HOME)\lib\glib-2.0\include\;
$(GTK_HOME)\lib\gtk-2.0\include\;

一行にすると以下。

$(GTK_HOME)\include\;$(GTK_HOME)\include\atk-1.0;$(GTK_HOME)\include\cairo;$(GTK_HOME)\include\gail-1.0;$(GTK_HOME)\include\glib-2.0;$(GTK_HOME)\include\gtk-2.0;$(GTK_HOME)\include\pango-1.0;$(GTK_HOME)\lib\glib-2.0\include\;$(GTK_HOME)\lib\gtk-2.0\include\;

追加ライブラリディレクト

$(GTK_HOME)\lib;

追加ライブラリファイル

glib-2.0.lib;
gtk-win32-2.0.lib;
gdk-win32-2.0.lib;
gobject-2.0.lib;
gdk_pixbuf-2.0.lib;
gthread-2.0.lib;
gmodule-2.0.lib;
pango-1.0.lib;
atk-1.0.lib;
zdll.lib;
cairo.lib;

一行にすると以下。

glib-2.0.lib;gtk-win32-2.0.lib;gdk-win32-2.0.lib;gobject-2.0.lib;gdk_pixbuf-2.0.lib;gthread-2.0.lib;gmodule-2.0.lib;pango-1.0.lib;atk-1.0.lib;zdll.lib;cairo.lib;

ソースコード

#include <gtk-2.0/gtk/gtk.h>
#include <cairo.h>

gboolean expose_event_callback(GtkWidget *widget, GdkEventExpose *event, gpointer data)
{
    cairo_t *cr;
    cr = gdk_cairo_create(widget->window);

    cairo_move_to(cr, 30, 30);
    cairo_set_font_size(cr, 24);
    cairo_show_text(cr, "Hello Cairo !!");

    cairo_destroy(cr);
    return FALSE;
}
int main(int argc, char* argv[])
{
    gtk_set_locale();
    gtk_init(&argc, &argv);

    GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "Hello Cairo !! (GTK+, WindowsXP, VC++2010Express)");
    gtk_window_set_default_size(GTK_WINDOW(window), 400, 300);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);

    GtkWidget *drawing_area = gtk_drawing_area_new();
    gtk_widget_set_size_request (drawing_area, 100, 100);
    gtk_container_add(GTK_CONTAINER(window), drawing_area);
    g_signal_connect(G_OBJECT(drawing_area), "expose_event", G_CALLBACK(expose_event_callback), NULL);

    gtk_widget_show_all(window);
    gtk_main();
    return 0;
}

すっきり。これがWindowsメッセージループとGDIで実装していたらもっと行数が多い。

でも、cairoとGDIではそんなに差はなさそうか。

https://github.com/ytyaru/HelloGDI20160701/blob/master/HelloGDI20160701/Program.cpp
https://github.com/ytyaru/HelloGDI20160701

日本語が使えない

cairoのAPIはTCHAR(wchar_t)型が使えない。

どうやって日本語を表示させるのか。 あるいは日本語は表示できないのか。 さっぱりわからない。

VC++でcairoを使ったとき、日本語を表示できるのか。 ほかのコンパイラならできるのか。

GTK+やcairoはクロスプラットフォームなライブラリらしいが、英語限定なら使えない。 調査が必要。