我在设置控件的自定义边框时遇到问题。只要我得到这种行为,这个边框就可以用 DrawRectangle、DrawBorder 或其他任何东西来完成
显然,最暗的边界是先前边界所在的位置。它周围的其他边界试图模仿淡出(或其他)。现在,最具挑战性的事情是我无法覆盖 OnPaint 或扩展任何其他控件。这必须适用于所有控件!这是我的扩展器提供程序的一部分,我在控件具有焦点时设置了这些边界(例如 Google Chrome)。
到目前为止,我已经想出了这个......在扩展器提供程序字典中添加控件时,我连接了 Enter 和 Leave 控制事件。在那里,我得到了触发事件的控件的父级,并在该表单上绘制了这 3 个矩形。这样我就在非客户区域对绘画进行了分类。剩下的就是绘制实际的控制边界。我已经尝试过但无济于事。
我还连接了该控件的绘制事件,但 ControlPaint.DrawBorder() 不起作用。
好的,这是在 Enter 和 Leave 时调用的方法。
private void BojajGlow(Graphics gfx, Graphics gfxCtrl, Control parent, Control kontrola, bool novi)
{
Rectangle[] rect = new Rectangle[3];
for (int i = 0; i < 3; i++)
{
int x = kontrola.Location.X - (i + 1);
int y = kontrola.Location.Y - (i + 1);
int w = kontrola.Size.Width + 2 * (i + 1) - 1;
int h = kontrola.Size.Height + 2 * (i + 1) - 1;
rect[i] = new Rectangle(x, y, w, h);
}
if (novi)
{
Color boja = DohvatiOpcije(kontrola).Boja;
for (int i = 0; i < 3; i++)
{
if (i > 0)
boja = Posvjetli(95, ControlPaint.Light(boja));
Pen olovka = new Pen(boja);
olovka.EndCap = olovka.StartCap = LineCap.Round;
olovka.Width = 1;
GraphicsPath gfxPath = new GraphicsPath();
gfxPath.AddRectangle(rect[i]);
gfx.DrawPath(olovka, gfxPath);
}
}
else
{
for (int i = 0; i < 3; i++)
{
Pen olovka = new Pen(parent.BackColor);
olovka.EndCap = olovka.StartCap = LineCap.Round;
olovka.Width = 1;
GraphicsPath gfxPath = new GraphicsPath();
gfxPath.AddRectangle(rect[i]);
gfx.DrawPath(olovka, gfxPath);
}
}
}
从 Enter 事件中,它将像这样被调用
if (((Control)sender).Parent != null)
BojajGlow(Graphics.FromHwnd(((Control)sender).Parent.Handle), Graphics.FromHwnd(((Control)sender).Handle), ((Control)sender).Parent, (Control)sender, true);
有人对此有任何有价值的意见吗?