1

フォームで使用すると問題なく動作する単純なユーザー コントロールがありますが、このメソッドを介して StatusStrip にホストしようとすると、OnPaint イベントは呼び出されません。MSDN のドキュメントには、これは機能するはずであると記載されていますが、何も表示されず、OnPaint イベントが呼び出されないことが確認されました。

public partial class SimpleUserControl : UserControl
{
    public SimpleUserControl( )
    {
        InitializeComponent( );

        // Set the styles for drawing
        SetStyle(ControlStyles.AllPaintingInWmPaint |
            ControlStyles.ResizeRedraw |
            ControlStyles.DoubleBuffer |
            ControlStyles.SupportsTransparentBackColor,
            true);
    }

    [System.ComponentModel.EditorBrowsableAttribute( )]
    protected override void OnPaint( PaintEventArgs e )
    {
        Rectangle _rc = new Rectangle( 0, 0, this.Width, this.Height );
        e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
        e.Graphics.DrawArc( new Pen( Color.Red ), _rc, 180, 180 );
    }

}

public Form1( )
{
    InitializeComponent( );

    SimpleUserControl suc = new SimpleUserControl( );
    suc.Size = new Size( 30, 20 );
    ToolStripControlHost tsch = new ToolStripControlHost( suc );
    statusStrip1.Items.Add(tsch);
}
4

2 に答える 2

2

ToolStripControlHost には、ホストしているコントロールに設定された MinimumSize が必要な奇妙な癖があります。

これを追加してみてください:

suc.Size = new Size(30, 20);
suc.MinimumSize = suc.Size;
于 2012-10-10T15:54:25.567 に答える
1

私は彼に同じ問題を抱えていました。私の解決策は、ToolStripControlHost から継承された新しいクラスを作成し、次のように ToolStripItem.OnPaint メソッドをオーバーライドすることでした。

[System.ComponentModel.DesignerCategory("code")]
[ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.All]
public class ToolStripSimpleUserControl : ToolStripControlHost
{
    public ToolStripSimpleUserControl ()
        : base(new SimpleUserControl())
    {
    }

    public SimpleUserControl StripSimpleUserControl
    {
        get { return Control as SimpleUserControl; }
    }


    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        // not thread safe!
        if (e != null)
        {
            this.StripSimpleUserControl.Invalidate();
        }
    }
}

パブリック form1()

public Form1( )
{
     InitializeComponent( );

     ToolStripSimpleUserControl suc = new ToolStripSimpleUserControl( );
     suc.StripSimpleUserControl.Size = new Size( 30, 20 );

     statusStrip1.Items.Add(suc);
}

その他のルールについては、http://msdn.microsoft.com/en-us/library/9k5etstz.aspxをご覧ください。

http://tonyfear.netau.net/index.php?option=com_content&view=category&layout=blog&id=3&limitstart=5にアクセスしてください。

于 2012-10-16T19:44:58.293 に答える