5

フォームに単純なパネルがあり、 AutoScrollMinSize と AutoScroll を使用してパネルにスクロールバーを表示していますが、すべて正常に動作します。

また、パネル領域全体を無効にするために使用する Scroll イベントもあります。事実上、左/右、上/下にスクロールするときに必要なビットのみを無効にするようです。これに加えて、パネルと同じサイズの BufferedGraphics を使用し、.Render(e.Graphics) を実行します。これは、スクロール バーが存在しないかのようにパネル全体に描画する必要があるためです。 .

さて、私が抱えている問題は、スクロールとコンテンツがペイントされているときに視覚的な遅れがあるように見えることです.これは、スクロールイベントの前に私がよく知らない余分な描画/セットアップステージがあるためだと思います.呼び出されるか、それと呼び出される Paint イベントの間。

ペイント メソッド内に無効化パネルがある場合、問題は表示されませんが、これはペイント イベントが何度も呼び出されて問題が隠されていることに関係しています。

だから私が理解していると思う方法は、スクロールすると、ボンネットの下の何かが大きな長方形のブリットシフトを行い、すでに存在するコンテンツをシフトし、塗りつぶす必要がある領域の長方形で無効化を呼び出します。

これが事実である場合、このステージを禁止するか、キープアップラグを取り除くために欠落している他のセットアップのように、とにかくこれについて何かありますか?

PS: 空のスタブである OnPaintBackground メソッドもオーバーライドします。

4

1 に答える 1

4

わかりました、これが必要なまれな機会に誰かを助ける場合に備えて、私自身の質問に答えます. 誰かが LockWindowUpdate に言及したことから始めて、 WM_SETREDRAW とこの投稿SuspendDrawingにたどり着きました。今では、パネル全体をペイントする機能を備えたスムーズなスクロールが可能です。Scroll イベントで次のことを行うだけです。YMMV。

    [DllImport("user32.dll")]
    private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
    private const int WM_SETREDRAW = 0xB;

    private void PanelView_Scroll(object sender, ScrollEventArgs e)
    {
        Control control = sender as Control;
        if (control!=null)
        {
            if (e.Type == ScrollEventType.ThumbTrack)
            {
                // Enable drawing
                SendMessage(control.Handle, WM_SETREDRAW, 1, 0);
                // Refresh the control 
                control.Refresh();
                // Disable drawing                            
                SendMessage(control.Handle, WM_SETREDRAW, 0, 0);
            }
            else
            {
                // Enable drawing
                SendMessage(control.Handle, WM_SETREDRAW, 1, 0);
                control.Invalidate();
            }
        }
    }
于 2012-11-16T21:34:29.083 に答える