文字を書く(cairomm編)

概要

cairommを使って文字を描画する。

cairommでも通常と同じようにon_expose_event()の中で描画する。

初めに Cairo::Context::select_font_face()でフォントを指定してから Cairo::Context::set_font_size()でサイズを指定する。ただしset_font_size() で指定する数字はポイントではなくピクセルなので get_pango_context()->get_resolution() でDPIを取得してから「ピクセル = ポイント数 * DPI/72」という式で得られた数字を 指定する必要がある。

あとは Cairo::Context::move_to()で描画位置に移動して Cairo::Context::show_text()で 描画する。文字列の幅や高さ、余白などを得たいときは Cairo::Context::get_text_extents()を使用する。

ソース

cairotext.cpp
#include <gtkmm.h>

class MyDrawArea : public Gtk::DrawingArea
{
public:
    MyDrawArea(){}

protected:
    virtual bool on_expose_event( GdkEventExpose* e );
};


bool MyDrawArea::on_expose_event( GdkEventExpose* event )
{
    int width = get_width();
    int height =get_height();
    double y = 10;

    Cairo::RefPtr< Cairo::Context > cairoctx = get_window()->create_cairo_context();

    // 解像度取得
    double resolution = get_pango_context()->get_resolution();

    // 背景の塗りつぶし
    Gdk::Cairo::set_source_color( cairoctx, Gdk::Color( "black" ) ); 
    cairoctx->paint();

    Glib::ustring text = "あいうえお";

    // フォント指定
    cairoctx->select_font_face( "Serif", Cairo::FONT_SLANT_NORMAL, Cairo::FONT_WEIGHT_NORMAL );
    cairoctx->set_font_size( 20 * resolution / 72 );  // pixel = pt * DPI/72

    // 色指定
    Gdk::Cairo::set_source_color( cairoctx, Gdk::Color( "white" ) ); 

    // extents取得
    Cairo::TextExtents txext;
    cairoctx->get_text_extents( text, txext );

    // 描画(センタリング)
    cairoctx->move_to( width/2 - txext.width/2 - txext.x_bearing, y - txext.y_bearing );
    cairoctx->show_text( text );

    // 次の文字列のy座標
    y += txext.height + 10;

    text = "かきくけこ";

    // フォント指定
    cairoctx->select_font_face( "Monospace", Cairo::FONT_SLANT_NORMAL, Cairo::FONT_WEIGHT_NORMAL );
    cairoctx->set_font_size( 24 * resolution / 72 );
    
    // 色指定
    Gdk::Cairo::set_source_color( cairoctx, Gdk::Color( "red" ) ); 

    // extents取得
    cairoctx->get_text_extents( text, txext );

    // 描画(センタリング)
    cairoctx->move_to( width/2 - txext.width/2 - txext.x_bearing, y - txext.y_bearing );
    cairoctx->show_text( text );

    return true;
}


class MainWin : public Gtk::Window
{
    MyDrawArea m_drawarea;

public:

    MainWin(){
        add( m_drawarea );
        show_all_children();
    }
};


int main( int argc, char *argv[] )
{
    Gtk::Main kit( argc, argv );
    MainWin mainwin;
    Gtk::Main::run( mainwin );

    return 0;
}

コンパイル

必要なコンパイルオプションは pkg-config を使って取得する。

g++ cairotext.cpp -o cairotext `pkg-config gtkmm-2.4 --cflags --libs`

結果