fc2ブログ

まったり開発日誌

embossの工具箱(J2EE Java2 Linux Zaurus C++)

2008年08月

  1. 014:多角形を描く(08/16)
  2. 013:円を描く(08/10)

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(&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関数 :複数の閉じた多角形を描画する
 
 
本日はここまで。
 
 
スポンサーサイト



テーマ:Windows Mobile - ジャンル:コンピュータ

  1. 2008/08/16(土) 14:04:20|
  2. WindowsMobileではじめるWin32APIプログラミング入門
  3. | トラックバック:0
  4. | コメント:0

013:円を描く

円を描く
 
四角形の次は、円を描いてみましょう。
 
円を描く関数にはEllipse関数を使います。
 
BOOL Ellipse(
  HDC hdc,        // デバイスコンテキストのハンドル
  int nLeftRect,  // 長方形の左上隅の x 座標
  int nTopRect,   // 長方形の左上隅の y 座標
  int nRightRect, // 長方形の右下隅の x 座標
  int nBottomRect // 長方形の右下隅の y 座標
);
座標は、描きたい円または楕円の外接長方形を指定します。好きなブラシで円を書き、ブラシで円の内部を塗りつぶすことが出来ます。
関数が成功すると、0 以外の値が返ります。この関数は、現在の位置の使用や更新はしません。
 
 
※WindowsAPIにはArc関数・AngleArc関数(円弧を描く)、Pie関数(扇形を描く)、Chord関数(弓形を描く)等がありますが、残念なことにWindows Mobileではサポートされていないようです。
円弧が描けないということは、色つき円グラフなんてものも簡単には描けないということですので、WindowsMobileの描画能力は低いという印象ですね。
 
ソースコードです。
 

// gdi005.cpp
//
// 楕円を描く

#include <windows.h
>

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

WCHAR szClassName[] = _T("gdi005");
// ウィンドウクラス。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,hBrush,hOldBrush
;
   static POINT lpPoint[4
];

   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);          
// 作成したペンを選択する
           Ellipse(hdc, 0, 0, 100, 100
);
           Ellipse(hdc, 0, 100, 100, 250
);
           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
;
}

 

 

 今日はここまでです。

 

テーマ:Windows Mobile - ジャンル:コンピュータ

  1. 2008/08/10(日) 23:50:17|
  2. WindowsMobileではじめるWin32APIプログラミング入門
  3. | トラックバック:0
  4. | コメント:0

RSSフィード

カレンダー

07 | 2008/08 | 09
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 - - - - - -

カテゴリー

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

リンク

このブログをリンクに追加する

メールフォーム

名前:
メール:
件名:
本文: