Двойная буферизация и происхождение видового экрана?

Я хотел поместить источник в центр, поэтому я сделал:

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 backbuffDCBitBlt(hdc,0,0,width,height,backbuffDC,0,0,SRCCOPY);
RestoreDC(backbuffDC,savedDC);
DeleteObject(backbuffer);
DeleteDC(backbuffDC);
EndPaint(hWnd, &ps);
}

1

Решение

Поскольку вы изменили источник видового экрана, вы должны убедиться, что координаты обновлены соответствующим образом. В случае BitBlt, вы сейчас проходите (width/2, height/2) как верхний левый угол, width как ширина, и height как высота. Это приводит к переходу в область, которая является половиной контекста вашего устройства, что должно привести к тому, что часть, находящаяся в контексте целевого устройства, будет отображаться как таковая, а остальная часть будет обрезана.

Чтобы исправить это, измените координаты:

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

Во-вторых, я сам не уверен в этом, но убедитесь, что действительные координаты передаются FillRect, То, что вы передаете, извлекает координаты, не зависящие от контекста устройства и его области просмотра, так что, возможно, их также придется преобразовать.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]