Table of Contents
DrawingAreaウィジットは空っぽのウィンドウであり、これが望みのグラフィックを生成する自由をあたえてくれます。しかしその自由はウィジットのexposeイベントをハンドルするという責任を伴っています。ウィジットが最初に表示されるとき、あるいは何かに覆われていたのが再び表示されるとき、自分自身の再描画が必要となります。ウィジットのほとんどはこれを行うコードを持っていますが、DrawinAreaは違っており、プログラマがexposeイベントシグナルハンドラを書いてウィジットの内容がどのように表示されるのか決めることができます。ほとんどの場合、これはon_expose_event()仮想メンバ関数をオーバーライドすることで行われます。
| Note | |
|---|---|
gtkmmバージョン2.10登場以前は、描画はほぼグラフィック・コンテキスト( |
Cairoを使うことで非常に洗練された図形の描写が可能になります。しかしその方法はとても基本的なものです。Cairoが提供するメソッドには、直線、曲線、(円を含む)弧の描画があります。これらの基本図形を組み合わせることにより、もっと複雑な図形やパスを、単一色やグラデーション、模様などを付けて生成することができます。さらに、Cairoは複雑な変換、イメージの重ね合わせやアンチエイリアスの効いたテキストのレンダリングを行うこともできます。
| CairoとPango | |
|---|---|
Cairoはテキストのレンダリングを行うことができますが、これはPangoの置き換えを意図したものではありません。回り込みや円形配置といったより高度なテキストレンダリングを行いたいのであれば、Pangoがより良い選択でしょう。Cairoによるテキスト描画はテキストがグラフィックの一部である場合に限って行ったほうがいいでしょう。 |
このセクションのチュートリアルは基本的なCairo描画モデルについてカバーしています。基本的な描画要素を(例と共に)詳しく説明し、それから単純なアプリケーションとして、Cairoを使って描画するカスタム時計ウィジットを紹介します。
Cairoによる描画の基本コンセプトは、"不可視"のパスを定義し、それを筆でなぞるか塗りつぶして可視にするというものです。
gtkmmにおけるCairoの描画では、何をするにもまず最初にCairo::Contextオブジェクトを生成しなくてはいけません。このクラスには、どのように描画がなされるか設定するためのグラフィック状態パラメータが全てあります。そこには、線の幅、色、描画されるサーフェス、その他多くの情報があります。これらを使うことにより実際の描画関数は非常に少ない引数で済み、インターフェイスが簡素化されます。gtkmmでは、Cairo::ContextはGdk::Window::create_cairo_context()を呼ぶことで生成されます。Cairoコンテキストは参照カウントされるオブジェクトであり、この関数はCairo::RefPtr<Cairo::Context>オブジェクトを返します。
以下のコード例ではCairoコンテキストを表示色を赤、幅は2にセットアップする方法を示しています。このコンテキストを使用する任意の描画関数はこれらの設定を使うようになります。
Gtk::DrawingArea myArea; Cairo::RefPtr<Cairo::Context> myContext = myArea.get_window()->create_cairo_context(); myContext->set_source_rgb(1.0, 0.0, 0.0); myContext->set_line_width(2.0);
Cairo::Contextはそれぞれ特定のGdk::Windowと関連付けられます。上の例の第1行はGtk::DrawingAreaウィジットを生成し、2行目でそれと関連付けられたGdk::Windowを使い、Cairo::Contextを生成します。最後の2行はコンテキストのグラフィック状態を変更しています。
Cairoコンテキストで設定できるグラフィック状態変数は非常にたくさんあります。最も一般的なコンテキスト属性は色(set_source_rgbかset_source_rgba()で設定)、線幅(set_line_width()で設定)、線ダッシュの模様(set_dash())、線の終端スタイル(set_line_cap())、線の結合スタイル(set_line_join())、フォントスタイル(set_font_size()かset_font_face()など)があります。設定はほかにもたくさんあり、変換行列や、塗りつぶしルール、アンチエイリアスの挙動などがあります。詳しい情報については、Cairomm APIドキュメントを見てください。
Cairo::Contextの現在の状態を内部スタックに保存し、後で復旧することができます。これは一時的に線の幅や色(やその他のグラフィック設定)を変えて何かを描き、また以前の設定に戻したい場合に便利です。そのような状況では、まずCairo::Context::save()を呼びます。グラフィック設定を変更し、線を描いて、それからCairo::Context::restore()を呼んで元のグラフィック状態を復旧してください。複数回のsave()とrestore()の呼び出しは入れ子にできます。つまり、それぞれのrestore()呼び出しが復旧する状態は、マッチングするペアのsave()によって保存されたものです。
| Tip | |
|---|---|
|
全てのグラフィック状態の変更点を void doSomething(Cairo::RefPtr<Cairo::Context> context, int x)
{
context->save();
// change graphics state
// peform drawing operations
context->restore();
}
|