7

画面に楕円を描画するためにOnPaintメソッドをオーバーライドしました。

    protected override void OnPaint(PaintEventArgs e)
    {
        MessageBox.Show("Paint");
        if (debugStarted)
        {
            int y = rtbLogicCode.PlaceToPoint(new Place(0, debugLine)).Y;
            if (rtbLogicCode.GetVisibleState(debugLine).ToString() == "Visible")
            {
                e.Graphics.FillEllipse(new LinearGradientBrush(new Rectangle(0, y, 15, 15), Color.LightPink, Color.Red, 45), 0, y, 15, 15);
            }
            base.OnPaint(e);
        }
    }

    private void rtbLogicCode_Scroll(object sender, ScrollEventArgs e)
    {
        this.Invalidate();
    }

スクロールイベント(リッチテキストボックス上)は適切に処理されますが、フォームを無効にしているのに、OnPaint関数を呼び出していません(メッセージボックスが表示されていません)。

これの考えられる原因は何でしょうか?

編集:子フォームの初期化関数(MDIプロパティを使用してメインフォームのコントロールとして追加)で、次のスタイルを設定したことを忘れました。

 private void LogicCodeInit()
    {


            this.SetStyle(ControlStyles.DoubleBuffer, true);
            this.SetStyle(ControlStyles.ResizeRedraw, true);
            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            this.SetStyle(ControlStyles.UserPaint, true);


    }

Edit2:子フォームがTabControlのコントロールとして追加されていることにも言及するのを忘れました。次に、TabControlがメインフォームのコントロールとして追加されます。

4

3 に答える 3

13

Update後に電話してInvalidateください。フォームにフォーカスがある場合にのみフォームを再描画します。子Invalidateとして追加されているため、フォーカスが取得されていない可能性があります。TabControl

MSDNドキュメントから:

Invalidateメソッドを呼び出しても、同期ペイントは強制されません。同期ペイントを強制するには、Invalidateメソッドを呼び出した後にUpdateメソッドを呼び出します。このメソッドがパラメーターなしで呼び出されると、クライアント領域全体が更新領域に追加されます。

于 2012-07-09T07:04:18.103 に答える
1

コントロールを呼び出すInvalidateと、その一部またはすべてが無効になり、「いつか」更新する必要があることを示しますが、その更新がすぐに発生することはありません。呼び出すUpdateと、無効にされたコントロールのすべての部分がすぐに再描画されます。呼び出すRefreshと、上記の効果が組み合わされます。システムがアイドル状態のときはいつでも、無効な領域を持つコントロールのプロセス更新を呼び出します。

このInvalidateメソッドは、コントロールに表示される内容を変更する多くのメソッドが順番に実行される状況で役立ちます。コントロールを変更するすべてのメソッドの後にコントロールを再描画するのではなく、コントロールを変更するメソッドで、再描画が必要な部分を無効にすることができます。コントロールを変更する可能性のあるすべてのメソッドが完了すると、Update無効にされたコントロールの部分(存在する場合)を再描画するために使用できます。コントロールの再描画に1/100秒かかり、50回の操作を実行する必要がある場合、更新を延期して統合すると、瞬時に更新されるように見えるコントロールと0.5秒かかるコントロールの違いが生じる可能性があります。

于 2012-10-20T21:02:25.917 に答える
0

OnPaint呼び出されない主な理由は、ControlStyleが含まれていない場合UserPaintです。もしあなたがそれを設定したなら、私はあなたがこれについて言及することを期待していたでしょう、それで私はあなたがそうしなかったと思います。その場合はSetStyle、コンストラクターにへの呼び出しを追加します。

于 2012-07-09T06:21:48.377 に答える