Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 改变管制边界_C#_.net - Fatal编程技术网

C# 改变管制边界

C# 改变管制边界,c#,.net,C#,.net,我在设置自定义控件边界时遇到问题。这个边框可以用DrawRectangle、DrawBorder或其他任何东西来完成,只要我有这个行为 显然,最暗的边界是以前的边界。其他的边界在它周围,试图模仿淡出(或其他)。现在,最具挑战性的事情是我不能覆盖OnPaint或扩展任何其他控件。这必须适用于所有控件! 这是我的扩展程序提供程序的一部分,当控件有焦点时(比如谷歌浏览器),我会设置这些边界 到目前为止,我已经想出了这个。。。 在extender provider dictionary中添加控件时,我

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

显然,最暗的边界是以前的边界。其他的边界在它周围,试图模仿淡出(或其他)。现在,最具挑战性的事情是我不能覆盖OnPaint或扩展任何其他控件。这必须适用于所有控件! 这是我的扩展程序提供程序的一部分,当控件有焦点时(比如谷歌浏览器),我会设置这些边界

到目前为止,我已经想出了这个。。。 在extender provider dictionary中添加控件时,我连接了控件的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);
            }
        }
    }

是否有人对此有任何有价值的输入?

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

至于超出控制范围的绘图,请不要。这只会让你沮丧。取而代之的是,在控件中使用窗体背景色绘制三个边框,并在需要它们发光时将其更改为高亮颜色


希望这有帮助。

您使用的是WinForms还是WPF?我使用的是WinForms。我不知道WPF,但我在其中看到了一些例子,其中实现这一点很简单:)边框是使用用户选择的主题设置和WM_NCPAINT消息的默认处理程序绘制的。难以处理的信息。最简单的方法是只使用无边框控件,让父控件绘制边框。
if (((Control)sender).Parent != null)
            BojajGlow(Graphics.FromHwnd(((Control)sender).Parent.Handle), Graphics.FromHwnd(((Control)sender).Handle), ((Control)sender).Parent, (Control)sender, true);