c# - 改变控制边界

标签 c# .net

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

enter image description here

显然,最暗的边界是先前边界所在的位置。它周围有其他边界试图模仿淡出(或其他)。现在,最具挑战性的是我无法覆盖 OnPaint 或扩展任何其他控件。这必须适用于所有控件! 这是我的扩展程序提供程序的一部分,当控件具有焦点(如 Google Chrome)时,我通过它设置这些边框。

到目前为止,我想出了这个... 在扩展程序提供程序字典中添加控件时,我连接了控件的 Enter 和 Leave 事件。在那里,我得到了触发事件的控件的父级,并在该窗体上绘制了这 3 个矩形。这样我就在非客户区对绘画进行了排序。剩下的就是绘制实际的控制边界。我试了又试,但无济于事。

我还连接了该控件的绘画事件,但 ControlPaint.DrawBorder() 不工作。

好的,这是在进入和离开时调用的方法。

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

有人对此有任何有值(value)的意见吗?

最佳答案

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

至于在控件外绘制,不要。这只会让你感到沮丧。而是在您的控制范围内使用表单背景颜色绘制三个边框,并在您需要它们发光时将它们更改为突出显示的颜色。

希望这对您有所帮助。

关于c# - 改变控制边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12957014/

相关文章:

c# - 二进制排序逻辑 : not sorting numbers correctly

c# - 如何从 Windows 服务访问 SQL 数据库?

c# - TPL 数据流转换 block 发布到批处理 block ,然后是操作 block

c# - 相同路径上的“以下方法或属性之间的调用不明确”

c# - 当Attributes服务于此目的时,标记接口(interface)的需求是什么?

c# - iOS-Unicode取消签名

c# - 在 botframework 网络聊天中开始对话

java - 如何解密在.net中加密的java文件

c# - 一种使文件只能由特定程序解密的方法?

.net - BlockingCollection.Dispose实际上做什么?