ホームページ > バックエンド開発 > C++ > 角が丸い UserControl をズームするときに視覚的なアーティファクトを除去するにはどうすればよいですか?

角が丸い UserControl をズームするときに視覚的なアーティファクトを除去するにはどうすればよいですか?

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

How to Eliminate Visual Artifacts When Zooming a UserControl with Rounded Corners?

角の丸い UserControl をズームするときに視覚的なアーティファクトを除去する

角の丸い UserControl をズームすると、消えたり、歪んだ境界線。この問題は、ペイント可能な領域を定義するコントロールの領域がズーム操作中に適切に更新されない場合に発生します。

解決策:

この問題を解決するには、実装することを検討してください。次のアプローチ:

コントロールの領域にスケールと変換行列を適用します。これにより、領域の境界が効果的に縮小され、境界線がペイントされるときに境界線が領域内に収まり、適切にアンチエイリアス処理されるようになります。

UserControl の背景色を透明に設定します。これにより、コントロールのコンテンツを親コンテナに直接描画できるようになります。

コントロールの実装の改善:

上記のソリューションを組み込んだ UserControl コードの拡張バージョンを次に示します。

using System.Drawing;
using System.Drawing.Drawing2D;

public class RoundControl : UserControl
{
    private GraphicsPath GraphicsPathWithBorder;
    private float MyBaseWidth;
    private float m_PenSize = 2f;
    private Color m_BorderColor = Color.Yellow;
    private Color m_FillColor = Color.Green;

    public RoundControl()
    {
        ResizeRedraw = true;
        InitializeComponent();
        MyBaseWidth = Width;
        BackColor = Color.Transparent;
    }

    // ... (other properties and methods)

    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);
    }

    // ... (other methods)
}
ログイン後にコピー

これらの変更を実装することで、UserControl の丸い角が視覚的に残るようにすることができます。一貫性があり、ズーム操作中にアーチファクトが発生しません。

以上が角が丸い UserControl をズームするときに視覚的なアーティファクトを除去するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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