Tipos de sistemas de coordenadas
O Windows GDI+ usa três espaços de coordenadas: mundo, página e dispositivo. Quando você faz a chamada myGraphics.DrawLine(&myPen, 0, 0, 160, 80)
, os pontos que você passa para o método Graphics::D rawLine — (0, 0) e (160, 80) — estão no espaço de coordenadas do mundo. Antes que o GDI+ possa desenhar a linha na tela, as coordenadas passam por uma sequência de transformações. Uma transformação converte coordenadas de mundo em coordenadas de página e outra transformação converte coordenadas de página em coordenadas de dispositivo.
Suponha que você queira trabalhar com um sistema de coordenadas cuja origem está no corpo da área de cliente em vez do canto superior esquerdo. Digamos, por exemplo, que você queira que a origem esteja a 100 pixels da borda esquerda da área de cliente e a 50 pixels da parte superior da área de cliente. A ilustração a seguir mostra esse sistema de coordenadas.
Quando faz a chamada myGraphics.DrawLine(&myPen, 0, 0, 160, 80)
, você obtém a linha mostrada na ilustração a seguir.
As coordenadas dos pontos de extremidade da sua linha nos três espaços de coordenadas são as seguintes:
Space | Coordenadas de ponto de extremidade |
---|---|
World (Mundo) | (0, 0) a (160, 80) |
Página | (100, 50) a (260, 130) |
Dispositivo | (100, 50) a (260, 130) |
Observe que o espaço de coordenadas de página tem sua origem no canto superior esquerdo da área de cliente; sempre será esse o caso. Observe também que, como a unidade de medida é o pixel, as coordenadas do dispositivo são as mesmas que as coordenadas da página. Se você definir a unidade de medida como algo diferente de pixels (por exemplo, polegadas), as coordenadas do dispositivo serão diferentes das coordenadas da página.
A transformação que mapeia coordenadas do mundo para coordenadas de página é chamada de transformação de mundo e é mantida por um objeto Graphics . No exemplo anterior, a transformação do mundo é uma tradução de 100 unidades na direção x e 50 unidades na direção y. O exemplo a seguir define a transformação de mundo de um objeto Graphics e, em seguida, usa esse objeto Graphics para desenhar a linha mostrada na figura anterior.
myGraphics.TranslateTransform(100.0f, 50.0f);
myGraphics.DrawLine(&myPen, 0, 0, 160, 80);
A transformação que mapeia coordenadas de página para coordenadas de dispositivo é chamada de transformação de página. A classe Graphics fornece quatro métodos para manipular e inspecionar a transformação de página: Graphics::SetPageUnit, Graphics::GetPageUnit, Graphics::SetPageScale e Graphics::GetPageScale. A classe Graphics também fornece dois métodos, Graphics::GetDpiX e Graphics::GetDpiY, para examinar os pontos horizontais e verticais por polegada do dispositivo de exibição.
Você pode usar o método Graphics::SetPageUnit da classe Graphics para especificar uma unidade de medida. O exemplo a seguir desenha uma linha de (0, 0) a (2, 1) em que o ponto (2, 1) está 2 polegadas à direita e 1 polegada abaixo do ponto (0, 0).
myGraphics.SetPageUnit(UnitInch);
myGraphics.DrawLine(&myPen, 0, 0, 2, 1);
Observação
Se você não especificar uma largura de caneta ao construir sua caneta, o exemplo anterior desenhará uma linha de uma polegada de largura. Você pode especificar a largura da caneta no segundo argumento para o construtor Caneta :
Pen myPen(Color(255, 0, 0, 0), 1/myGraphics.GetDpiX())
.
Se assumirmos que o dispositivo de exibição tem 96 pontos por polegada na direção horizontal e 96 pontos por polegada na direção vertical, os pontos de extremidade da linha no exemplo anterior têm as seguintes coordenadas nos três espaços de coordenadas:
Space | Coordenadas de ponto de extremidade |
---|---|
World (Mundo) | (0, 0) a (2, 1) |
Página | (0, 0) a (2, 1) |
Dispositivo | (0, 0) a (192, 96) |
É possível combinar as transformações global e de página para obter uma variedade de resultados. Por exemplo, suponha que você queira usar polegadas como a unidade de medida e queira que a origem se seu sistema de coordenadas esteja a 2 polegadas da borda esquerda da área de cliente e a 1/2 polegada da parte superior da área de cliente. O exemplo a seguir define as transformações de mundo e página de um objeto Graphics e desenha uma linha de (0, 0) para (2, 1).
myGraphics.TranslateTransform(2.0f, 0.5f);
myGraphics.SetPageUnit(UnitInch);
myGraphics.DrawLine(&myPen, 0, 0, 2, 1);
A ilustração a seguir mostra a linha e o sistema de coordenadas.
Se assumirmos que o dispositivo de exibição tem 96 pontos por polegada na direção horizontal e 96 pontos por polegada na direção vertical, os pontos de extremidade da linha no exemplo anterior têm as seguintes coordenadas nos três espaços de coordenadas:
Space | Coordenadas de ponto de extremidade |
---|---|
World (Mundo) | (0, 0) a (2, 1) |
Página | (2, 0.5) a (4, 1.5) |
Dispositivo | (192, 48) a (384, 144) |