ピクチャコントロールへの描画の基礎知識

Visual C++で描画するには,デバイス コンテキスト オブジェクトを用いる。 デバイス コンテキスト(DC)は、ディスプレイやプリンタなどのデバイスの描画属性に関する情報を収容した Windows のデータ構造である。 言い換えると,DCは絵の具、ペン、ブラシ、文字フォントなどの文房具の箱と考えられる。 そこで、ピクチャー コントロールに描画するためには、ピクチャー コントロールを表すデバイス コンテキストが必要となる。そのためにまずピクチャー コントロール自身(CWnd クラス(窓クラス)のオブジェクト) を次のようにして獲得する。 ただし,ここではピクチャコントロールのIDをIDC_PICTUREとする。

CWnd$ \ast$h = GetDlgItem(IDC_PICTURE);

GetDlgItem は窓へのポインタを返すため、格納場所を CWnd* で宣言しておく必要がある。 ポインタというとわかりにくい気がするが、ピクチャーコントロールはメモリー上のある定められた場所に置かれていて,ポインタは置いてある場所 (アドレス) を値として持っている変数だ。つまり上の命令で、ピクチャー コントロールの置き場所がわかったわけだ。

これで窓のオブジェクトが獲得できたが、次にこれが表すデバイス コンテキストを獲得するには CWnd クラスのメンバ関数 GetDC を使用する。

CDC$ \ast$ pDC=h-$ >$GetDC();

h-$ >$GetDC() の表記は慣れていないと理解しづらいが、 「h の GetDC( )」の意味で、1つの関数だ。あるいは h が場所 (ポインタ) だから 「h にある GetDC( )」の意味に捕らえてもかまわない。つまり,pDC=h-$ >$GetDC()は,ピクチャコントロールのデバイスコンテキストのポインタを取得し,それをpDCに格納している。

更に、デバイス コンテキストを自分で獲得した場合には、最後に次のようにしてデバイス コンテキストを解放しないといけない。

h-$ >$ReleaseDC(pDC);

Windows のデバイス コンテキストをあまり多く作ることができない。そのため、デバイス コンテキストを解放しないでいると Windows の方で描画が出来なくなってしまう。

次に,ピクチャー コントロールに絵を描くためには、ピクチャー コントロールの大きさを知らないといけない。このためには次のようにする。

// 長方形データを格納する場所を設定 CRect r; この宣言により,rは四角形クラスCRectのオブジェクトになる。

// クライアント領域を r に格納 h-$ >$GetClientRect(&r);

以上によって、 (r.left, r.top) が左上の頂点の座標、(r.right, r.bottom) が右下の頂点の座標となる。 r.left, r.top, r.right, r.bottom はいずれも整数値だ (単位はピクセル)。

グラフの描画

直線はMoveToとLineToで描けるが,曲線は描けない。そこで,曲線を描くには,点を打っていくという方法をとる。そのための関数として,SetPixel(x座標,y座標,RGB)がDCに用意してある。

pDC-$ >$SetPixel(int(xg),int(yg),RGB(255,0,0));
により,赤の点を座標(xg,yg)に打っていく。