描画領域に画像データを置く方法はいくつかあります。draw_pixmap()を使えばGdk::Drawable型のデータを描画領域にコピーすることができます(描画領域のウィンドウもGdk::Drawableのひとつです)。この他にもdraw_bitmap()は二色の画像イメージを描画し、draw_image()はそれ以上の色数の画像を描画できます。
これらのメソッド全てにおいて、第一引数はGdk::GCです。第二引数にはコピーしたいイメージの適切な種類を指定します:
Gdk::Drawable,
Gdk::Bitmap,
Gdk::Imageです。次の二つの引数は画像コピーの始点であるx座標とy座標、さらに終点のxとy座標が続きます。最後の二つの引数はコピー先の幅と高さを指定します。
また、Gdk::Pixbufへ描画する方法もあります。Gdk::Pixbufバッファはピクセルの集合操作への便利なラッパーであり、ファイルから読み込むなど、様々な方法で操作できます。
おそらく、Gdk::Pixbufを生成するもっとも一般的な方法はGdk::Pixbuf::create_from_file()を使うことでしょう。これはPNGファイルなどのpixbufレンダリング可能な画像ファイルを読み込むことができます。
Gdk::Pixbufはrender_to_drawableでレンダリングすることができます。これはいくつか引数を取ります。render_to_drawableはGdk::Pixbufのメンバ関数でありGdk::Drawableのものではありません。ですから先ほど説明した(後者のメンバ関数である)draw_*とは異なっています。まず、第一引数はレンダリング先のdrawableです。第二引数はGdk::GCです。次の二つの引数はpixbufの描画開始点であり、これにdrawableでの書き始める点が、そして描画イメージの高さと幅が続きます(これはつまり完全なイメージでなくてもかまわないということです。特にウィンドウの一部でのexpose_eventに反応するときに便利でしょう)。最後にディザリングパラメータが来ます。ディザリングの種類にGdk::RGB_DITHER_NONEを指定すればディザリングパラメータの初期値は共に0になります。
次のコードは以上を短くまとめたものです(注意:通常はexposeイベントハンドラの中で毎回画像を読み込まないでください!コードは上のまとめとして示しただけです):
{
Glib::RefPtr<Gdk::PixBuf> image = Gdk::PixBuf::create_from_file("myimage.png");
image->render_to_drawable(get_window(), get_style()->get_black_gc(),
0, 0, 100, 80, image->get_width(), image->get_height(), // draw the whole image (from 0,0 to the full width,height) at 100,80 in the window
Gdk::RGB_DITHER_NONE, 0, 0);
return true;
}