>> WINAPI入門トップに戻る
今回は図形の描画について説明します。
ここでは三つほど図形を描画するための関数について説明します。
まず一つ目は、四角形を描く為の関数で、Rectangle関数です。
指定する座標はクライアント領域内での座標を指定します。
他は特に説明いらないですよね?
次に円形を描く為の関数として、Ellipse関数があります。
これもRectangle関数と同じですね。
ただし円形なので、この座標で囲まれた領域の辺に
ぴったりはまる円形が描画されるという意味になります。
最後に、四角形の角に丸みを持たせた図形を描画するために、RoundRect関数を使います。
第6、7引数は、角の丸み部分の幅と高さを指定します。
これらの関数を使って描画したものが以下のコードです。
これを実行すると、以下のようなウィンドウが表示されます。

上から順番に、四角形、円形、丸みを帯びた四角形の順に描画しています。
引数で指定したとおりの場所に描画されていますよね?
ちなみに描画される色についてですが、
これは現在設定されているペンとブラシの色が適用されます。
ペンが外側の枠の色、ブラシが枠の中の色を表します。
今回は何も設定していない状態で描画したので、真っ白になっています。
次回はこのペンとブラシを作成して、色を変えて描画してみます。
>> 【ペンとブラシの作成】に進む
>> WINAPI入門トップに戻る
図形の描画
ここでは三つほど図形を描画するための関数について説明します。
まず一つ目は、四角形を描く為の関数で、Rectangle関数です。
BOOL Rectangle(
HDC hdc, // デバイスコンテキストのハンドル
int nLeftRect, // 長方形の左上隅の x 座標
int nTopRect, // 長方形の左上隅の y 座標
int nRightRect, // 長方形の右下隅の x 座標
int nBottomRect // 長方形の右下隅の y 座標
);
HDC hdc, // デバイスコンテキストのハンドル
int nLeftRect, // 長方形の左上隅の x 座標
int nTopRect, // 長方形の左上隅の y 座標
int nRightRect, // 長方形の右下隅の x 座標
int nBottomRect // 長方形の右下隅の y 座標
);
指定する座標はクライアント領域内での座標を指定します。
他は特に説明いらないですよね?
次に円形を描く為の関数として、Ellipse関数があります。
BOOL Ellipse(
HDC hdc, // デバイスコンテキストのハンドル
int nLeftRect, // 長方形の左上隅の x 座標
int nTopRect, // 長方形の左上隅の y 座標
int nRightRect, // 長方形の右下隅の x 座標
int nBottomRect // 長方形の右下隅の y 座標
);
HDC hdc, // デバイスコンテキストのハンドル
int nLeftRect, // 長方形の左上隅の x 座標
int nTopRect, // 長方形の左上隅の y 座標
int nRightRect, // 長方形の右下隅の x 座標
int nBottomRect // 長方形の右下隅の y 座標
);
これもRectangle関数と同じですね。
ただし円形なので、この座標で囲まれた領域の辺に
ぴったりはまる円形が描画されるという意味になります。
最後に、四角形の角に丸みを持たせた図形を描画するために、RoundRect関数を使います。
BOOL RoundRect(
HDC hdc, // デバイスコンテキストのハンドル
int nLeftRect, // 長方形の左上隅の x 座標
int nTopRect, // 長方形の左上隅の y 座標
int nRightRect, // 長方形の右下隅の x 座標
int nBottomRect, // 長方形の右下隅の y 座標
int nWidth, // 楕円の幅
int nHeight // 楕円の高さ
);
HDC hdc, // デバイスコンテキストのハンドル
int nLeftRect, // 長方形の左上隅の x 座標
int nTopRect, // 長方形の左上隅の y 座標
int nRightRect, // 長方形の右下隅の x 座標
int nBottomRect, // 長方形の右下隅の y 座標
int nWidth, // 楕円の幅
int nHeight // 楕円の高さ
);
第6、7引数は、角の丸み部分の幅と高さを指定します。
これらの関数を使って描画したものが以下のコードです。
001 | #include <windows.h> |
002 | #include <stdio.h> |
003 |
004 | #define MSG(m) {\ |
005 | MessageBoxA(NULL,m,NULL,MB_OK);} |
006 |
007 | //ウィンドウハンドル |
008 | HWND hwnd; |
009 | //インスタンスハンドル |
010 | HINSTANCE hinst; |
011 |
012 | //ウィンドウ横幅 |
013 | #define WIDTH 500 |
014 | #define HEIGHT 300 |
015 |
016 |
017 |
018 | LRESULT CALLBACK WinProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) |
019 | { |
020 | HDC hdc; |
021 |
022 |
023 | PAINTSTRUCT ps; |
024 |
025 | RECT rect; |
026 |
027 | //左上が(10,10)、右下が(200,200)の領域を指定 |
028 | rect.left=10; |
029 | rect.top=10; |
030 | rect.right=200; |
031 | rect.bottom=200; |
032 | |
033 |
034 | switch (msg){ |
035 | case WM_DESTROY: |
036 | PostQuitMessage(0); |
037 | return 0; |
038 |
039 | case WM_PAINT: |
040 |
041 | hdc=BeginPaint(hwnd,&ps); |
042 | |
043 | //四角形を描画 |
044 | Rectangle(hdc,0,0,50,50); |
045 |
046 | //円形を描画 |
047 | Ellipse(hdc,0,50,50,100); |
048 |
049 | //角が丸い四角形を描画 |
050 | RoundRect(hdc,0,100,50,150,10,10); |
051 | |
052 |
053 | EndPaint(hwnd,&ps); |
054 |
055 | return 0; |
056 |
057 | |
058 | } |
059 | return DefWindowProc(hwnd,msg,wp,lp); |
060 | } |
061 |
062 | int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) |
063 | { |
064 | MSG msg; |
065 | WNDCLASS wc; |
066 |
067 | wc.style=CS_HREDRAW | CS_VREDRAW; |
068 | wc.lpfnWndProc=WinProc; |
069 | wc.cbClsExtra=wc.cbWndExtra=0; |
070 | wc.hInstance=hInstance; |
071 | wc.hCursor=wc.hIcon=NULL; |
072 | wc.hbrBackground=( HBRUSH )GetStockObject(BLACK_BRUSH); |
073 | wc.lpszClassName= "test" ; |
074 | wc.lpszMenuName=NULL; |
075 | |
076 | if (!RegisterClass(&wc)){ |
077 | MSG( "クラスの登録失敗" ); |
078 | return -1; |
079 | } |
080 |
081 | hwnd=CreateWindowA( "test" , "テストウィンドウ" ,WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, |
082 | 0,0,400,400,NULL,NULL,hInstance,NULL); |
083 |
084 |
085 | if (hwnd==NULL){ |
086 | MSG( "ウィンドウ作成失敗" ); |
087 | return -1; |
088 | } |
089 |
090 | //インスタンスハンドル |
091 | hinst=hInstance; |
092 |
093 | //エラーチェック用変数 |
094 | int check; |
095 |
096 | while (check=GetMessage(&msg,NULL,0,0)){ |
097 | if (check==-1){ |
098 | break ; |
099 | } |
100 | DispatchMessage(&msg); |
101 | } |
102 |
103 | //クラス解放 |
104 | UnregisterClass( "test" ,hinst); |
105 |
106 | return 0; |
107 |
108 | } |
これを実行すると、以下のようなウィンドウが表示されます。

上から順番に、四角形、円形、丸みを帯びた四角形の順に描画しています。
引数で指定したとおりの場所に描画されていますよね?
ちなみに描画される色についてですが、
これは現在設定されているペンとブラシの色が適用されます。
ペンが外側の枠の色、ブラシが枠の中の色を表します。
今回は何も設定していない状態で描画したので、真っ白になっています。
次回はこのペンとブラシを作成して、色を変えて描画してみます。
>> 【ペンとブラシの作成】に進む
>> WINAPI入門トップに戻る