ID do artigo: 314945 - Última revisão: segunda-feira, 11 de dezembro de 2006 - Revisão: 3.4

Como desenhar um retângulo elástica ou um retângulo de foco no Visual translation from VPE for Csharp

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Recolher tudo

Sumário

Um retângulo de foco ou elástica é um retângulo que controla o ponteiro do mouse enquanto mantém pressionado o botão esquerdo do mouse. Essa técnica é normalmente usada para delimitar uma seleção em resposta ao usuário-ponteiro de entrada. Na interface de dispositivo gráfico (GDI), esses retângulos normalmente são implementados usando operações de varredura (FXGetBuffer). No entanto, o método System.Drawing é baseado no GDI + (a sucessora para GDI), que tem suporte para FXGetBuffer. Este artigo explica outra abordagem para implementar retângulos de foco no .NET Framework.

No GDI, retângulos de foco normalmente são desenhados usando códigos de ROP. Em particular, os códigos de ROP2 R2_XORPEN e R2_NOT são freqüentemente usados. Quando você usa um desses códigos ROP2, você pode apagar uma linha anterior desenhando a linha novamente na mesma posição. Às vezes isso é conhecido como efeito ou exclusivo (XOR).

Código de exemplo

Como FXGetBuffer não está disponíveis no GDI + e System.Drawing , outra abordagem é necessária para desenhar linhas reversíveis com essas ferramentas. Por exemplo, você pode usar serviços de invocação de plataforma (PInvoke) para interoperar com o GDI. No entanto, uma solução que usa apenas código gerenciado está disponível através do uso do membro estático ControlPaint::DrawReversibleFrame() . O código de exemplo a seguir, escrito em translation from VPE for Csharp e pronto para colar o classe de formulário em um aplicativo de Microsoft Visual translation from VPE for Csharp padrão, demonstra essa abordagem:
Boolean bHaveMouse;
Point	ptOriginal = new Point();
Point	ptLast = new Point();

// Called when the left mouse button is pressed. 
public void MyMouseDown( Object sender, MouseEventArgs e )
{
	// Make a note that we "have the mouse".
	bHaveMouse = true;
	// Store the "starting point" for this rubber-band rectangle.
	ptOriginal.X = e.X;
	ptOriginal.Y = e.Y;
	// Special value lets us know that no previous
	// rectangle needs to be erased.
	ptLast.X = -1;
	ptLast.Y = -1;
}
// Convert and normalize the points and draw the reversible frame.
private void MyDrawReversibleRectangle( Point p1, Point p2 )
{
	Rectangle rc = new Rectangle();

	// Convert the points to screen coordinates.
	p1 = PointToScreen( p1 );
	p2 = PointToScreen( p2 );
	// Normalize the rectangle.
	if( p1.X < p2.X )
	{
		rc.X = p1.X;
		rc.Width = p2.X - p1.X;
	}
	else
	{
		rc.X = p2.X;
		rc.Width = p1.X - p2.X;
	}
	if( p1.Y < p2.Y )
	{
		rc.Y = p1.Y;
		rc.Height = p2.Y - p1.Y;
	}
	else
	{
		rc.Y = p2.Y;
		rc.Height = p1.Y - p2.Y;
	}
	// Draw the reversible frame.
	ControlPaint.DrawReversibleFrame( rc, 
					Color.Red, FrameStyle.Dashed );
}
// Called when the left mouse button is released.
public void MyMouseUp( Object sender, MouseEventArgs e )
{
	// Set internal flag to know we no longer "have the mouse".
	bHaveMouse = false;
	// If we have drawn previously, draw again in that spot
	// to remove the lines.
	if( ptLast.X != -1 )
	{
		Point ptCurrent = new Point( e.X, e.Y );
		MyDrawReversibleRectangle( ptOriginal, ptLast );
	}
	// Set flags to know that there is no "previous" line to reverse.
	ptLast.X = -1;
	ptLast.Y = -1;
	ptOriginal.X = -1;
	ptOriginal.Y = -1;
}
// Called when the mouse is moved.
public void MyMouseMove( Object sender, MouseEventArgs e )
{
	Point ptCurrent = new Point( e.X, e.Y );
	// If we "have the mouse", then we draw our lines.
	if( bHaveMouse )
	{
		// If we have drawn previously, draw again in
		// that spot to remove the lines.
		if( ptLast.X != -1 )
		{
			MyDrawReversibleRectangle( ptOriginal, ptLast );
		}
		// Update last point.
		ptLast = ptCurrent;
		// Draw new lines.
		MyDrawReversibleRectangle( ptOriginal, ptCurrent );
	}
}
// Set up delegates for mouse events.
protected override void OnLoad(System.EventArgs e)
{
	MouseDown += new MouseEventHandler( MyMouseDown );
	MouseUp += new MouseEventHandler( MyMouseUp );
	MouseMove += new MouseEventHandler( MyMouseMove );
	bHaveMouse = false;
}
				
Observação O código deve ser alterado no Visual Studio 2005. Quando você cria um projeto Windows Forms, translation from VPE for Csharp Visual adiciona um formulário para o projeto por padrão. Este formulário é denominado Form1. Os dois arquivos que representam o formulário são denominados Form1.cs e Form1.Designer.cs. Tem de escrever seu código no Form1.cs. O ficheiro designer.cs é onde o Windows Forms Designer escreve o código que implementa todas as ações que você executou arrastando e soltando controles da caixa de ferramentas. Para obter mais informações sobre o Windows Forms Designer no Visual translation from VPE for Csharp 2005, visite o seguinte site:
http://msdn2.microsoft.com/en-us/library/ms173077.aspx (http://msdn2.microsoft.com/en-us/library/ms173077.aspx)
Observe que essa solução está disponível somente para saída na tela. Para desenhar linhas reversíveis em um objeto gráfico, você precisa interoperar com GDI ou chamar Bitmap::LockBits() e manipular diretamente os bits da imagem.


A informação contida neste artigo aplica-se a:
  • Bibliotecas de Classes do Microsoft .NET Framework 1.0
  • Microsoft Visual C# 2005 Express Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Windows XP Professional
  • the operating system: Microsoft Windows XP 64-Bit Edition
Palavras-chave: 
kbmt kbdswgdi2003swept kbgdi kbhowtomaster KB314945 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 314945  (http://support.microsoft.com/kb/314945/en-us/ )