<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[BackBuffer bei WinAPI unter C++]]></title><description><![CDATA[<p>Servus Leutz!</p>
<p>Habe folgendes Problem:<br />
Möchte einen Backbuffer bei einem WinAPI-Window machen.Habe eine eigene Window-Klasse geschrieben, die den Backbuffer wie folgt initialisiert:</p>
<pre><code>// Create Window 
m_hwnd = CreateWindow(m_WindowClassName.c_str(), &quot;New Window&quot;, 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, &amp;rect); 
  HBITMAP hgPic = CreateCompatibleBitmap(m_BackBuffer,rect.right,rect.bottom); 

  SelectObject(m_BackBuffer,hgPic); 
  FillRect(m_BackBuffer,&amp;rect,HBRUSH(GetStockObject(WHITE_BRUSH))); 
   DeleteObject(hgPic); 
}
</code></pre>
<p>Als nächstes möchte ich ein Bild in den Backbuffer kopieren, was auch soweit funktioniert:</p>
<pre><code>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),&amp;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; 
}
</code></pre>
<p>Um den BackBuffer in den DeviceContext des aktuellen Windows zu kopieren benutze ich folgende Methode:</p>
<pre><code>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,&amp;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(), &amp;wndclass) ) 
  { 
    // Delete Contents from BackBuffer 
    FillRect(m_BackBuffer,&amp;rect,HBRUSH (GetStockObject(WHITE_BRUSH))); 
  } 

  ReleaseDC(m_hwnd,ScreenDC); 
}
</code></pre>
<p>Mein Problem ist jetzt folgendes:<br />
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?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/74015/backbuffer-bei-winapi-unter-c</link><generator>RSS for Node</generator><lastBuildDate>Fri, 10 Apr 2026 10:46:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/74015.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 16 May 2004 14:18:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to BackBuffer bei WinAPI unter C++ on Sun, 16 May 2004 14:18:37 GMT]]></title><description><![CDATA[<p>Servus Leutz!</p>
<p>Habe folgendes Problem:<br />
Möchte einen Backbuffer bei einem WinAPI-Window machen.Habe eine eigene Window-Klasse geschrieben, die den Backbuffer wie folgt initialisiert:</p>
<pre><code>// Create Window 
m_hwnd = CreateWindow(m_WindowClassName.c_str(), &quot;New Window&quot;, 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, &amp;rect); 
  HBITMAP hgPic = CreateCompatibleBitmap(m_BackBuffer,rect.right,rect.bottom); 

  SelectObject(m_BackBuffer,hgPic); 
  FillRect(m_BackBuffer,&amp;rect,HBRUSH(GetStockObject(WHITE_BRUSH))); 
   DeleteObject(hgPic); 
}
</code></pre>
<p>Als nächstes möchte ich ein Bild in den Backbuffer kopieren, was auch soweit funktioniert:</p>
<pre><code>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),&amp;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; 
}
</code></pre>
<p>Um den BackBuffer in den DeviceContext des aktuellen Windows zu kopieren benutze ich folgende Methode:</p>
<pre><code>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,&amp;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(), &amp;wndclass) ) 
  { 
    // Delete Contents from BackBuffer 
    FillRect(m_BackBuffer,&amp;rect,HBRUSH (GetStockObject(WHITE_BRUSH))); 
  } 

  ReleaseDC(m_hwnd,ScreenDC); 
}
</code></pre>
<p>Mein Problem ist jetzt folgendes:<br />
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?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/521377</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/521377</guid><dc:creator><![CDATA[gorny]]></dc:creator><pubDate>Sun, 16 May 2004 14:18:37 GMT</pubDate></item><item><title><![CDATA[Reply to BackBuffer bei WinAPI unter C++ on Sun, 16 May 2004 16:00:07 GMT]]></title><description><![CDATA[<p>Wie rufst du die Funktionen denn auf?<br />
Auf jeden Fall ist es falsch, dass du CreateCompatibleBitmap mit den Backbuffer-DC aufrufst - da musst du einen &quot;richtigen&quot; DC einsetzen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>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</p>
]]></description><link>https://www.c-plusplus.net/forum/post/521422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/521422</guid><dc:creator><![CDATA[flenders]]></dc:creator><pubDate>Sun, 16 May 2004 16:00:07 GMT</pubDate></item></channel></rss>