2015-06-10 6 views
0

В принципе у меня есть форма и я пытаюсь «сгладить» ее области, чтобы нарисовать фокус на определенную часть формы. Для этого я использую форму без границы и непрозрачность 50%, выровненную с фактической формой. Область, которую я пытаюсь замаскировать это темно-серая область, грубо говоря, как показано на рисунке:GraphicsPath.AddPolygon не отображается должным образом

enter image description here

Чтобы получить «U» -образной формы, я использую GraphicsPath с AddPolygon, расчет точки каждая вершина:

var p = new GraphicsPath(); 
var origin = new Point(Top, Left); 
var maxExtentPt = new Point(origin.X + Width, origin.Y + Height); 
Point[] points = { 
    origin, 
    new Point(origin.X + leftPanel.Width, origin.Y), 
    new Point(origin.X + leftPanel.Width, maxExtentPt.Y - bottomPanel.Height), 
    new Point(maxExtentPt.X - rightPanel.Width, maxExtentPt.Y- bottomPanel.Height), 
    new Point(maxExtentPt.X - rightPanel.Width, origin.Y), 
    new Point(maxExtentPt.X, origin.Y), 
    maxExtentPt, 
    new Point(origin.X, maxExtentPt.Y), 
    origin 
}; 
p.AddPolygon(points); 
overlayForm.Region = new Region(p); 
overlayForm.Location = PointToScreen(Point.Empty); 

три панели в коде, что я маскирования, поэтому я использую их размеры для расчета баллов. Вместо того, чтобы получить мой ожидаемый результат, маска выглядит следующим образом, с изменением размера, как изменить размер основной формы (I пересчитывать область на перемещение и изменение размеров):

enter image description here

Есть некоторые ограничения GraphicsPath.AddPolygon, что Я не знаю? Я дважды проверял (по-четному) результаты моих расчетов, в том числе беря координаты для каждой точки и подключая их к Ipe, чтобы увидеть, действительно ли форма была правильной ... Это было так. Но не в моей программе!

Edit: Вот значение каждой точки, когда я достиг точки останова в p.AddPolygon(points); я начинаю в верхнем левом углу и обход по часовой стрелке:

enter image description here

+0

Что '' Top' и Left'? Разве они не были бы сверху и слева от вашей формы без полей в координатах экрана? – adv12

+0

@ adv12 Извините, этот код находится в моей «реальной» форме, поэтому 'Top',' Left', 'Width' и' Height' относятся к этому. – helrich

+0

извините - если бы я более внимательно прочитал, я мог бы понять это сам. В любом случае, с вашего скриншота значений точки, похоже, что Top и Left должны быть равны 0. – adv12

ответ

1

Похоже ваши точки ошибочны в конце концов.

Все должно быть в координатах ClientRectangle, так

Origin не должно быть new Point(Top, Left), который является Location из Form. Это должно быть Point.Empty или (0,0). Или вы можете использовать leftPanel.Location.

И

maxExtentPt = new Point(origin.X + Width, origin.Y + Height); 

следует читать:

var maxExtentPt = new Point(origin.X + ClientSize.Width, origin.Y + ClientSize.Height); 

(разница является размер границы + титул ..)

Позвольте мне знать, если это работает лучше!

+0

Это вместе с комментарием adv12 сделал трюк, хотя для правильного выравнивания наложения я использовал «var origin = new Point (SystemInformation.FrameBorderSize.Width, SystemInformation.CaptionHeight)», и мне еще нужно настроить некоторые из другие расчеты, чтобы он соответствовал должным образом, но общая идея определенно существует сейчас! – helrich

0

Вы также можете попробовать сделать это таким образом, основывая все от панелей:

 Form overlayForm = new Form(); 
     overlayForm.Opacity = .5; 
     overlayForm.BackColor = Color.DarkGray; 
     overlayForm.StartPosition = FormStartPosition.Manual; 
     overlayForm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; 

     var p = new GraphicsPath(); 
     var origin = new Point(0, 0); 
     var maxExtentPt = new Point(this.Width, this.Height); 
     Point[] points = { 
      origin, 
      new Point(leftPanel.Right, origin.Y), 
      new Point(leftPanel.Right, bottomPanel.Top), 
      new Point(rightPanel.Left, bottomPanel.Top), 
      new Point(rightPanel.Left, origin.Y), 
      new Point(rightPanel.Right, origin.Y), 
      maxExtentPt, 
      new Point(origin.X, maxExtentPt.Y), 
      origin 
     }; 
     p.AddPolygon(points); 
     overlayForm.Region = new Region(p); 
     overlayForm.Location = this.PointToScreen(new Point(0, 0)); 

     overlayForm.Show(); 
Смежные вопросы