BackBuffer bei WinAPI unter C++



  • Servus Leutz!

    Habe folgendes Problem:
    Möchte einen Backbuffer bei einem WinAPI-Window machen.Habe eine eigene Window-Klasse geschrieben, die den Backbuffer wie folgt initialisiert:

    // Create Window 
    m_hwnd = CreateWindow(m_WindowClassName.c_str(), "New Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, NULL, NULL); 
    
    // BackBuffer-Device erzeugen 
    if (m_hwnd != NULL) 
    { 
    // GetDevice ist Klasseneigene Methode 
    m_BackBuffer = CreateCompatibleDC(GetDevice()); 
    } 
    
    if (m_BackBuffer != NULL) 
    { 
      // Resize Backbuffer with size of Client Area from this window 
      RECT rect; 
      GetClientRect(m_hwnd, &rect); 
      HBITMAP hgPic = CreateCompatibleBitmap(m_BackBuffer,rect.right,rect.bottom); 
    
      SelectObject(m_BackBuffer,hgPic); 
      FillRect(m_BackBuffer,&rect,HBRUSH(GetStockObject(WHITE_BRUSH))); 
       DeleteObject(hgPic); 
    }
    

    Als nächstes möchte ich ein Bild in den Backbuffer kopieren, was auch soweit funktioniert:

    bool CWindow::ShowImage(int xPos, int yPos, WORD ImageId) 
    { 
      HDC hdcMem = CreateCompatibleDC(GetDevice()); 
      HBITMAP hBitmap; 
      BITMAP bitmapInfo; 
    
      // Load Picture and set into DV hdcMem 
      hBitmap = LoadBitmap(m_Instance,MAKEINTRESOURCE(ImageId))    
      GetObject(hBitmap,sizeof(BITMAP),&bitmapInfo); 
      SelectObject(hdcMem,hBitmap); 
    
      // Copy Bitmap into BackBuffer 
      BitBlt (m_BackBuffer,xPos,yPos,bitmapInfo.bmWidth,bitmapInfo.bmHeight,hdcMem,0,0,SRCCOPY); 
      ReleaseDC(m_hwnd,hdcMem); 
      return true; 
    }
    

    Um den BackBuffer in den DeviceContext des aktuellen Windows zu kopieren benutze ich folgende Methode:

    void CWindow::Flip() 
    // Copys all Data from Backbuffer to Screenbuffer 
    { 
      HDC ScreenDC = GetDevice(); 
      RECT   rect; 
      WNDCLASS wndclass; 
    
      // Copy Data from BackBuffer to Screenbuffer 
      GetClientRect(m_hwnd,&rect);    
      BitBlt(ScreenDC,0,0,rect.right,rect.bottom,m_BackBuffer,0,0,SRCCOPY);       
      // Hintergrundfarbe des Fensters ermitteln 
      if ( GetClassInfo(m_Instance,m_WindowClassName.c_str(), &wndclass) ) 
      { 
        // Delete Contents from BackBuffer 
        FillRect(m_BackBuffer,&rect,HBRUSH (GetStockObject(WHITE_BRUSH))); 
      } 
    
      ReleaseDC(m_hwnd,ScreenDC); 
    }
    

    Mein Problem ist jetzt folgendes:
    Egal wechles Bild ich lade, es wird immer nur ein schwarzes Bild (hier in Form eines Rechtecks) angezeigt. Wieso nimmt er nicht mein geladenes Bild, was sich ja im Backbuffer befinden müsste?



  • Wie rufst du die Funktionen denn auf?
    Auf jeden Fall ist es falsch, dass du CreateCompatibleBitmap mit den Backbuffer-DC aufrufst - da musst du einen "richtigen" DC einsetzen 😉

    Kopierst du denn dein Bild immer wieder neu in den Backbuffer, denn mit dem FillRect-Aufruf löscht du ja nach jedem Blitten den Inhalt des Backbuffers


Anmelden zum Antworten