直線の描画
このトピックでは、GDI Plus を使用して線を描画する方法について説明します。
Windows GDI+ で線を描画するには、 Graphics オブジェクト、 Pen オブジェクト、 Color オブジェクトが 必要です。 Graphics オブジェクトは DrawLine メソッドを提供し、Pen オブジェクトは色や幅などの線の属性を保持します。 Pen オブジェクトのアドレスは、引数として DrawLine メソッドに渡されます。
(0, 0) から (200, 100) までの行を描画する次のプログラムは、 WinMain、 WndProc、 OnPaint の 3 つの関数で構成されます。 WinMain 関数と WndProc 関数は、ほとんどの Windows アプリケーションに共通する基本的なコードを提供します。 WndProc 関数に GDI+ コードはありません。 WinMain 関数には、少量の GDI+ コード (つまり、GdiplusStartup と GdiplusShutdown への必要な呼び出し) があります。 実際に Graphics オブジェクトを作成し、線を描画する GDI+ コードは OnPaint 関数にあります。
OnPaint 関数は、デバイス コンテキストへのハンドルを受け取り、そのハンドルを Graphics コンストラクターに渡します。 Pen コンストラクターに渡される引数は、Color オブジェクトへの参照です。 カラー コンストラクターに渡される 4 つの数値は、色のアルファ、赤、緑、青の各要素を表します。 アルファ成分は、色の透明度を決定します。0 は完全に透明で、255 は完全に不透明です。 DrawLine メソッドに渡される 4 つの数値は、始点 (0, 0) と行の終了点 (200, 100) を表します。
#include <stdafx.h>
#include <windows.h>
#include <objidl.h>
#include <gdiplus.h>
using namespace Gdiplus;
#pragma comment (lib,"Gdiplus.lib")
VOID OnPaint(HDC hdc)
{
Graphics graphics(hdc);
Pen pen(Color(255, 0, 0, 255));
graphics.DrawLine(&pen, 0, 0, 200, 100);
}
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT iCmdShow)
{
HWND hWnd;
MSG msg;
WNDCLASS wndClass;
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
// Initialize GDI+.
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
wndClass.style = CS_HREDRAW | CS_VREDRAW;
wndClass.lpfnWndProc = WndProc;
wndClass.cbClsExtra = 0;
wndClass.cbWndExtra = 0;
wndClass.hInstance = hInstance;
wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndClass.lpszMenuName = NULL;
wndClass.lpszClassName = TEXT("GettingStarted");
RegisterClass(&wndClass);
hWnd = CreateWindow(
TEXT("GettingStarted"), // window class name
TEXT("Getting Started"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL); // creation parameters
ShowWindow(hWnd, iCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
GdiplusShutdown(gdiplusToken);
return msg.wParam;
} // WinMain
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
switch(message)
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
OnPaint(hdc);
EndPaint(hWnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
} // WndProc
WinMain 関数での GdiplusStartup の呼び出しに注意してください。 GdiplusStartup 関数の最初のパラメーターは、ULONG_PTRのアドレスです。 GdiplusStartup は、その変数に、後で GdiplusShutdown 関数に渡されるトークンを入力します。 GdiplusStartup 関数の 2 番目のパラメーターは、GdiplusStartupInput 構造体のアドレスです。 上記のコードは、既定の GdiplusStartupInput コンストラクターに依存して、構造体メンバーを適切に設定します。