CWnd h = GetDlgItem(IDC_PICTURE);
GetDlgItem は窓へのポインタを返すため、格納場所を CWnd* で宣言しておく必要があるわけだ。 ポインタというとわかりにくい気がするが、ピクチャーコントロールはメモリー上のある定められた場所に置かれていて,ポインタは置いてある場所 (アドレス) を値として持っている変数だ。つまり上の命令で、ピクチャコントロールに対応するウィンドウがhに設定できた。
これで窓のオブジェクトが獲得できたが、これが表すデバイス コンテキストを獲得するには CWnd クラスのメンバ関数 GetDC を使用する。
CDC pDC=h-GetDC();
h-GetDC() の表記は慣れていないと理解しづらいが、 「h の GetDC( )」の意味で、1つの関数だ。あるいは h が場所 (ポインタ) だから 「h にある GetDC( )」の意味に捕らえてもかまわない。つまり,pDC=h-GetDC()は,ピクチャコントロールのデバイスコンテキストのポインタを取得し,それをpDCに格納している。
更に、デバイス コンテキストを自分で獲得した場合には、最後に次のようにしてデバイス コンテキストを解放しないといけない。
h-ReleaseDC(pDC);
CPen p(PS_SOLID, 2, RGB(0, 255, 0));
次にペンの選択をする。
CPen* oldp=pDC-SelectObject(&p);
pDC-MoveTo(10,10);
pDC-LineTo(200,200);
pDC-TextOut(100,100,"直線");
使い終わったら、もとのペンに戻す
pDC-SelectObject(oldp);
Windows のデバイス コンテキストはあまり多く作ることができない。そのため、デバイス コンテキストを解放しないでいると Windows の方で描画が出来なくなってしまう。
pDC-SelectObject(oldp);
CWnd h = GetDlgItem(IDC_PICTURE);
h-Invalidate();
で,ピクチャコントロールに描かれていた図を無効にする。