図形の描画

図形の描画関数

図形の描画関数には次のようなものがあります。
表の中の図は,青色のペン,黄色のブラシの時の描画例です。

関数図形の種類描画例
Rectangle長方形長方形
FillRect長方形 (輪郭なし)長方形 (輪郭なし)
FrameRect長方形 (輪郭のみ)長方形 (輪郭のみ)
Ellipse楕円楕円
RoudRect角の丸い長方形角の丸い長方形
Pieパイ形パイ形
Chord弦形弦形
Polygon, PolyPolygon多角形,複数の多角形多角形,複数の多角形

長方形の描画

次のような長方形を描画するプログラムを作ります。

作例

#include <windows.h>

LRESULT CALLBACK WndProc(
    HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(
    HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpszCmdLine, int nCmdShow)
{
    TCHAR szAppName[] = TEXT("TestApp");
    WNDCLASS wc;
    HWND hwnd;
    MSG msg;

    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = szAppName;

    if (!RegisterClass(&wc)) return 0;

    hwnd = CreateWindow(
        szAppName, TEXT(""),
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT,
        CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, NULL,
        hInstance, NULL);

    if (!hwnd) return 0;

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while (GetMessage(&msg, NULL, 0, 0) > 0) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

LRESULT CALLBACK WndProc(
    HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;

    switch (uMsg) {
    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);       // 描画開始
        Rectangle(hdc, 50, 50, 200, 150);  // 描画
        EndPaint(hwnd, &ps);               // 描画終了
        return 0;

    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }

    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

長方形の描画

長方形の描画に用いた関数は,次の Rectangle 関数です。

Rectangle 関数 [MSDN]

長方形を描画します。

BOOL Rectangle(
    HDC hdc,    // デバイスコンテキストへのハンドル
    int left,   // 左上端の x 座標
    int top,    // 左上端の y 座標
    int right,  // 右下端の x 座標
    int bottom  // 右下端の y 座標
);

第 1 引数の hdc には,BeginPaint 関数などで取得したデバイスコンテキストへのハンドルを指定します。

第 2 引数以降には,長方形の左上端,右下端の座標をクライアント座標で指定します。

クライアント座標系

次の図は,式 Rectangle(hdc, 2, 2, 8, 6) によって描画される長方形です。
このように,GDI 関数で描画される図形は,始点を含み終点を含みません。

長方形の例