Desenhar uma Linha
Este tópico demonstra como desenhar uma linha usando o GDI Plus.
Para desenhar uma linha no Windows GDI+, você precisa de um objeto Graphics , um objeto Pen e um objeto Color . O objeto Graphics fornece o método DrawLine e o objeto Pen contém atributos da linha, como cor e largura. O endereço do objeto Pen é passado como um argumento para o método DrawLine .
O programa a seguir, que desenha uma linha de (0, 0) a (200, 100), consiste em três funções: WinMain, WndProc e OnPaint. As funções WinMain e WndProc fornecem o código fundamental comum à maioria dos aplicativos do Windows. Não há nenhum código GDI+ na função WndProc . A função WinMain tem uma pequena quantidade de código GDI+, ou seja, as chamadas necessárias para GdiplusStartup e GdiplusShutdown. O código GDI+ que realmente cria um objeto Graphics e desenha uma linha está na função OnPaint .
A função OnPaint recebe um identificador para um contexto de dispositivo e passa esse identificador para um construtor gráfico . O argumento passado para o construtor Pen é uma referência a um objeto Color . Os quatro números passados para o construtor de cores representam os componentes alfa, vermelho, verde e azul da cor. O componente alfa determina a transparência da cor; 0 é totalmente transparente e 255 é totalmente opaco. Os quatro números passados para o método DrawLine representam o ponto inicial (0, 0) e o ponto final (200, 100) da linha.
#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
Observe a chamada para GdiplusStartup na função WinMain . O primeiro parâmetro da função GdiplusStartup é o endereço de um ULONG_PTR. GdiplusStartup preenche essa variável com um token que mais tarde é passado para a função GdiplusShutdown . O segundo parâmetro da função GdiplusStartup é o endereço de uma estrutura GdiplusStartupInput . O código anterior depende do construtor GdiplusStartupInput padrão para definir os membros da estrutura adequadamente.