スマートフォン・ジン | Smartphone-Zine

引っ越し先→ https://smartphone-zine.com/

011:線を描画する

線を描画する

線を描画する関数には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
;
}


きょうはここまでです。