다음을 통해 공유


선 그리기

이 항목에서는 GDI Plus를 사용하여 선을 그리는 방법을 보여 줍니다.

Windows GDI+에서 선을 그리려면 Graphics 개체, Pen 개체 및 Color 개체가 필요합니다. Graphics 개체는 DrawLine 메서드를 제공하며 Pen 개체는 선의 특성(예: 색 및 너비)을 보유합니다. Pen 개체의 주소는 DrawLine 메서드에 인수로 전달됩니다.

(0, 0)에서 (200, 100)까지 선을 그리는 다음 프로그램은 WinMain, WndProcOnPaint의 세 가지 함수로 구성됩니다. WinMainWndProc 함수는 대부분의 Windows 애플리케이션에 공통적인 기본 코드를 제공합니다. WndProc 함수에는 GDI+ 코드가 없습니다. WinMain 함수에는 GDI+ 코드, 즉 GdiplusStartupGdiplusShutdown에 대한 필수 호출이 있습니다. 실제로 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 생성자를 사용합니다.