<?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[Bildanzeige mit OnPaint funktioniert nur begrenzt oft]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe folgendes Problem: Habe mittels MFC ein (modales) Pop-Up-Fenster erstellt, in welchem ich immer wieder Bilder darstellen möchte, die von der vorherigen Eingabe des Benutzers abhängig sind. Ich benutze dazu die OnPaint-Methode meiner Klasse PopUp, welcher das entsprechende Fenster angehört.</p>
<p>So sieht der (meiner Meinung nach entscheidende Code aus:</p>
<pre><code>[cpp]void PopUp::OnPaint() 
{

	CPaintDC dc(this); // device context for painting
	CDC *pDC = GetDC();

	m_point = new CDC;
	m_point-&gt;CreateCompatibleDC(pDC);
	CBitmap* pCBitmap = CBitmap::FromHandle(hBild);

	int nBitsPerPixel = dc.GetDeviceCaps(BITSPIXEL);
	int nPlanes = dc.GetDeviceCaps(PLANES);

	hBild = CreateBitmap( 1024, 768, nPlanes, nBitsPerPixel, Bildarray);

	m_point-&gt;SelectObject(pCBitmap);

	dc.BitBlt(0,0,1024,768,m_point, 0,0,SRCCOPY);

}[/cpp]
</code></pre>
<p>Dabei wird der Inhalt der Matrix &quot;Bildarray&quot; im Popup-Fenster grafisch dargestellt; hBild wurde im Header als HBITMAP, m_point als CDC-Pointer definiert. Das Programm funktioniert generell auch, leider nur für ca. 50 Durchläufe, danach bleibt das Fenster unabhängig von der Eingabe leer.</p>
<p>Ich würde mich sehr freuen, wenn mir jemand helfen könnte. Dafür schonmal vielen Dank im voraus und sorry falls es total dämlich ist, ich habe erst neulich mit C++ angefangen.</p>
<p>Beste Grüße!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/200308/bildanzeige-mit-onpaint-funktioniert-nur-begrenzt-oft</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Apr 2026 02:53:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/200308.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 13 Dec 2007 11:04:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Bildanzeige mit OnPaint funktioniert nur begrenzt oft on Thu, 13 Dec 2007 11:04:12 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe folgendes Problem: Habe mittels MFC ein (modales) Pop-Up-Fenster erstellt, in welchem ich immer wieder Bilder darstellen möchte, die von der vorherigen Eingabe des Benutzers abhängig sind. Ich benutze dazu die OnPaint-Methode meiner Klasse PopUp, welcher das entsprechende Fenster angehört.</p>
<p>So sieht der (meiner Meinung nach entscheidende Code aus:</p>
<pre><code>[cpp]void PopUp::OnPaint() 
{

	CPaintDC dc(this); // device context for painting
	CDC *pDC = GetDC();

	m_point = new CDC;
	m_point-&gt;CreateCompatibleDC(pDC);
	CBitmap* pCBitmap = CBitmap::FromHandle(hBild);

	int nBitsPerPixel = dc.GetDeviceCaps(BITSPIXEL);
	int nPlanes = dc.GetDeviceCaps(PLANES);

	hBild = CreateBitmap( 1024, 768, nPlanes, nBitsPerPixel, Bildarray);

	m_point-&gt;SelectObject(pCBitmap);

	dc.BitBlt(0,0,1024,768,m_point, 0,0,SRCCOPY);

}[/cpp]
</code></pre>
<p>Dabei wird der Inhalt der Matrix &quot;Bildarray&quot; im Popup-Fenster grafisch dargestellt; hBild wurde im Header als HBITMAP, m_point als CDC-Pointer definiert. Das Programm funktioniert generell auch, leider nur für ca. 50 Durchläufe, danach bleibt das Fenster unabhängig von der Eingabe leer.</p>
<p>Ich würde mich sehr freuen, wenn mir jemand helfen könnte. Dafür schonmal vielen Dank im voraus und sorry falls es total dämlich ist, ich habe erst neulich mit C++ angefangen.</p>
<p>Beste Grüße!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419858</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419858</guid><dc:creator><![CDATA[lask]]></dc:creator><pubDate>Thu, 13 Dec 2007 11:04:12 GMT</pubDate></item><item><title><![CDATA[Reply to Bildanzeige mit OnPaint funktioniert nur begrenzt oft on Thu, 13 Dec 2007 11:17:27 GMT]]></title><description><![CDATA[<p>Ein klarer Fall von Ressourcen-Leck. Du holst dir in jedem Durchlauf mit CreateBitmap() ein neues Bitmap-Handle, ohne diese irgendwo wieder zurückzugeben<sup>*</sup> - da ist es klar, daß dem System nach einer Weile die Handles ausgehen.<br />
(außerdem forderst du jedes Mal einen neuen CDC an, der auch nicht wieder freigegeben wird - aber bis der Speicher überläuft, dürfte es ein wenig länger dauern)</p>
<p><sup>*</sup> wenn du das Bitmap-Handle nicht mehr benötigst, kannst du es bedenkenlos über DeleteObject() wieder freigeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419865</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419865</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 13 Dec 2007 11:17:27 GMT</pubDate></item><item><title><![CDATA[Reply to Bildanzeige mit OnPaint funktioniert nur begrenzt oft on Thu, 13 Dec 2007 12:19:36 GMT]]></title><description><![CDATA[<p>Zunächst schonmal vielen Dank für die schnelle Antwort!<br />
Ich habe das direkt mal ausprobiert, nur leider ist es mir nicht klar, an welcher Stelle ich das Bitmap-Handle freigeben kann. Eigentlich dachte ich, dass nachdem die Daten mittels BitBlt-Methode an den Bildschirm gegeben wurde, das Handle gelöscht werden kann. Füge ich jedoch als letzte Zeile</p>
<pre><code class="language-cpp">DeleteObject(hBild);
</code></pre>
<p>ein, so funktioniert die Darstellung überhaupt nicht mehr. Das bringt mich zu folgenden Fragen:</p>
<ol>
<li>Kann ich nachdem ich das Handle mit DeleteObject() gelöscht habe, überhaupt nochmal ein Bitmap-Handle mit diesem Namen erstellen, bzw. würde das mit dem Aufruf</li>
</ol>
<pre><code class="language-cpp">hBild = CreateBitmap( 1024, 768, nPlanes, nBitsPerPixel, Bildarray);
</code></pre>
<p>auch gemacht werden?</p>
<ol start="2">
<li>
<p>Kann ich DeleteObject() auch aus einer anderen Methode der entsprechenden Klasse aufrufen?</p>
</li>
<li>
<p>Kann ich 2) gegebenenfalls ausführen, bevor es überhaupt ein solches Handle gibt, d.h. ich würde das Handle &quot;provisorisch&quot; in einer anderen Methode freigeben, ohne zu wissen, ob das Handle schon erzeugt wurde?</p>
</li>
</ol>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Nochmals vielen Dank und beste Grüße!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419911</guid><dc:creator><![CDATA[lask]]></dc:creator><pubDate>Thu, 13 Dec 2007 12:19:36 GMT</pubDate></item><item><title><![CDATA[Reply to Bildanzeige mit OnPaint funktioniert nur begrenzt oft on Thu, 13 Dec 2007 12:32:03 GMT]]></title><description><![CDATA[<p>Das Bitmap-Handle mußt zumindest so lange gültig sein, wie es verwendet wird. Ich würde (als erstes) darauf verzichten, in jedem Durchlauf einen neuen CDC anzulegen - und dann jeweils das Handle freigeben, das du beim SelectObject() Aufruf zurückbekommen hast:</p>
<pre><code class="language-cpp">//ungetestet - und ohne Gewähr
hBild = CreateBitmap( 1024, 768, nPlanes, nBitsPerPixel, Bildarray);
HANDLE hOld = m_point-&gt;SelectObject(pCBitmap);
dc.BitBlt(0,0,1024,768,m_point, 0,0,SRCCOPY);
DeleteObject(hOld);
</code></pre>
<p>Zu deinen Fragen:</p>
<ol>
<li>ja</li>
<li>ja</li>
<li>bin ich nicht sicher</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1419917</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419917</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 13 Dec 2007 12:32:03 GMT</pubDate></item><item><title><![CDATA[Reply to Bildanzeige mit OnPaint funktioniert nur begrenzt oft on Thu, 13 Dec 2007 15:48:20 GMT]]></title><description><![CDATA[<p>Habe deinen Vorschlag ausprobiert - funktioniert generell, löst aber leider das Problem nicht. Außerdem hab ich im Konstruktor m_point = NULL gesetzt und dann in der OnPaint-Methode folgenden Aufruf gemacht:</p>
<pre><code class="language-cpp">if(m_point==NULL){
		m_point = new CDC;
	}
</code></pre>
<p>Dies führt zu einem Runtime-Error, ich verstehe aber nicht, wieso...<br />
Außerdem schlug mir ein Kollege vor, die gesamte Bilddarstellung folgendermaßen zu machen:</p>
<pre><code>[cpp]void PopUp::OnPaint() 
{
	if(m_point==NULL){
		m_point = new CDC;
	}
	m_point-&gt;CreateCompatibleDC(pDC);

	if (!bitmapInitialized) {
		int nBitsPerPixel = dc.GetDeviceCaps(BITSPIXEL);
		int nPlanes = dc.GetDeviceCaps(PLANES);
		bitmap.CreateBitmap( 1024, 768, nPlanes, nBitsPerPixel, Bildarray);
		bitmapInitialized = TRUE;
		HANDLE hOld = m_point-&gt;SelectObject(&amp;bitmap);
	}

	dc.BitBlt(0,0,1024,768,m_point, 0,0,SRCCOPY);

}[/cpp]
</code></pre>
<p>wobei bitmapInitialized als bool im Konstruktor mit FALSE initialisiert wurde. Auch da scheint es an der Abfrage, ob m_point == NULL ist, zu scheitern. bitmap stellt hier ein CBitmap-Objekt dar.</p>
<p>Ich bitte um Nachsicht mit meiner Unfähigkeit das wahrscheinlich nicht besonders anspruchsvolle Problem zu lösen.<br />
Dankeschön!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1420036</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1420036</guid><dc:creator><![CDATA[lask]]></dc:creator><pubDate>Thu, 13 Dec 2007 15:48:20 GMT</pubDate></item><item><title><![CDATA[Reply to Bildanzeige mit OnPaint funktioniert nur begrenzt oft on Thu, 13 Dec 2007 18:33:17 GMT]]></title><description><![CDATA[<p>Der DC wird auch nicht freigegeben.</p>
<p>Warum erzeugst Du keinen CPaintDC?<br />
Ohne CPaintDC wird Dein Programm in eine Endlosschleife gehen und nie aufhören das Control zu zeichnen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1420136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1420136</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Thu, 13 Dec 2007 18:33:17 GMT</pubDate></item><item><title><![CDATA[Reply to Bildanzeige mit OnPaint funktioniert nur begrenzt oft on Mon, 17 Dec 2007 09:15:56 GMT]]></title><description><![CDATA[<p>Danke auch für den letzten Beitrag,<br />
wie gesagt bin ich leider recht unerfahren, was die Programmierung mit MFC angeht. Könntest du mir vielleicht zeigen, wie das konkret aussähe? Ich habe jetzt wirklich schon viel ausprobiert ohne das Problem zu lösen. Mittlerweile bin ich doch wieder bei der Version angelangt, die ich in meinem ersten Post angegeben habe:</p>
<pre><code>[cpp]void PopUp::OnPaint() 
{

    CPaintDC dc(this); // device context for painting
	CDC *pDC = GetDC();

	m_point = new CDC;
	m_point-&gt;CreateCompatibleDC(pDC);
	CBitmap* pCBitmap = CBitmap::FromHandle(hBild);

	int nBitsPerPixel = dc.GetDeviceCaps(BITSPIXEL);
	int nPlanes = dc.GetDeviceCaps(PLANES);

	hBild = CreateBitmap( 1024, 768, nPlanes, nBitsPerPixel, Bildarray);

	m_point-&gt;SelectObject(pCBitmap);

	dc.BitBlt(0,0,1024,768,m_point, 0,0,SRCCOPY);
	ReleaseDC(pDC);

    ReleaseDC(m_point);

	m_point-&gt;DeleteDC();

}[/cpp]
</code></pre>
<p>Nun habe ich, wie zu sehen ist, versucht mit:</p>
<pre><code class="language-cpp">ReleaseDC(pDC);

ReleaseDC(m_point);

m_point-&gt;DeleteDC();
</code></pre>
<p>alles freizugeben, was ich irgendwo reserviere. Außerdem benutze ich nach jeder Anzeige eine Methode, welche</p>
<pre><code class="language-cpp">DeleteObject(hBild)
</code></pre>
<p>ausführt. Trotzdem wird nach einigen Durchläufen nur noch der Hintergrund und nicht mehr das richtige Bild angezeigt. Hab ich irgendwo was vergessen, oder mach ich grundsätzlich was falsch? Falls ja, wie geht es richtig, bzw. wo kann ich das genau nachlesen ohne besondere Programmierkenntnisse zu benötigen?<br />
Besten Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1421816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1421816</guid><dc:creator><![CDATA[lask]]></dc:creator><pubDate>Mon, 17 Dec 2007 09:15:56 GMT</pubDate></item><item><title><![CDATA[Reply to Bildanzeige mit OnPaint funktioniert nur begrenzt oft on Mon, 17 Dec 2007 09:34:58 GMT]]></title><description><![CDATA[<p>Was passiert wenn du</p>
<pre><code class="language-cpp">void PopUp::OnPaint() 
{

    CPaintDC dc(this); // device context for painting
	CDC *pDC = GetDC();

	CDC m_point;
	m_point.CreateCompatibleDC(pDC);
	CBitmap* pCBitmap = CBitmap::FromHandle(hBild);

	int nBitsPerPixel = dc.GetDeviceCaps(BITSPIXEL);
	int nPlanes = dc.GetDeviceCaps(PLANES);

	hBild = CreateBitmap( 1024, 768, nPlanes, nBitsPerPixel, Bildarray);

	m_point.SelectObject(pCBitmap);

	dc.BitBlt(0,0,1024,768,m_point, 0,0,SRCCOPY);
	ReleaseDC(pDC);

}
</code></pre>
<p>machst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1421819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1421819</guid><dc:creator><![CDATA[AndyDD]]></dc:creator><pubDate>Mon, 17 Dec 2007 09:34:58 GMT</pubDate></item><item><title><![CDATA[Reply to Bildanzeige mit OnPaint funktioniert nur begrenzt oft on Mon, 17 Dec 2007 09:35:36 GMT]]></title><description><![CDATA[<p>Ich würde es so schreiben (aber nicht im Compiler getestet):</p>
<pre><code class="language-cpp">void PopUp::OnPaint() 
{ 
    CPaintDC dc(this); // device context for painting 

    CDC memDC;
    memDC.CreateCompatibleDC(&amp;dc);

    int nBitsPerPixel = dc.GetDeviceCaps(BITSPIXEL); 
    int nPlanes = dc.GetDeviceCaps(PLANES); 

    CBitmap bitmap;
    bitmap.CreateBitmap( 1024, 768, nPlanes, nBitsPerPixel, Bildarray); 

    CBitmap* pOldBitmap = memDC.SelectObject(&amp;bitmap); 

    dc.BitBlt(0,0,1024,768, &amp;memDC, 0,0,SRCCOPY); 

    memDC.SelectObject(pOldBitmap);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1421821</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1421821</guid><dc:creator><![CDATA[sri]]></dc:creator><pubDate>Mon, 17 Dec 2007 09:35:36 GMT</pubDate></item><item><title><![CDATA[Reply to Bildanzeige mit OnPaint funktioniert nur begrenzt oft on Mon, 17 Dec 2007 09:38:48 GMT]]></title><description><![CDATA[<p>genau :xmas2:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1421822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1421822</guid><dc:creator><![CDATA[AndyDD]]></dc:creator><pubDate>Mon, 17 Dec 2007 09:38:48 GMT</pubDate></item><item><title><![CDATA[Reply to Bildanzeige mit OnPaint funktioniert nur begrenzt oft on Mon, 17 Dec 2007 09:45:38 GMT]]></title><description><![CDATA[<p>Yippie!</p>
<p>Tausend Dank! AndyDD, dein Vorschlag lief, behob aber das Problem nicht, trotzdem danke. sri, du bist für heute (bzw. diese Woche) mein persönlicher Held, deine Version funktioniert astrein! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Vielen Dank an dieser Stelle nochmal an alle, die geholfen haben!<br />
Eine schöne Woche euch allen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1421827</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1421827</guid><dc:creator><![CDATA[lask]]></dc:creator><pubDate>Mon, 17 Dec 2007 09:45:38 GMT</pubDate></item><item><title><![CDATA[Reply to Bildanzeige mit OnPaint funktioniert nur begrenzt oft on Mon, 17 Dec 2007 09:49:42 GMT]]></title><description><![CDATA[<p>so wie sri hatte ich das auch gemeint. CreateCompatibleDC ist natürlich auf den PaintDC anzuwenden; das hab ich wohl da übersehen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1421830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1421830</guid><dc:creator><![CDATA[AndyDD]]></dc:creator><pubDate>Mon, 17 Dec 2007 09:49:42 GMT</pubDate></item></channel></rss>