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

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

014:多角形を描く

多角形を描く
多角形を描くには、Polygon関数を使用します。
 
BOOL Polygon(
  HDC
hdc,                // デバイスコンテキストのハンドル
  CONST POINT *lpPoints// ポリゴンの頂点
  int nCount              // ポリゴンの頂点の数
);
 
hdcにはデバイスコンテキストハンドルを指定します。
lpPointsには多角形の頂点を格納したPOINT構造体の配列を指定します。
nCountには、lpPointsに格納した頂点の数を指定します。この値は、2 以上である必要があります。
ちなみに、頂点数が 2 の場合は、単に直線が引かれることになります。
 

// gdi007.cpp
//
// 多角形の描画

#include <windows.h
>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM
);
ATOM InitApp(HINSTANCE
);
HWND InitInstance(HINSTANCE, int
);

WCHAR szClassName[] = _T("gdi007");
// ウィンドウクラス。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(&am p;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,hBrush,hOldBrush
;
   static POINT lpPoint[5
]={
       {120, 5}, {195, 225}, {5, 90}, {240, 90}, {50, 225
}
   
};



   switch (msg
){
       case WM_PAINT
:
           hdc = BeginPaint(hWnd,&ps);     
// 描画処理を開始します。

           hPen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));  
// 赤色のペンを作成
           hOldPen = SelectObject(hdc, hPen);              
// 作成したペンを選択する
           hBrush = CreateSolidBrush(RGB(0, 255, 0));      
// 緑色のブラシを作成
           hOldBrush = SelectObject(hdc, hBrush);          
// 作成したペンを選択する

           Polygon(hdc, lpPoint, 5
);

           SelectObject(hdc, hOldPen);                     
// ペンを元に戻す
           SelectObject(hdc, hOldBrush);                   
// ブラシを元に戻す
           DeleteObject(hPen);                             
// 作成したペンを削除
           DeleteObject(hBrush);                           
// 作成したブラシを削除

           EndPaint(hWnd,&ps);             
// 描画処理を終了します。
           break
;
       case WM_DESTROY
:
           PostQuitMessage(0
);
           break
;
       default
:
           return (DefWindowProc(hWnd, msg, wp, lp
));
   
}
   return 0
;
}

 
WindowsMobileの場合、多角形の内部の塗りつぶしモードを指定するSetPolyFillMode関数は使えないようです。
 
多角形に関して使えない関数は、
SetPolyFillMode関数 :塗りつぶしモードの指定
GetPolyFillMode関数 :塗りつぶしモードの取得
PolyPolygon関数 :複数の閉じた多角形を描画する
 
 
本日はここまで。