Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Двойная буферизация- помогите реализвать

12K
26 октября 2008 года
Proger77
71 / / 14.02.2008
Добрый день. Помогите реаилизовать двойную буферизацию.. Юзал такой код но только все хуже делает... Помогите
Код:
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);
2.2K
26 октября 2008 года
REFOT
181 / / 08.04.2005
я делаю так:
Код:
#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;



 
Код:
SURFACE surface;
surface.Create(pDC,1000,1000);
surface.Ellipse(x,y,x+size,y+size);
surface.Draw(pDC,CPoint(0,0));
12K
03 ноября 2008 года
Proger77
71 / / 14.02.2008
Не работает... Просто черное, мигающие окно... Код--

Код:
//---------------
//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();
2.2K
03 ноября 2008 года
REFOT
181 / / 08.04.2005
Чёрное окно возможно потому что
 
Код:
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));

 
Код:
int enemy::Show(SURFACE& surface)
{
    surface.Ellipse(x,y,x+size,y+size);
    return 0;
}
12K
07 ноября 2008 года
Proger77
71 / / 14.02.2008
Код:
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();


Ничего не пашет! все еще мигает.. код из ondraw.. invalidate каждую милисекунду

2 cpp - исходника
12K
08 ноября 2008 года
Proger77
71 / / 14.02.2008
помогите плиз
12K
08 ноября 2008 года
Proger77
71 / / 14.02.2008
Цитата:
мигание бывает из за того что сначала рисуется фон а затем по фону изображение, этого надо избежать



как этого избежать

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог