2014-10-26 3 views
0

Прежде всего, спасибо за то, что вы уделили время своему напряженному графику, чтобы помочь мне.Graphics.DrawRectangle не работает в контрольных событиях

Я разрабатываю проект (Win Application) с формой и 3 текстовыми полями (TextBox1, TextBox2 и TextBox3).

Мне нужно нарисовать прямоугольник вокруг текстового поля, когда это сфокусировано.

Код:

Private Sub TextBox123_Enter(sender As Object, e As System.EventArgs) Handles TextBox1.Enter, TextBox2.Enter, TextBox3.Enter 
    Using g As Graphics = Me.CreateGraphics 
     Dim r As Rectangle = sender.Bounds 
     r.Inflate(4, 4) 
     g.DrawRectangle(Pens.Blue, r) 
    End Using 
End Sub 

Проблема заключается в следующем:

  • Первый раз получает textBox1 фокус прямоугольник не рисуется.
  • В первый раз, когда textbox2 получает прямоугольник фокусировки, не нарисован.

Почему нет прямоугольника, нарисованного при вводе первых двух событий?

+0

Что значит * В первый раз ... *. Когда форма загружается? –

+0

Да. Когда форма загружена, прямоугольник не нарисован (событие TextBox123.Enter срабатывает, но DrawRectangle не влияет). Также, когда первый фокус изменен, прямоугольник не нарисован (когда фокус изменен с TextBox1 на TextBox2) –

+1

Он нарисован, но сразу перекрашен, когда текстовое поле перерисовывается. Стандартная опасность использования CreateGraphics(), использующая его, ошибочна в 99,9% случаев. –

ответ

1

чертежу с CreateGraphics почти всегда не правильный подход. Если вы заметите, что при переходе от одного окна к другому старый прямоугольник не стирается. Вам нужно использовать событие Form_Paint, чтобы заставить его работать правильно. Или ... возможно, проще было бы создать UserControls, который на 1-2 пикселя больше, чем дочерний TextBox, и установить обратную цветность холста UserControl, нарисуйте ваш прямоугольник, когда элемент управления получит фокус.

Для вида краски:

Public Class Form1 
    Private HotControl As Control 

Если вы только собираетесь сделать TextBoxes, вы можете объявить его As TextBox. Таким образом, он позволяет делать то же самое для других типов управления. Установить/очистить трекер:

Private Sub TextBox3_Enter(sender As Object, e As EventArgs) Handles TextBox3.Enter, 
      TextBox2.Enter, TextBox1.Enter 
    HotControl = CType(sender, TextBox) 
    Me.Invalidate() 
End Sub 

Private Sub TextBox1_Leave(sender As Object, e As EventArgs) Handles TextBox1.Leave, 
      TextBox2.Leave, TextBox3.Leave 
    HotControl = Nothing 
    Me.Invalidate() 
End Sub 

Me.Invalidate говорит форму перерисовать себя, что происходит в Paint:

Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint 

    If HotControl IsNot Nothing Then 
     Dim r As Rectangle = HotControl.Bounds 
     r.Inflate(4, 4) 
     e.Graphics.DrawRectangle(Pens.Blue, r) 
    End If 

End Sub 

Вы должны также включить Option Strict.

+1

Большое спасибо! Ваш код очень хорош! Ваши объяснения были очень ясными и понятными! Проблема решена! –

0

Попробуйте это в click event обработчиком

Private Sub TextBox1_Click(sender As Object, e As EventArgs) Handles TextBox1.Click 
    Using g As Graphics = Me.CreateGraphics() 
     Dim rectangle As New Rectangle(TextBox1.Location.X - 1, _ 
      TextBox1.Location.Y - 1, _ 
      TextBox1.Size.Width + 1, _ 
      TextBox1.Size.Height + 1) 
     g.DrawRectangle(Pens.Blue, rectangle) 
    End Using 
End Sub 
+0

Спасибо за ваш ответ, но прямоугольник не нарисован, чтобы открыть форму и не рисовать при изменении фокусировки с помощью клавиши TAB. Я не понимаю, почему бы не нарисовать прямоугольник первые два раза, это меняет фокус. –