Você está na página 1de 10

Tcnicas de Programao

Generalidades
So sempre preciso duas estruturas para desenhar elementos grficos:
HDC hdc;
PAINTSTRUCT ps;
Os desenhos so sempre feitos na funo responsvel por tratar as mensagens de uma
janela. A mensagem a tratar a WM_PAINT
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch(msg) {
case WM_PAINT:
// aqui que se faz os desenhos
break;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
No inicio preciso chamar a funo BeginPaint, que recebe a janela onde feito o
desenho e a estrutura ps;
No fim preciso chamar a funo EndPaint, que recebe a janela onde feito o desenho e
a estrutura ps;
Ao desenhar elementos grficos a posio que indicada relativa janela. Por
Exemplo, a posio 0, 0 o canto superior esquerdo da janela e no o canto do monitor.
Generalidades
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM
wParam, LPARAM lParam) {
HDC hdc;
PAINTSTRUCT ps;
switch(msg) {
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);

EndPaint(hwnd, &ps);
break;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
Pixels
Um pixel o menor elemento grfico que possvel desenhar
e representa um ponto no ecr.
hdc = BeginPaint(hwnd, &ps);
// desenha um pixel na posicao 100, 100 a vermelho
SetPixel(hdc, 100, 100, RGB(255, 0, 0));
EndPaint(hwnd, &ps);
Rectngulos
hdc = BeginPaint(hwnd, &ps);
// desenha um rectangulo com o canto superior esquerdo
// na posicao 50, 50 com um comprimentos de 200 e
// uma altura de 100
Rectangle(hdc, 50, 50, 200, 100);
EndPaint(hwnd, &ps);
E como se desenha um rectngulo com cores?
Tipos de Caneta
Se no for definido um tipo de caneta os elementos grficos so desenhados com uma
linha continua a preto.
O nico elemento grfico que recebe directamente a cor do desenho o pixel, todos os
outros so desenhados com os tipos de Caneta que estiverem definidos.
hdc = BeginPaint(hwnd, &ps);
HPEN hPen1 = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
HPEN hPen2 = CreatePen(PS_DASH, 1, RGB(0, 0, 0));
SelectObject(hdc, hPen1);
MoveToEx(hdc, 50, 30, NULL); // Move a caneta para a posio 50, 30
LineTo(hdc, 200, 30); // e desenha uma linha at a posio 200, 30
SelectObject(hdc, hPen2);
MoveToEx(hdc, 50, 50, NULL);
LineTo(hdc, 200, 50);
DeleteObject(hPen1);
DeleteObject(hPen2);
EndPaint(hwnd, &ps);
Preenchimentos
Se no for definido um tipo de preenchimento este definido a branco
hdc = BeginPaint(hwnd, &ps);
// define uma caneta invisivel, para os rectangulos ficarem sem bordo
HPEN hPen = CreatePen(PS_NULL, 1, RGB(0, 0, 0));
HBRUSH hBrush1 = CreateSolidBrush(RGB(121, 90, 0));
HBRUSH hBrush2 = CreateSolidBrush(RGB(240, 63, 19));
SelectObject(hdc, hBrush1);
Rectangle(hdc, 30, 30, 100, 100);
SelectObject(hdc, hBrush2);
Rectangle(hdc, 110, 30, 180, 100);
DeleteObject(hPen);
DeleteObject(hBrush1);
DeleteObject(hBrush2);
EndPaint(hwnd, &ps);
Outros Preenchimentos
hdc = BeginPaint(hwnd, &ps);
HPEN hPen = CreatePen(PS_NULL, 1, RGB(0, 0, 0));
// fica com o interior com linhas diagonais para trs
HBRUSH hBrush1 = CreateHatchBrush(HS_BDIAGONAL, RGB(0, 0, 0));
// fica com o interior com linhas diagonais para a frente
HBRUSH hBrush2 = CreateHatchBrush(HS_FDIAGONAL, RGB(0, 0, 0));
SelectObject(hdc, hBrush1);
Rectangle(hdc, 30, 30, 100, 80);
SelectObject(hdc, hBrush2);
Rectangle(hdc, 110, 30, 180, 80);
DeleteObject(hPen);
DeleteObject(hBrush1);
DeleteObject(hBrush2);
ndPaint(hwnd, &ps);
Figuras geomtricas
Rectngulo:
Rectangle(hdc, 50, 50, 200, 100);
Linhas:
MoveToEx(hdc, 50, 30, NULL);
LineTo(hdc, 200, 30);
Elipses:
Ellipse(hdc, 30, 30, 120, 90);
Recebe as coordenadas de um rectngulo e desenha a elipse dentro
desse rectngulo
Rectngulos com os cantos arredondados:
RoundRect(hdc, 150, 30, 240, 90, 15, 20);
Recebe as coordenadas do rectangulo e largura e comprimentos de
uma elipse para indicar o arrendondado.
Figuras geomtricas
Arcos:
Chord(hdc, 270, 30, 360, 90, 270, 45, 360, 45);
Recebe as coordenadas de um rectngulo e desenha a elipse dentro
desse rectngulo. Depois indica o ponto inicial e o ponto final do arco
Poligonos
POINT polygon[10] = { 30, 145, 85, 165, 105, 110, 65, 125, 30,
105 };
Polygon(hdc, polygon, 5);
Desenha 5 pontos do polgono indicado no 2 parmetro
Curva de Bezier
POINT bezier[4] = {280, 160, 320, 160, 325, 110, 350, 110};
PolyBezier(hdc, bezier, 4);
Desenha uma curva de bezier usando os pontos de controlo do array
passado por parmetro.