9

ダブル バッファリングを実装しようとしていますが、うまくいかないようです。つまり、グラフィックがまだちらつきます。

WM_PAINT は、マウスが移動するたびに呼び出されます。(WM_MOUSEMOVE)

以下に WM_PAINT を貼り付けます。

case WM_PAINT:
        {
            hdc = BeginPaint(hWnd, &ps);
            // TODO: Add any drawing code here...
            RECT rect;
            GetClientRect(hWnd, &rect);
            int width=rect.right;
            int height=rect.bottom;

            HDC backbuffDC = CreateCompatibleDC(hdc);

            HBITMAP backbuffer = CreateCompatibleBitmap( hdc, width, height);

            int savedDC = SaveDC(backbuffDC);
            SelectObject( backbuffDC, backbuffer );
            HBRUSH hBrush = CreateSolidBrush(RGB(255,255,255));
            FillRect(backbuffDC,&rect,hBrush);
            DeleteObject(hBrush);


            if(fileImport)
            {
                importFile(backbuffDC);
            }

            if(renderWiredCube)
            {
                wireframeCube(backbuffDC);
            }

            if(renderColoredCube)
            {
                renderColorCube(backbuffDC);

            }

            BitBlt(hdc,0,0,width,height,backbuffDC,0,0,SRCCOPY);
            RestoreDC(backbuffDC,savedDC);

            DeleteObject(backbuffer);
            DeleteDC(backbuffDC);

            EndPaint(hWnd, &ps);
        }
4

1 に答える 1

11

次のハンドラーを追加します。

case WM_ERASEBKGND:
    return 1;

これが機能する理由は、ペイントがウィンドウ クラスの背景で確実に行われるようにするために、ペイントの前にこのメッセージが送信されるためです。点滅は、背景とその上に描かれているものの間を行ったり来たりしています。背景のペイントが停止すると、その上にペイントされたものとの競合が停止します。これには、ウィンドウを無地の色で塗りつぶすことが含まれるため、とにかく背景が残ります。

于 2013-01-04T08:14:45.263 に答える