5

スライダーサム用のカスタムグラフィックを使用してトラックバーを作成しようとしています。私は次のコードから始めました:

namespace testapp
{
    partial class MyTrackBar : System.Windows.Forms.TrackBar
    {
        public MyTrackBar()
        {
            InitializeComponent();
        }

        protected override void  OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
        //   base.OnPaint(e);
            e.Graphics.FillRectangle(System.Drawing.Brushes.DarkSalmon, ClientRectangle);
        }
    }
}

ただし、OnPaintを呼び出すことはありません。他の誰かがこれに出くわしますか?以前にこの手法を使用してownerdrawボタンを作成しましたが、何らかの理由でTrackBarでは機能しません。

PS。はい、質問#625728を見ましたが、解決策は、コントロールを最初から完全に再実装することでした。既存のコントロールを少し変更したいだけです。

4

3 に答える 3

7

トラックバーの上にペイントしたい場合は、WM_PAINT メッセージを手動で取得できます。これは、すべてのペイント コードを自分で書き直す必要がなく、次のように簡単にペイントできることを意味します。

using System.Drawing;
using System.Windows.Forms;

namespace TrackBarTest
{
    public class CustomPaintTrackBar : TrackBar
    {
        public event PaintEventHandler PaintOver;

        public CustomPaintTrackBar()
            : base()
        {
            SetStyle(ControlStyles.AllPaintingInWmPaint, true); 
        }

        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);

            // WM_PAINT
            if (m.Msg == 0x0F) 
            {
                using(Graphics lgGraphics = Graphics.FromHwndInternal(m.HWnd))
                    OnPaintOver(new PaintEventArgs(lgGraphics, this.ClientRectangle));
            }
        }

        protected virtual void OnPaintOver(PaintEventArgs e)
        {
            if (PaintOver != null) 
                PaintOver(this, e);

            // Paint over code here
        }
    }
}
于 2012-08-20T00:56:06.170 に答える
5

次のようにコンストラクターで UserPaint スタイルを設定することで解決しました。

public MyTrackBar()
{
    InitializeComponent();
    SetStyle(ControlStyles.UserPaint, true);
}

OnPaint が呼び出されるようになりました。

于 2009-10-11T22:14:23.477 に答える
-2

この回答では、 PaintOver が呼び出されることはありません。割り当てられないため、その値は null です。

于 2014-01-30T10:53:43.597 に答える