3

コントロールのカスタム ボーダーの設定に問題があります。この境界線は、この動作が得られる限り、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);

誰かがこれについて貴重な意見を持っていますか?

4

1 に答える 1

0

winforms では、おそらく TextBox コントロールから継承する独自のカスタム コントロールを作成する必要があります。コントロールでは、フォーカスがあるかどうかなど、コントロールの状態に基づいて OnPaint を実装できます。

コントロールの外側に描画することは避けてください。それはあなたをイライラさせるだけです。代わりに、コントロール内のフォームの背景色を使用して 3 つのボーダーを描画し、それらを光らせる必要がある場合はそれらを強調表示された色に変更します。

お役に立てれば。

于 2012-10-21T15:39:00.367 に答える