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