Artigo: 314945 - Última revisão: segunda-feira, 11 de Dezembro de 2006 - Revisão: 3.4

Como desenhar um rectângulo de borracha banda ou um rectângulo do foco no Visual C#

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 | Reduzir tudo

Sumário

Um rectângulo de foco ou de banda de borracha é um rectângulo que controla com o ponteiro do rato enquanto mantém premido o botão esquerdo do rato. Esta técnica é normalmente utilizada para delimitar uma selecção em resposta ao utilizador introduzir a ponteiro de rato. Na interface de dispositivos gráficos (GDI), estes rectângulos normalmente são implementados utilizando operações por quadrícula (ROPs). No entanto, o método System.Drawing baseia GDI + (a sucessora para GDI), que não existe suporte para ROPs. Este artigo explica outra abordagem para implementar rectângulos do foco no .NET Framework.

No GDI, rectângulos do foco normalmente são desenhados utilizando códigos ROP. Em particular, os códigos de ROP2 R2_XORPEN e R2_NOT frequentemente são utilizados. Quando utiliza qualquer um destes códigos ROP2, pode apagar uma linha anterior por desenhar a linha novamente na mesma posição. Por vezes, isto é conhecido como um efeito de (XOR) ou exclusivo.

Código de exemplo

Uma vez que não estão disponíveis no GDI + e System.Drawing ROPs, outra abordagem é necessária para desenhar linhas reversíveis com estas ferramentas. Por exemplo, pode utilizar serviços de invocação de Platform (PInvoke) para interagir com a GDI. No entanto, uma solução que utiliza apenas código gerido está disponível através da utilização do membro estático ControlPaint::DrawReversibleFrame() . O código de exemplo seguinte, escrito em C# e pronto para ser colado a classe de formulário numa predefinição Microsoft Visual C# aplicação, demonstra esta 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;
}
				
NOTA: O código deve ser alterado no Visual Studio 2005. Quando cria um projecto de Windows Forms, Visual C# adiciona um formulário ao projecto por predefinição. Este formulário é denominado Form1. Os dois ficheiros que representam o formulário são denominados Form1.cs e Form1.Designer.cs. Tem de escrever o código no Form1.cs. O ficheiro designer.cs é onde o Windows Forms Designer escreve o código que implementa todas as acções efectuadas arrastando e largando controlos da caixa de ferramentas. Para obter mais informações sobre o Windows Forms Designer no Visual C# 2005, visite o seguinte Web site da Microsoft:
http://msdn2.microsoft.com/en-us/library/ms173077.aspx (http://msdn2.microsoft.com/en-us/library/ms173077.aspx)
Tenha em atenção que esta solução está disponível apenas para a saída no ecrã. Para desenhar linhas reversíveis num objecto de gráficos, terá de interagir com GDI ou chamar Bitmap::LockBits() e manipular directamente os bits de imagem.


A informação contida neste artigo aplica-se a:
  • Bibliotecas de classe do Microsoft .NET Framework 1.0
  • Microsoft Visual C# 2005 Express Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Windows XP Professional Edition
  • 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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/ )