1

原点を中央に置きたかったので、次のようにしました。

SetViewportOrgEx(hdc,width/2,height/2,NULL);

(以下のコードに見られるように)

現在、ダブルバッファリングを実装した後、正しく機能していないようです。ここでのベストプラクティスの理由と内容を教えてください。どうもありがとう

以下のコード:

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;

                    //Changing Origin position
            SetViewportOrgEx(hdc,width/2,height/2,NULL);


            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);

                    //Drawing on backbuffDC


            BitBlt(hdc,0,0,width,height,backbuffDC,0,0,SRCCOPY);
            RestoreDC(backbuffDC,savedDC);
            DeleteObject(backbuffer);
            DeleteDC(backbuffDC);
            EndPaint(hWnd, &ps);
        }
4

1 に答える 1

1

ビューポートの原点を変更したため、それに応じて座標が更新されていることを確認する必要があります。の場合、左上隅、幅、高さとしてBitBlt渡されます。これにより、デバイス コンテキストから半分離れた領域へのブリットが発生し、宛先デバイス コンテキスト内にある部分がそのように表示され、残りが切り取られることになります。(width/2, height/2)widthheight

それを修正するには、座標を変更します。

BitBlt(hdc,-width/2,-height/2,width,height,backbuffDC,0,0,SRCCOPY);

第二に、これについては私自身よくわかりませんが、有効な座標が に渡されていることを確認してFillRectください。渡すものは、デバイス コンテキストとそのビューポートに依存しない座標を取得したため、それらも変換する必要がある場合があります。

于 2013-01-04T08:51:58.890 に答える