Win32API関数を使って、ウィンドウに線や円を描くことができます。 そして、「ウィンドウに線を描け」のように使います。 実は、描画する対象を変えることができます。 「プリンタに線を描け」とか「メモリに線を描け」です。 描画する対象を、グラフィック出力対象とか、グラフィック・デバイス・コンテキストといいます。 そして、これらは HDC型のハンドルという数値で扱います。 このハンドルの値がわかればウィンドウに描画できるわけです。 このような Win32API関数を Graphics Device Interface (GDI) といいます。
プロジェクト名は "win141" とします。 雛形である、"MyApp.h"、"win137.rc"、"resource.h" をコピーします。 次に、"win137.rc" をリネームして "win141.rc" とします。
// // MyApp.h // class MyApp : public MyMainWnd{ public: // WM_PAINT void wmPaint(HDC hdc){ // 直線を描く MoveToEx(hdc, 10, 10, NULL); LineTo(hdc, 100, 100); } };
実行画面です。
case WM_PAINT: PAINTSTRUCT ps; BeginPaint(hWnd, &ps); // 直線を描く---------------------------- MoveToEx(ps.hdc, 10, 10, NULL); LineTo(ps.hdc, 100, 100); //--------------------------------------- EndPaint(hWnd, &ps); break;
線や円を描くのは、WM_PAINT メッセージの中で行います。
線は、MoveToEx関数と LineTo関数を使います。 MoveToEx関数で始点、LineTo関数で終点を指定して線を描きます。 線を描き終わると、終点は始点となります。
ところで、どこへ描くのか指定しなければいけません。 メモリにも描くことができます。 それはメモリデバイスの所で説明します。 今は、メインウィンドウ画面です。 ps.hdc =画面なのです。 これで画面に描画できます。 画面を取得する方法は、次のようにします。
①PAINTSTRUCT構造体の変数 ps を用意する。
②BeginPaint関数を実行する。
このとき、引数に &ps を代入します。
これで、ps に画面の情報が入ります。
③描画が終わったら、EndPaint関数を実行する。
ですから、線を描くのは、BeginPaint関数とEndPaint関数の間で行います。 ちなみに、PAINTSTRUCT構造体は次のように定義されています。
typedef struct tagPAINTSTRUCT { HDC hdc; BOOL fErase; RECT rcPaint; BOOL fRestore; BOOL fIncUpdate; BYTE rgbReserved[32]; } PAINTSTRUCT;
この hdc にメインウィンドウ画面のハンドルが代入されます。 また、BeginPaint関数の返値も同じ値ですから、それを使うこともできます。
もう一度、雛形の説明をします。
MyMainWndクラスをつくります。 描画用に、"wmPaint" メソッドを作ります。 virtual をつけ仮想関数にします。
#pragma once
class MyMainWnd{
public:
virtual void wmPaint(HDC hdc){}
};
次は、MyMainWndクラスを継承した MyAppクラスを作ります。 そのファイル名は、"MyApp.h" とします。 そして、"MyDlgMain.cpp" に次のように書きます。
// // Windows プログラム // #include "MyApp.h" // グローバル変数 MyApp wnd;
そして、次のように "MyDlgMain.cpp" のプロシージャに書きます。
case WM_SIZE:
InvalidateRect(hWnd, NULL, FALSE);
return (INT_PTR)TRUE;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
wnd.wmPaint(hdc);
EndPaint(hWnd, &ps);
return (INT_PTR)TRUE;
ですから、"MyApp.h"で wmPaint メソッドを書けば描画できます。 ところで、"WM_SIZE" メッセージは、ウィンドウの大きさが変わったときに送られてくるメッセージです。 そのとき、再描画するようにします。