線を描画する
線を描画する関数にはLineTo関数のほかにPolyline関数があります。
Polyline関数は、点の情報を格納した構造体の配列を渡すと、連続した線分を描画してくれる関数です。
LineTo関数と違い、開始座標を指定する必要はありません。開始座標も含め、配列で渡します。
また、現在の位置の更新も行いません。
BOOL Polyline(
HDC hdc, // デバイスコンテキストのハンドル
CONST POINT *lppt, // 端点からなる配列
int cPoints // 配列内の点の数
);
hdc:デバイスコンテキストのハンドルを指定します。
lppt:複数のPOINT構造体からなる配列へのポインタを指定します。
cPoints:配列内の点の数を指定します。
ソースは次のようになります。
static POINT lpPoint[4];
lpPoint[0].x = 10;
lpPoint[0].y = 10;
lpPoint[1].x = 100;
lpPoint[1].y = 10;
lpPoint[2].x = 10;
lpPoint[2].y = 100;
lpPoint[3].x = 100;
lpPoint[3].y = 100;
Polyline(hdc, lpPoint, 4);
何度もLineTo関数を呼び出すより、スマートになりましたね。
// gdi002.cpp
//
// 簡単なグラフィックス(線を引く)
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
HWND InitInstance(HINSTANCE, int);
WCHAR szClassName[] = _T("gdi001"); // ウィンドウクラス。UNICODEとしての文字列定数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine,int nShowCmd)
{
MSG msg;
BOOL bRet;
HWND hWnd;
if (!InitApp(hInstance))
return FALSE;
if (!(hWnd = InitInstance(hInstance,nShowCmd)))
return FALSE;
while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
if (bRet == -1){
break;
} else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int)msg.wParam;
}
// ウィンドウクラスの登録
ATOM InitApp(HINSTANCE hInst)
{
WNDCLASS wc;
wc.style = CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc = WndProc; // プロシージャ名
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;
wc.hIcon = NULL; // 未サポート
wc.hCursor = NULL; // 未サポート
wc.hbrBackground= (HBRUSH) COLOR_WINDOW;
wc.lpszMenuName = NULL; // 未サポート
wc.lpszClassName=(LPCTSTR) szClassName;
return (RegisterClass(&wc));
}
// ウィンドウの生成
HWND InitInstance(HINSTANCE hInst, int nShowCmd)
{
HWND hWnd;
hWnd = CreateWindow(szClassName,_T("Window Title"),
WS_CLIPCHILDREN, // ウィンドウの種類
CW_USEDEFAULT, // x座標
CW_USEDEFAULT, // y座標
CW_USEDEFAULT, // 幅
CW_USEDEFAULT, // 高さ
NULL, // 親ウィンドウのハンドル。親を作るのでNULL
NULL, // メニューハンドルまたは子ウィンドウID
hInst, // インスタンスハンドル
NULL);
if (!hWnd)
return FALSE;
ShowWindow(hWnd, nShowCmd
UpdateWindow(hWnd
return hWnd;
}
// ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
PAINTSTRUCT ps;
HDC hdc;
HGDIOBJ hPen,hOldPen;
static POINT lpPoint[4];
switch (msg){
case WM_CREATE:
// 初期化処理など
lpPoint[0].x = 10;
lpPoint[0].y = 10;
lpPoint[1].x = 100;
lpPoint[1].y = 10;
lpPoint[2].x = 10;
lpPoint[2].y = 100;
lpPoint[3].x = 100;
lpPoint[3].y = 100;
break;
case WM_PAINT:
hdc = BeginPaint(hWnd,&ps); // 描画処理を開始します。
hPen = CreatePen(PS_SOLID, 1, RGB(0, 128, 0));
hOldPen = SelectObject(hdc, hPen);
Polyline(hdc, lpPoint, 4);
SelectObject(hdc, hOldPen);
DeleteObject(hPen);
EndPaint(hWnd,&ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, msg, wp, lp));
}
return 0;
}
きょうはここまでです。