GraphicsPath.AddPolygon无法正确呈现

时间:2015-06-10 17:55:10

标签: c# winforms

基本上我有一个表格,我正在尝试" dim"将焦点吸引到表单的某个部分的区域。要做到这一点,我使用没有边框和50%不透明度的表单,与实际表单对齐。我试图掩盖的区域是深灰色区域,大致如图所示:

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

代码中的三个面板是我正在屏蔽的,所以我使用它们的尺寸来计算点数。掩码看起来像这样,当我调整主窗体大小时,它的大小会改变(我在Move和Resize上重新计算区域),而不是获得我预期的结果:

enter image description here

我不知道有GraphicsPath.AddPolygon的某些限制吗?我仔细检查了(四重检查,确实)我的计算结果,包括取每个点的坐标并将它们插入Ipe以查看形状是否真的正确......它是。但不是我的计划!

编辑:以下是每个点的值,当我在p.AddPolygon(points);点击一个断点时,我从左上角开始并顺时针转动: < / p>

enter image description here

2 个答案:

答案 0 :(得分: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);

(不同的是边框+标题的大小..)

让我知道这是否更好!

答案 1 :(得分:0)

您也可以尝试这样做,将所有内容从Panels中删除:

        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();
相关问题