ホームページ > バックエンド開発 > C++ > 角が丸く色付きの境界線を持つズーム可能な UserControl の視覚的なアーティファクトを修正する方法

角が丸く色付きの境界線を持つズーム可能な UserControl の視覚的なアーティファクトを修正する方法

Barbara Streisand
リリース: 2025-01-05 18:05:45
オリジナル
1010 人が閲覧しました

How to Fix Visual Artifacts in a Zoomable UserControl with Rounded Corners and a Colored Border?

角が丸いズーム可能な UserControl の境界線の視覚的アーティファクトを回避する方法

問題:

角が丸く色付きのユーザー コントロールをズームアウトする場合境界線を指定すると、境界線の右側が非表示になります。また、拡大すると右側に複数の黄色の枠線が表示されます。

初期コードスニペット:

Form1.Designer.cs

trackBar1.Value = 100;
BackColor = Color.Gray;
ログイン後にコピー

Form1.cs

private void trackBar1_Scroll(object sender, EventArgs e)
{
    UserControl11.SetZoomFactor(trackBar1.Value / 100F);
}
ログイン後にコピー

UserControl1.cs

// Properties, constructors, and event handlers omitted for brevity

internal GraphicsPath GraphicsPathWithBorder;

internal void SetZoomFactor(float z)
{
    Width = (int)(MyBaseWidth * z);

    GraphicsPathWithBorder = RoundedCornerRectangle(ClientRectangle);
    Region = new Region(GraphicsPathWithBorder);
}
ログイン後にコピー

解決策:

アーティファクトに対処するには、次の推奨事項が行われます:

  1. コントロールにリージョンを使用する: コントロールのどの部分をペイントするかを決定するリージョンを定義します。アンチエイリアシングを維持するには、この領域はコントロールの境界よりわずかに小さくする必要があります。
  2. スケールおよび移動行列を適用する: 領域の境界を拡大縮小および移動するには、スケール行列と移動行列を実装します。コントロールの領域の内部。ペンのサイズに従って拡大縮小および変換されます。
  3. 透明な背景を設定します: コントロールの背景色を透明に設定し、周囲の領域の色が透けて見えるようにします。

更新されましたコード:

public partial class RoundControl : UserControl
{
    // Properties, constructors, and event handlers omitted for brevity

    protected override void OnPaint(PaintEventArgs e)
    {
        e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
        RectangleF rect = GraphicsPathWithBorder.GetBounds();
        float scaleX = 1 - ((m_PenSize + 1) / rect.Width);
        float scaleY = 1 - ((m_PenSize + 1) / rect.Height);
        using (Pen pen = new Pen(m_BorderColor, m_PenSize))
        using (Brush brush = new SolidBrush(m_FillColor))
        using (Matrix mx = new Matrix(scaleX, 0, 0, scaleY, pen.Width / 2, pen.Width / 2))
        {
            e.Graphics.Transform = mx;
            e.Graphics.FillPath(brush, GraphicsPathWithBorder);
            e.Graphics.DrawPath(pen, GraphicsPathWithBorder);
        }
        base.OnPaint(e);
    }
}
ログイン後にコピー

結果:

更新されたコード スニペットは、角が丸いズーム可能な UserControl の色付き境界線によって引き起こされる視覚的なアーティファクトを正常に防止します。適用されたスケールと変換マトリックスを使用して変更されたリージョンにより、すべてのズーム レベルで境界線のアンチエイリアスが保証されます。

以上が角が丸く色付きの境界線を持つズーム可能な UserControl の視覚的なアーティファクトを修正する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート