文字を書く

概要

Gtk::DrawingAreaに文字を書く。

パラグラフクラスである Pango::Layout を使用する。はじめに Gtk::Widget::create_pango_layout() を使って Pango::Layoutのインスタンスを 作成し、フォントや描画する文字を設定してから get_window()->draw_layout() によりパラグラフを描画する。

ソース

layout.cpp

#include <gtkmm.h>

enum
{
    C_WHITE = 0,
    C_RED,
    C_BLACK,
    C_NUM
};


class MyDrawArea : public Gtk::DrawingArea
{
    Glib::RefPtr< Gdk::GC > m_gc;
    Gdk::Color m_col[ C_NUM ];
    Glib::RefPtr< Pango::Layout > m_layout;
    
public:
    MyDrawArea();

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


MyDrawArea::MyDrawArea()
{
    // カラーマップの登録
    m_col[ C_WHITE ] = Gdk::Color( "white" );
    m_col[ C_RED ] = Gdk::Color( "red" );
    m_col[ C_BLACK ] = Gdk::Color( "black" );

    Glib::RefPtr< Gdk::Colormap > colmap = get_default_colormap();
    for( int i = 0; i < C_NUM; ++i ) colmap->alloc_color( m_col[ i ] );

    // pango layout作成
    m_layout = create_pango_layout( "" );
}


void MyDrawArea::on_realize()
{
    // 元のon_realize()のコールを忘れないこと
    Gtk::DrawingArea::on_realize(); 

    // Gdk::Window からGCを作る
    m_gc = Gdk::GC::create( get_window() );
}


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

    // 背景の塗りつぶし
    get_window()->set_background( m_col[ C_BLACK ] );
    get_window()->clear();

    // フォント指定
    m_layout->set_font_description( Pango::FontDescription( "Serif 20" ) );

    // 表示する文字をセット
    m_layout->set_text("あいうえお");

    // 中央揃え
    x = ( width - m_layout->get_pixel_ink_extents().get_width() ) / 2;
    
    // 描画
    get_window()->draw_layout( m_gc, x, y, m_layout , m_col[ C_WHITE],  m_col[ C_RED ] );

    // 次のパラグラフのy座標
    y += m_layout->get_pixel_ink_extents().get_height() + 10;
    
    // フォント指定
    m_layout->set_font_description( Pango::FontDescription( "Monospace 24" ) );

    // 表示する文字をセット
    m_layout->set_text("かきくけこ");

    // 中央揃え
    x = ( width - m_layout->get_pixel_ink_extents().get_width() ) / 2;

    // 描画
    get_window()->draw_layout( m_gc, x, y, m_layout,  m_col[ C_RED ], m_col[ C_WHITE] );

    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++ layout.cpp -o layout `pkg-config gtkmm-2.4 --cflags --libs`

結果