Я пытаюсь нарисовать переменную границу цвета/ширины в форме (для отчета о статусе «по комнате») она отлично рисуется, за исключением случаев, когда она максимизирована на непервичных дисплеях ...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 в случае, если это было проблемой), но в любом случае я не могу получить желаемый результат ...
Одна вещь, которую вы делаете неправильно, предполагает, что ваша линия начинается с указанного вами местоположения. Это место находится в середине линии, которую вы создаете/Если ее ширина 8, вам нужно буферировать половину этой ширины. – Steve
Вот почему я изначально использовал «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
Это со мной тоже. У меня 3 монитора, и это происходит на моем основном, но не на другом 2. Очень странно. Я не смог понять, что происходит. – Steve