Como desenhar um elástica ou um retângulo de foco no Visual C++ .NET ou no Visual C++ 2005

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: 816170
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Para uma versão deste artigo do Microsoft Visual Basic. NET, consulte 317479.
Para obter uma Microsoft Visual translation from VPE for Csharp .NET versão deste artigo, consulte 314945.
Este artigo faz referência o seguinte .NET Framework Class Library namespaces:
  • System.Drawing
  • System.Drawing.Imaging
  • System.Windows.Forms

NESTA TAREFA

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

No GDI, retângulos de foco são desenhados com freqüência 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 remover uma linha anterior desenhando a linha novamente na mesma posição. Às vezes isso é conhecido como efeito ou exclusivo (XOR).

back to the top

Código de exemplo

Porque FXGetBuffer não está disponíveis em GDI + e System.Drawing , você deve usar outra abordagem 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 usando-se o membro estático ControlPaint::DrawReversibleFrame() . O seguinte exemplo de código que está escrito em Visual C++ .NET ou em Visual C++ 2005 e pronto para colar na classe de formulário em um padrão Windows Forms Application (. NET), demonstra essa abordagem:
private:	bool bHaveMouse;	System::Drawing::Point ptOriginal; 	System::Drawing::Point ptLast;	// Set up delegates for mouse events.	protected: void OnLoad(System::EventArgs *e)	{		MouseDown += new MouseEventHandler( this, MyMouseDown );		MouseUp += new MouseEventHandler( this, MyMouseUp );		MouseMove += new MouseEventHandler( this, MyMouseMove );		bHaveMouse = false;	}// Convert and Normalize the points and draw the reversible frame.private: void MyDrawReversibleRectangle(Point p1, Point p2){		Rectangle rc;	       		// 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 pressed down.public: void MyMouseDown(System::Object *sender, System::Windows::Forms::MouseEventArgs *e) 	{		// Make a note that you "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 you know that no previous		// rectangle must be erased.		ptLast.X = -1;		ptLast.Y = -1;	}// Called when the left mouse button is releasedpublic: void MyMouseUp(System::Object *sender, System::Windows::Forms::MouseEventArgs *e) 	{		// Set internal flag to know that you no longer "have the mouse."		bHaveMouse = false;	        		// If you have drawn previously, draw again in that spot		// to remove the lines.		if (ptLast.X != -1)		{			Point ptCurrent;			ptCurrent.X = e->X;			ptCurrent.Y = 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(System::Object *sender, System::Windows::Forms::MouseEventArgs *e) 	{		Point ptCurrent;		ptCurrent.X = e->X;		ptCurrent.Y = e->Y;	       		// If you "have the mouse," draw your lines.		if (bHaveMouse) 		{			// If you 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);		}	}
Observação você deve adicionar o common language runtime oferecem suporte a compilador opção (/ CLR: oldSyntax) no Visual C++ 2005 a compilar com êxito o exemplo de código anterior. Para adicionar a opção de compilador de suporte de tempo de execução idioma comum no Visual C++ 2005, siga estas etapas:
  1. Clique em Project e clique em <ProjectName> propriedades .

    Observação <ProjectName> é um espaço reservado para o nome do projeto.
  2. Expanda Configuration Properties e, em seguida, clique em Geral .
  3. Clique para selecionar Common Language Runtime suporte, sintaxe antiga (/ CLR: oldSyntax) no projeto oferece suporte a Common Language Runtime configuração no painel à direita, clique em Aplicar e em seguida, clique em OK .
Para obter mais informações sobre o common language runtime oferece suporte à opção do compilador, visite o seguinte site da Microsoft:
/ clr (Common Language Runtime Compilation)
http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
Observação Essa solução está disponível somente para saída na tela. Para desenhar linhas reversíveis em um objeto gráfico, você deve interoperar com GDI ou chamar Bitmap::LockBits() e manipular diretamente os bits de imagem.

back to the top
Rubberband, borracha banda Rect, inverter, foco Rectangle, desenho

Propriedades

ID do Artigo: 816170 - Última Revisão: 12/08/2015 02:12:42 - Revisão: 2.1

Microsoft Visual C++ 2005 Express Edition, Microsoft Visual C++ .NET 2003 Standard Edition, Microsoft .NET Framework 1.1

  • kbnosurvey kbarchive kbmt kbforms kbgdiplus kbgdi kbhowtomaster KB816170 KbMtpt
Comentários