文字を書く(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`
結果
