改变控制的边界

时间:2012-10-18 14:29:59

标签: c# .net

我在设置Control的自定义边框时遇到问题。只要我得到这种行为,就可以用DrawRectangle,DrawBorder或其他任何东西来完成这个边界

enter image description here

显然,最黑暗的边界是前卫边界所在的地方。其他边界围绕它试图模仿淡出(或其他)。现在,最具挑战性的是我无法覆盖OnPaint或扩展任何其他Control。这个HAS可以用于所有控件! 这是我的扩展程序提供程序的一部分,当控件具有焦点时,我设置这些边框(如Google Chrome)。

到目前为止,我已经想到了...... 在扩展程序提供程序字典中添加控件时,我会在Enter和Leave控制事件上挂钩。在那里,我获得了触发事件的控件的父级,并在该表单上绘制了这3个矩形。这样我就在非客户区域分类绘画。剩下的东西是绘制实际的控制边界。我尝试过并试过但无济于事。

我还联系了该控件的paint事件,但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);

有人对此有任何宝贵的意见吗?

1 个答案:

答案 0 :(得分:0)

在winforms中,您可能需要创建自己的继承自TextBox控件的自定义控件。在您的控件中,您可以根据控件状态实现OnPaint,例如它是否具有焦点。

至于控制之外的绘图,不要。它只会让你感到沮丧。而是使用您控件中的表单背景颜色绘制三个边框,并在需要它们时将其更改为高亮颜色。

希望这有帮助。