. 1(Win32API)(C言語) - 超初心者向けプログラミング入門
1(Win32API)(C言語) - 超初心者向けプログラミング入門
1(Win32API)(C言語) - 超初心者向けプログラミング入門

図形の描画1

BOOL MoveToEx( HDC hdc, int x, int y, LPPOINT lppt ); 現在の座標を(x, y)にセットし、以前の座標をlpptに格納する。 成功した場合は0以外を、失敗した場合は0を返す。 BOOL LineTo( HDC hdc, int x, int y ); 現在位置から座標(x, y)まで直線を描画する。 現在位置は座標(x, y)に更新される。 成功した場合は0以外を、失敗した場合は0を返す。

線は「座標Aから座標Bまでの直線を描画する」という手順で行います。 そのためには、まず起点となる「現在の座標」を MoveToEx 関数で設定します。 引数の lppt にはMoveToEx関数を実行する直前の現在位置が格納されますが、必要なければ NULL を指定することもできます。

線の終端座標は LineTo 関数で指定します。 LineTo関数は指定の座標の直前までを描画します。 (指定座標のピクセルには描画されません) 描画後、現在位置は指定の座標に更新されます。

サンプルコード //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) < HDC hdc; PAINTSTRUCT ps; switch (message) < case WM_PAINT: //ウィンドウの描画 hdc = BeginPaint(hWnd, &ps); for (int i = 0; i < 256; i++) < SetPixel(hdc, i + 10, 10, RGB(i, 255 - i, 0)); >MoveToEx(hdc, 10, 20, NULL); LineTo(hdc, 110, 20); LineTo(hdc, 110, 70); LineTo(hdc, 210, 70); EndPaint(hWnd, &ps); break; case WM_DESTROY: //ウィンドウの破棄 PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); > return 0; >

連続した直線の描画

PolylineTo関数、Polyline関数

線は LineTo 関数を使えば描けますが、折れ線グラフのような連続した直線は PolylineTo 関数や Polyline 関数を使用したほうがコードが簡単になります。 これらの関数は座標情報を表す POINT 構造体の配列を使用します。

BOOL PolylineTo( HDC hdc, const POINT *apt, DWORD cpt ); 現在位置から座標の配列aptの要素を順に直線でcpt本描画する。 成功した場合は0以外を、失敗した場合は0を返す。 BOOL Polyline( HDC hdc, const POINT *apt, int cpt ); 座標の配列aptの要素を順に直線でcpt本描画する。 成功した場合は0以外を、失敗した場合は0を返す。 typedef struct tagPOINT LONG x; LONG y; > POINT, *PPOINT; 座標情報を格納する構造体。

第二引数 apt はPOINT構造体の配列を指定します。 第三引数 cpt は第二引数の配列の要素数を指定します。

両者の違いは「現在の座標」を使用するかしないかです。 現在の座標を使用しないPolyline関数では必ず2つ以上の座標情報が必要になります。 (配列の先頭要素の座標が起点となる)

//ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) < HDC hdc; PAINTSTRUCT ps; POINT points[5] = < , , , , >; switch (message) < case WM_PAINT: //ウィンドウの描画 hdc = BeginPaint(hWnd, &ps); PolylineTo(hdc, points, 5); //Polyline(hdc, points, 5); EndPaint(hWnd, &ps); break; case WM_DESTROY: //ウィンドウの破棄 PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); >return 0; >

左がPolylineTo関数、右がPolyline関数の実行結果です。 PolylineTo関数は現在位置を起点とするため、初期値である(0, 0)の位置から描画が開始されています。 Polyline関数は配列の先頭要素を起点とするので、(10, 10)の位置から描画が開始されます。

PolyPolyline関数

連続した直線を複数個描画する PolyPolyline という関数もあります。

BOOL PolyPolyline( HDC hdc, const POINT *apt, const DWORD *asz, DWORD csz ); 連続した直線を複数個描画する。

第二引数 apt はPOINT構造体の配列です。

第三引数 asz はDWORD型(unsigned long型)の配列で、この配列の要素数が「連続した直線」の数になります。 配列の各要素には「連続した直線」が持つ頂点の数を指定します。 そのため、各要素は必ず2以上の値が必要です。 また、各要素を合計した値は配列aptの要素数以下にする必要があります。

第四引数 csz は配列 asz の要素数の指定です。 実際に描画する「連続した直線」の数の指定となります。

//ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) < HDC hdc; PAINTSTRUCT ps; POINT points[] = < , , , , , , >; DWORD vertices[] = < 5, 2 >; switch (message) < case WM_PAINT: //ウィンドウの描画 hdc = BeginPaint(hWnd, &ps); PolyPolyline(hdc, points, vertices, 2); EndPaint(hWnd, &ps); break; case WM_DESTROY: //ウィンドウの破棄 PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); >return 0; >
📎📎📎📎📎📎📎📎📎📎