WisdomSoft - for your serial experiences.

4.1 描画オブジェクト

WPF の基本的な描画モデルについて解説します。WPF では描画コマンドを発行するのではなく、描画オブジェクトを組み合わせて図形を表現します。

4.1.1 図形をオブジェクトで表現する

従来の GDI や GDI+ では、ウィンドウから再描画の要求を表すメッセージを受け取ったときに、再描画イベントとして、デバイスコンテキストからディスプレイなどの出力デバイスにコンテンツを描画しました。こうした仕組みから、開発者は再描画用のイベントハンドラを用意し、このイベントハンドラ内で描画に必要な情報を集め、最終的な結果を出力していました。

この場合、コントロールは何らかの図形を描画するときに参考とする情報を、例えばプロパティなどで公開し、プロパティの設定に基づいて描画結果を決定するという方法を採用していましたが、この方法は描画するコンテンツをコントロールが公開するプロパティに依存させるため、柔軟性は乏しく、限られた範囲の表現しかできません。

WPF では、こうした従来の描画モデルを切り離し、新しい描画モデルを採用しています。これまでのように、再描画用のイベントハンドラを用意する必要はなく、描画したい図形を表す描画オブジェクトを用意し、描画オブジェクトの組み合わせで最終的な図形を出力します。

描画オブジェクトとは、簡単に言えば UIElement クラスのオブジェクトのことで、これまで使ってきたボタンなどのコントロールも一種の描画オブジェクトであると考えることもできます。ボタンのようなコントロールの他に、WPF では線や長方形、楕円などの形を表現するオブジェクトも用意しています。当然、形を現すオブジェクトも UIElement を継承しているため、コンテンツとして利用したり、パネルの子要素になることができるのです。

つまり、これまでは再描画用のイベントハンドラから、デバイスに対して DrawLine() や DrawRectangle() などのメソッドを使って直接レンダリングを行っていたのに対し、WPF では、Line オブジェクトや Rectangle オブジェクトを Canvas などのパネルコントロールに追加して線や矩形などの図形を描画することができます。図形の情報を保持しているオブジェクトが WPF によって描画されるという仕組みになるため、描画後も図形の情報が保持されるという点で、従来よりもはるかに効率的に複雑な描画を実現できます。

4.1.2 「形」オブジェクト

一般的な図形を表すクラスは、全て System.Windows.Shapes.Shape クラスから派生しています。Shape クラスもまた、UIElement からは制しているクラスなので、Shape を継承するクラスも同様に描画要素としてコンテンツとして表示したり、パネルの子要素に設定することができることになります。

System.Windows.Shapes.Shape クラス
System.Object 
   System.Windows.Threading.DispatcherObject 
     System.Windows.DependencyObject 
       System.Windows.Media.Visual 
         System.Windows.UIElement 
           System.Windows.FrameworkElement 
            System.Windows.Shapes.Shape
[LocalizabilityAttribute(LocalizationCategory.None, Readability=Readability.Unreadable)] 
public abstract class Shape : FrameworkElement

Shape 自身は abstract クラスなのでインスタンスを生成することができません。Shape は形を表す抽象的な型であり、どのような形を表現するのかは派生クラスに委ねられています。Shape は、形の輪郭や内部をどのように塗りつぶすカなどを表す情報をプロパティで公開しているため、どのような形であれ基本的な操作方法は Shape クラスで共通しています。