ayman shibl Ответов: 1

Проблема двойной буферизации! !


привет;

я делаю технику двойной буферизации, чтобы нарисовать эллипс в качестве примера , и я не могу прокрутить страницу правильно, кажется, что рисунок искажается при прокручивании страницы, проект построен на классе CScrollview, так что же не так, Спасибо за ваше время

Что я уже пробовал:

я переопределяю
void Cfree_flickerView::OnEraseBkgnd(CDC* pDC)
с
return true;
вместо этого
return CScrollView::OnEraseBkgnd(pDC);


добавьте этот код в
void Cfree_flickerView::OnPaint() 
{
CDC memDC;
memDC.CreateCompatibleDC(&dc);
Cfree_flickerView::OnDraw(&dc);<pre>
}
добавьте несколько кодов
void Cfree_flickerView::OnInitialUpdate()


CSize sizeTotal;
	// TODO: calculate the total size of this view
	sizeTotal.cx = sizeTotal.cy = 2000;
	SetScrollSizes(MM_TEXT, sizeTotal,CSize(200,10),CSize(20,1));


наконец добавьте эти коды в
void Cfree_flickerView::OnDraw(CDC* pDC)


CRect rcTotal(CPoint(0,0),GetTotalSize());
  

   CDC MemDC;
   CBitmap MemBitmap;

   pDC = this->GetDC();         // Get Current DC
   MemDC.CreateCompatibleDC(pDC);
   MemBitmap.CreateCompatibleBitmap(pDC, rcTotal.right, rcTotal.bottom);
   

   CBitmap *pOldBitmap = (CBitmap*)MemDC.SelectObject(&MemBitmap);

   MemDC.Ellipse(rcTotal);
CRect rcClientx;
	




   pDC->BitBlt(0, 0, GetTotalSize().cx,  GetTotalSize().cy, &MemDC, 0, 0, SRCCOPY);


   MemDC.SelectObject(pOldBitmap);

   ReleaseDC(pDC);
   ReleaseDC(&MemDC);

1 Ответов

Рейтинг:
0

Richard MacCutchan

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

imageHeight и imageWidth укажите размеры исходного изображения. Пока destinationRect содержит в себе RECT значения окна назначения.

/*
 * Now we need to check whether the image is larger than the destination
 * rectangle. If so we need to adjust the width and/or height in the same
 * ratios to avoid distortion.
 *
 * If the image is wider than the destination, then it will be automatically
 * scaled horizontally to fit the window. If this happens then we need to
 * scale the height by the same amount.
 *
 * The calculation for the height is:
 *
 * NewHeight = ImageHeight x (DestinationWidth / ImageWidth)
 *
 * If the NewHeight is greater than the destination height we use this value
 * as the new destination height.
 *
 * Similarly we calcuate the new width based on the height values.
 *
 */
if (imageWidth > destinationRect.Width)
{
	// if wider than window then scale the height by the width scaling
	REAL newHeight = imageHeight * (destinationRect.Width / imageWidth);
	// but don't make it deeper than the window
	if (destinationRect.Height > newHeight)
		destinationRect.Height = newHeight;
}
if (imageHeight > destinationRect.Height)
{
	// if deeper than window then adjust width by aspect ratio
	REAL newWidth = imageWidth * (destinationRect.Height / imageHeight);
	if (destinationRect.Width > newWidth)
		destinationRect.Width = newWidth;
}