CWndh = GetDlgItem(IDC_PICTURE);
GetDlgItem は窓へのポインタを返すため、格納場所を CWnd* で宣言しておく必要がある。 ポインタというとわかりにくい気がするが、ピクチャーコントロールはメモリー上のある定められた場所に置かれていて,ポインタは置いてある場所 (アドレス) を値として持っている変数だ。つまり上の命令で、ピクチャー コントロールの置き場所がわかったわけだ。
これで窓のオブジェクトが獲得できたが、次にこれが表すデバイス コンテキストを獲得するには CWnd クラスのメンバ関数 GetDC を使用する。
CDC 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)に打っていく。