CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CBitmap MemBitmap;
MemBitmap.CreateCompatibleBitmap(pDC, 1000, 1000);
CBitmap *pOldBitmap = MemDC.SelectObject(&MemBitmap);
MemDC.Ellipse(x, y, x+size, y+size);
pDC->BitBlt(0, 0, 1000, 1000, &MemDC, 0, 0, SRCCOPY);
MemDC.SelectObject(pOldBitmap);
Двойная буферизация- помогите реализвать
Добрый день. Помогите реаилизовать двойную буферизацию.. Юзал такой код но только все хуже делает... Помогите
Код:
#pragma once
typedef struct SURFACE : CDC
{
SURFACE(){
hBitmap = NULL;
}
~SURFACE(){
Release();
}
BOOL Create(CDC* pDC,long right,long bottom){
Release();
if(CreateCompatibleDC(pDC)){
if(!pDC) hBitmap = CreateCompatibleBitmap(m_hDC,right,bottom);
else hBitmap = CreateCompatibleBitmap(pDC->m_hDC,right,bottom);
if(hBitmap)
if(SelectObject(hBitmap))
return TRUE;
}
Release();
return FALSE;
}
void Release(){
if(hBitmap)
DeleteObject(hBitmap);
if(m_hDC)
DeleteDC();
}
BOOL Copy(CDC* pDC, CRect Rect){
if(pDC)
return BitBlt(Rect.left,Rect.top,Rect.right,Rect.bottom,pDC,0,0,SRCCOPY);
return FALSE;
}
BOOL Draw(CDC* pDC, CRect Rect, long x = 0, long y = 0){
if(pDC)
return pDC->BitBlt(Rect.left,Rect.top,Rect.right-Rect.left,Rect.bottom-Rect.top,this,x,y,SRCCOPY);
return FALSE;
}
BOOL Draw(CDC* pDC, POINT point){
RECT Rect = *this;
return Draw(pDC,CRect(point.x,point.y,Rect.right+point.x,Rect.bottom+point.y));
}
BOOL DrawTransparent(CDC* pDC, POINT point,COLORREF Color){
RECT Rect = *this;
return DrawTransparent(pDC,CRect(point.x,point.y,Rect.right,Rect.bottom),Color);
}
BOOL DrawTransparent(CDC* pDC, CRect Rect,COLORREF Color){
if(pDC)
return pDC->TransparentBlt(Rect.left,Rect.top,Rect.right,Rect.bottom,this,0,0,Rect.right,Rect.bottom,Color);
return FALSE;
}
BOOL GetFromResource(CDC* pDC,long id)
{
Release();
if(pDC && CreateCompatibleDC(pDC)){
hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(id), IMAGE_BITMAP,0,0,LR_SHARED|LR_CREATEDIBSECTION);
if(hBitmap)
if(SelectObject(hBitmap))
return TRUE;
}
Release();
return FALSE;
}
operator RECT(){
BITMAP Bitmap;
GetObject(hBitmap, sizeof(BITMAP),&Bitmap);
return CRect(0,0,Bitmap.bmWidth,Bitmap.bmHeight);
}
operator CDC*(){
return this;
}
operator HDC(){
return m_hDC;
}
HBITMAP hBitmap;
} *LPSURFACE;
typedef struct SURFACE : CDC
{
SURFACE(){
hBitmap = NULL;
}
~SURFACE(){
Release();
}
BOOL Create(CDC* pDC,long right,long bottom){
Release();
if(CreateCompatibleDC(pDC)){
if(!pDC) hBitmap = CreateCompatibleBitmap(m_hDC,right,bottom);
else hBitmap = CreateCompatibleBitmap(pDC->m_hDC,right,bottom);
if(hBitmap)
if(SelectObject(hBitmap))
return TRUE;
}
Release();
return FALSE;
}
void Release(){
if(hBitmap)
DeleteObject(hBitmap);
if(m_hDC)
DeleteDC();
}
BOOL Copy(CDC* pDC, CRect Rect){
if(pDC)
return BitBlt(Rect.left,Rect.top,Rect.right,Rect.bottom,pDC,0,0,SRCCOPY);
return FALSE;
}
BOOL Draw(CDC* pDC, CRect Rect, long x = 0, long y = 0){
if(pDC)
return pDC->BitBlt(Rect.left,Rect.top,Rect.right-Rect.left,Rect.bottom-Rect.top,this,x,y,SRCCOPY);
return FALSE;
}
BOOL Draw(CDC* pDC, POINT point){
RECT Rect = *this;
return Draw(pDC,CRect(point.x,point.y,Rect.right+point.x,Rect.bottom+point.y));
}
BOOL DrawTransparent(CDC* pDC, POINT point,COLORREF Color){
RECT Rect = *this;
return DrawTransparent(pDC,CRect(point.x,point.y,Rect.right,Rect.bottom),Color);
}
BOOL DrawTransparent(CDC* pDC, CRect Rect,COLORREF Color){
if(pDC)
return pDC->TransparentBlt(Rect.left,Rect.top,Rect.right,Rect.bottom,this,0,0,Rect.right,Rect.bottom,Color);
return FALSE;
}
BOOL GetFromResource(CDC* pDC,long id)
{
Release();
if(pDC && CreateCompatibleDC(pDC)){
hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(id), IMAGE_BITMAP,0,0,LR_SHARED|LR_CREATEDIBSECTION);
if(hBitmap)
if(SelectObject(hBitmap))
return TRUE;
}
Release();
return FALSE;
}
operator RECT(){
BITMAP Bitmap;
GetObject(hBitmap, sizeof(BITMAP),&Bitmap);
return CRect(0,0,Bitmap.bmWidth,Bitmap.bmHeight);
}
operator CDC*(){
return this;
}
operator HDC(){
return m_hDC;
}
HBITMAP hBitmap;
} *LPSURFACE;
Код:
SURFACE surface;
surface.Create(pDC,1000,1000);
surface.Ellipse(x,y,x+size,y+size);
surface.Draw(pDC,CPoint(0,0));
surface.Create(pDC,1000,1000);
surface.Ellipse(x,y,x+size,y+size);
surface.Draw(pDC,CPoint(0,0));
Код:
//---------------
//Show function
//---------------
int enemy::Show()
{
/*CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CBitmap MemBitmap;
MemBitmap.CreateCompatibleBitmap(pDC, 1000, 1000);*/
//CBitmap *pOldBitmap = MemDC.SelectObject(&MemBitmap);
SURFACE surface;
surface.Create(pDC, 1000, 1000);
surface.Ellipse(x,y,x+size,y+size);
surface.Draw(pDC,CPoint(0,0));
//MemDC.Ellipse(x, y, x+size, y+size);
//pDC->BitBlt(0, 0, 800, 600, &MemDC, 0, 0, SRCCOPY);
//MemDC.SelectObject(pOldBitmap);
return 0;
}
//Show function
//---------------
int enemy::Show()
{
/*CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CBitmap MemBitmap;
MemBitmap.CreateCompatibleBitmap(pDC, 1000, 1000);*/
//CBitmap *pOldBitmap = MemDC.SelectObject(&MemBitmap);
SURFACE surface;
surface.Create(pDC, 1000, 1000);
surface.Ellipse(x,y,x+size,y+size);
surface.Draw(pDC,CPoint(0,0));
//MemDC.Ellipse(x, y, x+size, y+size);
//pDC->BitBlt(0, 0, 800, 600, &MemDC, 0, 0, SRCCOPY);
//MemDC.SelectObject(pOldBitmap);
return 0;
}
Юзинг-
Код:
for(int i = 0; i < howmany ; i++ )
enemies->Show();
enemies->Show();
Код:
surface.Ellipse(x,y,x+size,y+size);
тут координаты эллипса выходят за пределы видимости окна.
Мигающее потому что
Код:
for(int i = 0; i < howmany ; i++ ) enemies->Show();
тут создаётся несколько буферов, в которые рисуется изображение и которые потом по очереди выводятся на экран.
А смысл буферизации в том, чтобы за один раз все нарисовать в один буфер, и вывести его на экран.
То есть примерно так
Код:
SURFACE surface;
surface.Create(pDC, 1000, 1000);
for(int i = 0; i < howmany ; i++ ){
enemies->Show(&surface);
}
surface.Draw(pDC,CPoint(0,0));
surface.Create(pDC, 1000, 1000);
for(int i = 0; i < howmany ; i++ ){
enemies->Show(&surface);
}
surface.Draw(pDC,CPoint(0,0));
Код:
int enemy::Show(SURFACE& surface)
{
surface.Ellipse(x,y,x+size,y+size);
return 0;
}
{
surface.Ellipse(x,y,x+size,y+size);
return 0;
}
Код:
GetClientRect(m_RectClient);
CDC dc;
dc.CreateCompatibleDC(pDC);
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDC, m_RectClient.right, m_RectClient.bottom);
dc.SelectObject(bmp);
dc.PatBlt(0,0,m_RectClient.right, m_RectClient.bottom,WHITENESS);
if(bfirst == 0)
for(int i = 0; i < howmany ; i++ )
dc.Ellipse(enemies->x, enemies->y, enemies->x+enemies->size, enemies->y+enemies->size);
CString string;
string.Format(_T("Scores: %d Time: %d:%d"), scores, time_to_end/60, time_to_end%60);
if(time_to_end == 0)
string.Format(_T("Scores: %d Time: TIME OVER!!!!!!! :)"), scores);
dc.TextOutW(5, 5, string);
pDC->BitBlt(0, 0, m_RectClient.right, m_RectClient.bottom, &dc, 0, 0, SRCCOPY);
dc.DeleteDC();
CDC dc;
dc.CreateCompatibleDC(pDC);
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDC, m_RectClient.right, m_RectClient.bottom);
dc.SelectObject(bmp);
dc.PatBlt(0,0,m_RectClient.right, m_RectClient.bottom,WHITENESS);
if(bfirst == 0)
for(int i = 0; i < howmany ; i++ )
dc.Ellipse(enemies->x, enemies->y, enemies->x+enemies->size, enemies->y+enemies->size);
CString string;
string.Format(_T("Scores: %d Time: %d:%d"), scores, time_to_end/60, time_to_end%60);
if(time_to_end == 0)
string.Format(_T("Scores: %d Time: TIME OVER!!!!!!! :)"), scores);
dc.TextOutW(5, 5, string);
pDC->BitBlt(0, 0, m_RectClient.right, m_RectClient.bottom, &dc, 0, 0, SRCCOPY);
dc.DeleteDC();
Ничего не пашет! все еще мигает.. код из ondraw.. invalidate каждую милисекунду
2 cpp - исходника
помогите плиз
Цитата:
мигание бывает из за того что сначала рисуется фон а затем по фону изображение, этого надо избежать
как этого избежать