COMO: Desenhar uma faixa de borracha ou retângulo de foco no Visual Basic .NET

Support for Windows XP has ended

Microsoft ended support for Windows XP on April 8, 2014. This change has affected your software updates and security options. Learn what this means for you and how to stay protected.

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: 317479
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Para obter uma versão Microsoft Visual Studio.NET translation from VPE for Csharp neste artigo, consulte 314945.

NESTA TAREFA

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).

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 através do uso do membro estático ControlPaint::DrawReversibleFrame() . O código a seguir, escrito em Visual Basic .NET e pronto para ser colada em um aplicativo Visual Basic .NET padrão, a classe formulário demonstra essa abordagem:
Public Class Form1    Inherits System.Windows.Forms.Form    Dim bHaveMouse As Boolean    Dim ptOriginal As Point    Dim ptLast As Point+[Windows Form Designer generated code]    ' Convert and Normalize the points and draw the reversible frame.    Private Sub MyDrawReversibleRectangle(ByVal p1 As Point, ByVal p2 As Point)        Dim rc As Rectangle        ' Convert the points to screen coordinates.        p1 = PointToScreen(p1)        p2 = PointToScreen(p2)        ' Normalize the rectangle.        If (p1.X < p2.X) Then            rc.X = p1.X            rc.Width = p2.X - p1.X        Else            rc.X = p2.X            rc.Width = p1.X - p2.X        End If        If (p1.Y < p2.Y) Then            rc.Y = p1.Y            rc.Height = p2.Y - p1.Y        Else            rc.Y = p2.Y            rc.Height = p1.Y - p2.Y        End If        ' Draw the reversible frame.        ControlPaint.DrawReversibleFrame(rc, Color.Red, FrameStyle.Dashed)    End Sub    ' Called when the left mouse button is pressed down.    Public Sub MyMouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown        ' 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    End Sub    ' called when the left mouse button is released    Public Sub MyMouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseUp        ' 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) Then            Dim ptCurrent As Point            ptCurrent.X = e.X            ptCurrent.Y = e.Y            MyDrawReversibleRectangle(ptOriginal, ptLast)        End If        ' Set flags to know that there is no "previous" line to reverse.        ptLast.X = -1        ptLast.Y = -1        ptOriginal.X = -1        ptOriginal.Y = -1    End Sub    ' Called when the mouse is moved.    Public Sub MyMouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove        Dim ptCurrent As Point        ptCurrent.X = e.X        ptCurrent.Y = e.Y        ' If we "have the mouse", then we draw our lines.        If (bHaveMouse) Then            ' If we have drawn previously, draw again in            ' that spot to remove the lines.            If (ptLast.X <> -1) Then                MyDrawReversibleRectangle(ptOriginal, ptLast)            End If            ' Update last point.            ptLast = ptCurrent            ' Draw new lines.            MyDrawReversibleRectangle(ptOriginal, ptCurrent)        End If    End Sub    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load        bHaveMouse = False    End SubEnd Class				
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ê deve interoperar com GDI ou chamar Bitmap::LockBits() e manipular diretamente os bits da imagem.

back to the top
rubberband-elástica rect DrawFocusRect XOR não inverter a caneta do retângulo de foco SetROP2 VB

Propriedades

ID do Artigo: 317479 - Última Revisão: 12/07/2015 08:53:37 - Revisão: 5.0

Bibliotecas de Classes do Microsoft .NET Framework 1.0, Bibliotecas de Classes do Microsoft .NET Framework 1.1, Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft Windows XP Professional, the operating system: Microsoft Windows XP 64-Bit Edition

  • kbnosurvey kbarchive kbmt kbdswgdi2003swept kbgdiplus kbhowtomaster KB317479 KbMtpt
Comentários
ERROR: at System.Diagnostics.Process.Kill() at Microsoft.Support.SEOInfrastructureService.PhantomJS.PhantomJSRunner.WaitForExit(Process process, Int32 waitTime, StringBuilder dataBuilder, Boolean isTotalProcessTimeout)