投稿したプロジェクトを見ると、グラデーションで塗りつぶされたグループ ボックスで最初のタブを選択すると、ちらつきがひどくなります。2 番目または 3 番目のタブが表示されている場合、ちらつきはほとんどありません。

明らかに、問題はそのタブ ページに表示されているコントロールに関係しています。グラデーションで塗りつぶされたカスタム グループ ボックス クラスのコードをざっと見ただけで、より具体的な原因がわかります。グループボックス コントロールの 1 つを描画するたびに、多くの非常にコストのかかる処理を行っています。各グループボックス コントロールは、フォームのサイズが変更されるたびに再描画する必要があるため、そのコードは信じられないほどの回数実行されます。
さらに、コントロールの背景を「透明」に設定しています。これは、親ウィンドウにコントロールウィンドウ内で最初に自分自身を描画して背景ピクセルを生成するように要求することにより、WinForms で偽造する必要があります。次に、コントロールはその上に自分自身を描画します。これは、コントロールの背景を のような単色でSystemColors.Control
塗りつぶすよりも手間がかかります。また、フォームのサイズを変更している間、グループボックスが自分自身をペイントする前に、フォームのピクセルが描画されるのを確認できます。
カスタム グラデーション塗りつぶしグループ ボックス コントロール クラスから私が話している特定のコードは次のとおりです。
protected override void OnPaint(PaintEventArgs e)
{
if (Visible)
{
Graphics gr = e.Graphics;
Rectangle clipRectangle = new Rectangle(new Point(0, 0), this.Size);
Size tSize = TextRenderer.MeasureText(Text, this.Font);
Rectangle r1 = new Rectangle(0, (tSize.Height / 2), Width - 2, Height - tSize.Height / 2 - 2);
Rectangle r2 = new Rectangle(0, 0, Width, Height);
Rectangle textRect = new Rectangle(6, 0, tSize.Width, tSize.Height);
GraphicsPath gp = new GraphicsPath();
gp.AddRectangle(r2);
gp.AddRectangle(r1);
gp.FillMode = FillMode.Alternate;
gr.FillRectangle(new SolidBrush(Parent.BackColor), clipRectangle);
LinearGradientBrush gradBrush;
gradBrush = new LinearGradientBrush(clipRectangle, SystemColors.GradientInactiveCaption, SystemColors.InactiveCaptionText, LinearGradientMode.BackwardDiagonal);
gr.FillPath(gradBrush, RoundedRectangle.Create(r1, 7));
Pen borderPen = new Pen(BorderColor);
gr.DrawPath(borderPen, RoundedRectangle.Create(r1, 7));
gr.FillRectangle(gradBrush, textRect);
gr.DrawRectangle(borderPen, textRect);
gr.DrawString(Text, base.Font, new SolidBrush(ForeColor), 6, 0);
}
}
protected override void OnPaintBackground(PaintEventArgs pevent)
{
if (this.BackColor == Color.Transparent)
base.OnPaintBackground(pevent);
}
コードを確認したので、赤い警告フラグが上がるはずです。大量の GDI+ オブジェクト (ブラシ、ペン、領域など) を作成していますが、どれにも失敗しています! Dispose
そのコードのほとんどすべてusing
をステートメントでラップする必要があります。それはただのずさんなコーディングです。
そのすべての作業を行うには、いくらかの費用がかかります。コンピューターがコントロールのレンダリングに多くの時間を費やさなければならない場合、他のことが遅れます。サイズ変更に追いつくために緊張しているため、ちらつきが見られます。これは、コンピューターに過負荷をかける他のもの (pi の値の計算など) と同じです。ここで行っているように、カスタム描画コントロールをできるだけ多く使用すると、非常に簡単に行うことができます。Win32 では透過性が難しく、多くのカスタム 3D ペインティングも同様です。これにより、UI のルックアンドフィールがユーザーにとって不格好になります。ネイティブ コントロールからの急ぎを理解できないもう 1 つの理由。
実際には次の 3 つのオプションしかありません。
- ちらつきに対処します。(同意します、これは良い選択肢ではありません。)
- 標準の組み込みコントロールなど、さまざまなコントロールを使用します。確かに、派手なグラデーション効果はないかもしれませんが、ユーザーが Windows テーマをカスタマイズしている場合、半分の時間は壊れて見えます。また、暗い灰色の背景に黒いテキストを読むのはかなり困難です。
- カスタム コントロール内の描画コードを変更して、作業を減らします。視覚効果をまったく犠牲にしない単純な「最適化」でうまくいくかもしれませんが、これはありそうもないことだと思います。これは、速度と見栄えのトレードオフです。何もしない方が常に高速です。