基本上我有一个表格,我正在尝试" dim"将焦点吸引到表单的某个部分的区域。要做到这一点,我使用没有边框和50%不透明度的表单,与实际表单对齐。我试图掩盖的区域是深灰色区域,大致如图所示:
要获得" 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上重新计算区域),而不是获得我预期的结果:
我不知道有GraphicsPath.AddPolygon
的某些限制吗?我仔细检查了(四重检查,确实)我的计算结果,包括取每个点的坐标并将它们插入Ipe以查看形状是否真的正确......它是。但不是我的计划!
编辑:以下是每个点的值,当我在p.AddPolygon(points);
点击一个断点时,我从左上角开始并顺时针转动: < / p>
答案 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();