文字を書く(Xlib編)
概要
Xlibを使ってGtk::DrawingAreaに文字を書く前回と同様に on_expose_event()の中で フォントを作成してから XmbDrawString()を使って描画するだけでよい。なおXlibで UTF-8の文字列を表示するには 実行時に setlocale() を呼ぶ必要があるが、gtkmmはどこかで setlocale() を呼んでいるらしく 特に明示する必要はない。
ソース
xdrawstr.cpp#include <gtkmm.h> #include <gdk/gdkx.h> // GDK_GC_XGC 用 class MyDrawArea : public Gtk::DrawingArea { Glib::RefPtr< Gdk::GC > m_gc; public: MyDrawArea(); protected: virtual bool on_expose_event( GdkEventExpose* e ); }; MyDrawArea::MyDrawArea() { // ダブルバッファリング無効 set_double_buffered( false ); } bool MyDrawArea::on_expose_event( GdkEventExpose* event ) { if( ! m_gc ) m_gc = Gdk::GC::create( get_window() ); int width = get_width(); int height = get_height(); GC gc = GDK_GC_XGC( Glib::unwrap( m_gc ) ); Window win = GDK_DRAWABLE_XID( Glib::unwrap( get_window() ) ); Display* dpy = GDK_DISPLAY_XDISPLAY( Glib::unwrap( get_window()->get_display() ) ); Colormap colmap = GDK_COLORMAP_XCOLORMAP( Glib::unwrap( get_default_colormap() ) ); XColor colscr, colexact; // 背景の塗りつぶし unsigned long fgcolor = BlackPixel( dpy, 0 ); XSetForeground( dpy, gc, fgcolor ); XFillRectangle( dpy, win, gc, 0, 0, width, height ); char** mis_list; int mis_count; char* def_str; XFontSet fs = XCreateFontSet( dpy, "-*-fixed-medium-r-normal--24-*-*-*", &mis_list, &mis_count, &def_str ); if( fs != NULL ){ XAllocNamedColor( dpy, colmap, "green", &colscr, &colexact ); fgcolor = colscr.pixel; XSetForeground( dpy, gc, fgcolor ); char* msg = "あいうえお" ; XmbDrawString( dpy, win, fs, gc, 40, 50, msg, strlen( msg ) ); XFreeFontSet( dpy, fs ); } return true; } class MainWin : public Gtk::Window { MyDrawArea m_drawarea; public: MainWin(){ add( m_drawarea ); show_all_children(); } }; int main( int argc, char *argv[] ) { // 無くても良いが一応 setlocale( LC_ALL, "" ); Gtk::Main kit( argc, argv ); MainWin mainwin; Gtk::Main::run( mainwin ); return 0; }
コンパイル
必要なコンパイルオプションは pkg-config を使って取得する。g++ xdrawstr.cpp -o xdrawstr `pkg-config gtkmm-2.4 --cflags --libs`
結果
