1

基本的に、次のように WM_SETREDRAW メッセージの送信を処理するクラスを設定しました。

public static class DrawingLocker
{
    [DllImport("user32", CharSet = CharSet.Auto)]
    private extern static IntPtr SendMessage(IntPtr hWnd, 
            int msg, int wParam, IntPtr lParam);

    private const int WM_SETREDRAW = 11; //0xB

    public static void LockDrawing(IntPtr Handle)
    {
        SendMessage(Handle, WM_SETREDRAW, 0, IntPtr.Zero);
    }

    public static void UnlockDrawing(IntPtr Handle)
    {
        SendMessage(Handle, WM_SETREDRAW, 1, IntPtr.Zero);
    }
}

次に、カスタム ユーザー コントロールに Redraw メソッドを追加します。

public void Redraw()
{
    try
    {
        DrawingLocker.LockDrawing(Handle);
        using (Graphics graphics = Graphics.FromHwnd(Handle))
        {
            //Draw Stuff
        }
    }
    finally { DrawingLocker.UnlockDrawing(Handle); }
}

私の問題は、「Draw Stuff」コメントが描かれている場所に何も描画されないことです。私は何を間違っていますか?(サイズ変更など、描画に影響する値が変更されると、Redraw が呼び出されます)

4

1 に答える 1

1

私は実際には Windows などには詳しくありませんが、MSDN がそのフラグについて述べていることから判断すると、それはあなたが思っていることを実行しません。内容を変更している間、コントロールの再描画を無効にするために使用されます (リスト ビューと考えてください)。再描画関数内で無効にしても、おそらく何も起こりません。

ちらつきを避けるために使用される 1 つの手法であるため、「ダブル バッファリング」に関連するものを見つけることができるかどうかを確認してください。

于 2010-08-28T12:48:58.280 に答える