Exemplo de teste de clique à tinta
Este exemplo ilustra dois métodos para localizar tinta, considerando um local de tela.
Os seguintes recursos são usados neste exemplo:
- Usando um coletor de tinta
- Executando um teste de clique
- Localizando o ponto mais próximo
Acessando a API de Tinta
Primeiro, faça referência às classes de Tablet PC, localizadas no Windows Vista ou no SDK (Software Development Kit) do Windows XP Tablet PC Edition.
using Microsoft.Ink;
Manipulando eventos de carregamento de formulário e pintura
O manipulador de eventos Load do formulário:
- Cria um objeto InkCollector , ic, para o formulário.
- Define a propriedade CollectionMode do objeto InkCollector para ignorar gestos.
- Habilita o InkCollector.
- Define a propriedade AutoRedraw do objeto InkCollector como TRUE.
// Create the InkCollector, and turn it on
ic = new InkCollector(Handle); // attach it to the form's frame window
// default to ink-enabled mode
mode = ApplicationMode.Ink;
ic.CollectionMode = CollectionMode.InkOnly;
// turn the collector on
ic.Enabled = true;ic.AutoRedraw = true;
O manipulador de eventos Paint do formulário verifica o modo de aplicativo:
- No modo HitTest, ele pinta um círculo ao redor do cursor. A caneta ativa é definida no método handleHitTest do aplicativo.
- No modo NearestPoint, ele pinta uma linha vermelha entre o cursor e o ponto mais próximo do cursor. O ponto mais próximo é calculado no método handleNearestPoint do aplicativo.
if( mode == ApplicationMode.HitTest)
{
e.Graphics.DrawEllipse(activepen, penPt.X - HitSize/2, penPt.Y - HitSize/2, HitSize, HitSize);
}
else if( mode == ApplicationMode.NearestPoint )
{
e.Graphics.DrawLine(redPen, penPt, nearestPt);
}
Este exemplo tem um algoritmo de repinta muito simples. Com sua propriedade AutoRedraw definida como TRUE, o coletor de tinta se redesenha quando o formulário é redesenhado. Para simplificar o redesenho do formulário, o aplicativo rastreia uma caixa delimitadora, a variável de membro invalidateRect, para a área em que a tinta é adicionada, que é invalidada sempre que o formulário é redesenhado.
Manipulando eventos de menu
O comando Exit desabilita o InkCollector antes de sair do aplicativo.
O comando Ink atualiza o modo de aplicativo e o menu status, habilita o coletor de tinta e invalida a região pintada anteriormente do formulário.
Os comandos Teste de Clique e Ponto Mais Próximo alteram o cursor, atualizam o modo de aplicativo e o menu status, desabilitam o coletor de tinta e invalidam a região pintada anteriormente do formulário.
O Clear! O comando desabilita o InkCollector ao substituir a propriedade Ink do objeto Ink por um novo objeto Ink , gera um evento de comando Ink e força uma atualização no controle.
Manipulando eventos do mouse
O manipulador de eventos MouseMove verifica o modo de aplicativo:
- No modo Tinta, ele não faz nada, permitindo que a tinta seja coletada normalmente pelo coletor de tinta.
- No modo HitTest, ele envia os argumentos de evento para o método handleHitTest do aplicativo.
- No modo NearestPoint, ele envia os argumentos de evento para o método handleNearestPoint do aplicativo.
Executando um teste de clique
O método handleHitTest do aplicativo cria dois pontos, o local do cursor e um ponto HitSize pixels distantes do cursor e converte esses dois pontos de pixels em coordenadas de espaço de tinta.
penPt = new Point(e.X, e.Y);
Point pt2 = new Point(e.X, e.Y);
Point pt3 = new Point(e.X + HitSize/2, e.Y);
using (Graphics g = CreateGraphics())
{
ic.Renderer.PixelToInkSpace(g, ref pt1);
ic.Renderer.PixelToInkSpace(g, ref pt2);
}
Em seguida, o objeto InkCollector usa o método Microsoft.Ink.Ink.HitTest() para localizar os traços que estão dentro de pt3. X - pt2. X unidades de espaço à tinta do cursor, pt2.
Strokes strokes = ic.Ink.HitTest(pt2, (float)(pt3.X - pt2.X));
O método handleHitTest define a cor da caneta com base em se os traços foram encontrados, invalida a região invalidateRect, calcula uma nova região em que o círculo de teste de clique é desenhado e invalida a nova região.
Localizando o ponto mais próximo
O método handleNearestPoint do aplicativo cria dois pontos iguais ao local do cursor, um desses pontos, pt, é convertido em espaço à tinta e usado na chamada para o método NearestPoint do objeto InkCollector. O método NearestPoint retorna o objeto Stroke mais próximo do ponto e define o parâmetro de saída do índice de ponto flutuante.
using (Graphics g = CreateGraphics())
{
// Remember pen location
Point inkPenPt = new Point(e.X, e.Y);
// Convert the pen location into a location in ink space
ic.Renderer.PixelToInkSpace(g, ref inkPenPt);
// ...
float fIndex;
Stroke stroke = ic.Ink.NearestPoint(inkPenPt, out fIndex);
Se nenhum traço estiver presente, o método NearestPoint retornará NULL e o local do cursor será usado como o ponto mais próximo. Caso contrário, o local no traço que corresponde ao índice de ponto flutuante é calculado.
As coordenadas de ponto mais próximas são convertidas em pixels do espaço à tinta, o método handleNearestPoint invalida a região invalidateRect, calcula uma nova região em que a linha para o ponto mais próximo é desenhada e invalida a nova região também.
Fechando o formulário
O método Dispose do formulário descarta o objeto InkCollector .