コントロールのカスタム ボーダーの設定に問題があります。この境界線は、この動作が得られる限り、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);
誰かがこれについて貴重な意見を持っていますか?