2016-01-27 4 views
3

Я пытаюсь нарисовать переменную границу цвета/ширины в форме (для отчета о статусе «по комнате») она отлично рисуется, за исключением случаев, когда она максимизирована на непервичных дисплеях ...Graphics.DrawRectangle Отсутствует край на втором экране

При увеличении на 2-м дисплее я не получаю левую самую крайность, как показано на рисунке here (Зеленый прямоугольник добавлен для отладки и всегда отображается хорошо).

Я пробовал множество перестановок последовательности рисования, +/- 1 пиксель здесь и там, изменяя свойства пера и т. Д., Но ничего не работает, и факт, что он работает не максимизируется повсюду и максимизируется на первичных экранах, заставляет меня думать это нечто более тонкое.

Полный код для воспроизведения является (Single размерного состояния формы с одной кнопкой):

Public Class Form2 
Private DrawHighlightingRectangle As Boolean = False 
Private HighlightingRectangleColour As Color = Color.Red 

Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint 
    If DrawHighlightingRectangle Then 
     Dim myPen As New System.Drawing.Pen(HighlightingRectangleColour, 8) 
     myPen.Alignment = Drawing2D.PenAlignment.Inset 

     e.Graphics.Clear(Me.BackColor) 

     e.Graphics.DrawRectangle(myPen, 0, 0, Me.ClientRectangle.Width, Me.ClientRectangle.Height) 

     myPen.Color = Color.Green 
     ' e.Graphics.DrawLine(myPen, 0, 0, 0, 100) 
     e.Graphics.DrawRectangle(myPen, 0, 0, 100, 100) 

     myPen.Dispose() 
    End If 
End Sub 

Private Sub Form1_Resize(sender As Object, e As EventArgs) Handles Me.Resize 
    Me.Invalidate() 
    Me.Update() 
End Sub 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    DrawHighlightingRectangle = Not DrawHighlightingRectangle 
    Me.Invalidate() 
    Me.Update() 
End Sub 
End Class 

Debug из х, у и Me.ClientRectangle (Это должно быть ClientRectangle я использую, не так ли?) Размеры подтвердите, что они верны.

Любые идеи?

EDIT:

Изменено Me.ClientRectangle.Width к вар для немного больше отладки в глубину, новый полный код;

Public Class Form2 
Private DrawHighlightingRectangle As Boolean = False 
Private HighlightingRectangleColour As Color = Color.Red 
Private MyWidth = 1900 

Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint 
    If DrawHighlightingRectangle Then 
     Dim myPen As New System.Drawing.Pen(HighlightingRectangleColour, 8) 

     e.Graphics.Clear(Me.BackColor) 

     e.Graphics.DrawRectangle(myPen, 0, 0, MyWidth, Me.ClientRectangle.Height) 

     myPen.Color = Color.Green 
     e.Graphics.DrawRectangle(myPen, 0, 0, 100, 100) 

     myPen.Dispose() 
    End If 
End Sub 

Private Sub Form1_Resize(sender As Object, e As EventArgs) Handles Me.Resize 
    Me.Invalidate() 
    Me.Update() 
End Sub 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    DrawHighlightingRectangle = Not DrawHighlightingRectangle 
    Me.Invalidate() 
    Me.Update() 
End Sub 

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 
    MyWidth += 1 
    Me.Invalidate() 
    Me.Update() 
End Sub 
End Class 

(Не забудьте изменить MyWidth с 1900, чтобы соответствовать вашей настройке!)

Используя этот подход, можно увеличивать ширину и смотреть Прямоугольник расти, однако при приближении корректной полной ширины левого края исчезает - изменение ширины пера влияет на то, когда в какой момент он исчезнет (я удалил Pen.Alignment = Inset в случае, если это было проблемой), но в любом случае я не могу получить желаемый результат ...

+0

Одна вещь, которую вы делаете неправильно, предполагает, что ваша линия начинается с указанного вами местоположения. Это место находится в середине линии, которую вы создаете/Если ее ширина 8, вам нужно буферировать половину этой ширины. – Steve

+0

Вот почему я изначально использовал «Pen.Alignment = Alignment.Inset», но после прочтения [msdn] (https://msdn.microsoft.com/en-us/library/system.drawing.pen.alignment (v = vs.110) .aspx) в разделе примечаний говорится: «A Pen, у которого его выравнивание установлено на Inset, даст ненадежные результаты, иногда ...», поэтому я бросил его для второго примера. Использование свойств Pen по умолчанию (Alignment = Center) действительно сокращает часть строки, но общая проблема все еще существует, поскольку я увеличиваю ширину прямоугольника, в конце концов левый край не будет рисоваться. Может ли кто-нибудь воспроизвести это поведение? – niall

+0

Это со мной тоже. У меня 3 монитора, и это происходит на моем основном, но не на другом 2. Очень странно. Я не смог понять, что происходит. – Steve

ответ

0

Похож на a ошибка. Для обходного пути, когда вы полный экран на не первичном экране, вы должны иметь TopLeft=Pen.Width-1. Во всех остальных случаях прямоугольник должен иметь TopLeft=CInt(Math.Floor(Pen.Width/2)). Обязательно отрегулируйте ширину прямоугольника соответственно

Кроме того, я заметил, что вы не можете нарисовать левое поле с помощью пера шириной более 1 пикселя. Играйте с приведенным ниже примером кода

Public Class Form1 
    Private DrawHighlightingRectangle As Boolean = True 
    Private HighlightingRectangleColour As Color = Color.Red 
    Private PenWidth = 1 
    Dim myPen As New System.Drawing.Pen(HighlightingRectangleColour, PenWidth) 

    Dim x = 0 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     Text = "Pen Width = " & PenWidth & ", X = " & x 
     myPen.Alignment = Drawing2D.PenAlignment.Inset 
    End Sub 

    Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint 
     If DrawHighlightingRectangle Then 
      e.Graphics.Clear(Me.BackColor) 
      e.Graphics.DrawLine(myPen, x, 100, x, 200) 
      e.Graphics.DrawLine(myPen, CInt(Math.Floor(PenWidth/2)), 10, CInt(Math.Floor(PenWidth/2)), 100) 
     End If 
    End Sub 

    Private Sub Form1_Resize(sender As Object, e As EventArgs) Handles Me.Resize 
     Me.Invalidate() 
     Me.Update() 
    End Sub 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' draw button 
     DrawHighlightingRectangle = Not DrawHighlightingRectangle 
     Me.Invalidate() 
     Me.Update() 
    End Sub 

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click ' Move Right 
     x += 1 
     Text = "Pen Width = " & PenWidth & ", X = " & x 
     Me.Invalidate() 
     Me.Update() 
    End Sub 

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click ' increase pen width 
     PenWidth += 1 
     myPen.Dispose() 
     myPen = New System.Drawing.Pen(HighlightingRectangleColour, PenWidth) 
     Text = "Pen Width = " & PenWidth & ", X = " & x 
     Me.Invalidate() 
     Me.Update() 
    End Sub 

    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click ' reset width and X 
     PenWidth = 1 
     x = 0 
     myPen.Dispose() 
     myPen = New System.Drawing.Pen(HighlightingRectangleColour, PenWidth) 
     Text = "Pen Width = " & PenWidth & ", X = " & x 
     Me.Invalidate() 
     Me.Update() 
    End Sub 

    Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click ' Move Left 
     x -= 1 
     Text = "Pen Width = " & PenWidth & ", X = " & x 
     Me.Invalidate() 
     Me.Update() 
    End Sub 
End Class