선 그리기
이 항목에서는 GDI Plus를 사용하여 선을 그리는 방법을 보여 줍니다.
Windows GDI+에서 선을 그리려면 Graphics 개체, Pen 개체 및 Color 개체가 필요합니다. Graphics 개체는 DrawLine 메서드를 제공하며 Pen 개체는 선의 특성(예: 색 및 너비)을 보유합니다. Pen 개체의 주소는 DrawLine 메서드에 인수로 전달됩니다.
(0, 0)에서 (200, 100)까지 선을 그리는 다음 프로그램은 WinMain, WndProc 및 OnPaint의 세 가지 함수로 구성됩니다. WinMain 및 WndProc 함수는 대부분의 Windows 애플리케이션에 공통적인 기본 코드를 제공합니다. WndProc 함수에는 GDI+ 코드가 없습니다. WinMain 함수에는 GDI+ 코드, 즉 GdiplusStartup 및 GdiplusShutdown에 대한 필수 호출이 있습니다. 실제로 Graphics 개체를 만들고 선을 그리는 GDI+ 코드는 OnPaint 함수에 있습니다.
OnPaint 함수는 디바이스 컨텍스트에 대한 핸들을 수신하고 해당 핸들을 그래픽 생성자에 전달합니다. 펜 생성자에 전달된 인수는 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 함수의 두 번째 매개 변수는 GdiplusStartupInput 구조체의 주소입니다. 위의 코드는 구조체 멤버를 적절하게 설정하기 위해 기본 GdiplusStartupInput 생성자를 사용합니다.