<?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[Zwei verschiedene Bilder (HDC) in einen DC Schreiben]]></title><description><![CDATA[<p>Hallo</p>
<p>ich bin echt am verzweifeln, ich sitz hier den ganzen Tag an so nem billigen Problem. Ich denke langsam, dass ich einfach zu doof für diesen GeräteDevice bin. Das Problem ist zwar etwas kompliziert, aber ich versuchs mal:</p>
<p>Es existiert eine globale Variable vom Typ &quot;HBITMAP&quot;in der ein Bitmap abgelegt werden soll. Dieses Bitmap wird dann einfach in einem Fenster dargestellt... Das funktioniert...</p>
<p>Nun habe ich eine Funktion, die übernimmt zwei Bitmaps. Diese Bitmaps werden jeweils in einen SpeicherDC geladen, um über &quot;GetPixel&quot; an die Daten der Bilder zu gelangen. Das funktioniert tadellos, zumindest denke ich das, da die Daten zu stimmen scheinen. Nachdem einige Berechnungen mit den Daten passiert sind (was auch funktioniert) soll nun der Inhalt beider Bilder in ein Bild geschrieben werden, und die Funktion gibt dieses zusammengestellte Bild als &quot;HBITMAP&quot; an die aufrufende Funktion zurück (in die oben erwähnte globale Variable). Genau da liegt das Problem... Ich schaffe es nicht die beiden Bildinhalte in einen zu schreiben... Hier mal mein (gekürzter) Code bisher:</p>
<pre><code>[cpp]
//aufruf der Funktion:
  .
  .
  .
//wie man sieht, ist das erste Bild der beiden, das schon gespeicherte
TempBild = HBITMAP)::LoadImage(0,pfad.str().c_str(),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

m_hBitmapGesammt = //Globale Variable vom Typ &quot;HBITMAP&quot; 
		Bild_Zusammensetzen(m_hBitmapGesammt, TempBild, /*einige andere Parameter*/);
  .
  .
  .

//Die Funktion selbst:
HBITMAP Bild_Zusammensetzen(HBITMAP Bild1, HBITMAP Bild2, /*einige andere Parameter*/)
{
//erster Bildspeicher
HDC BildSpeicher1 = CreateCompatibleDC(0); 

SelectObject(BildSpeicher1, Bild1); 

//zweiter Bildspeicher
HDC BildSpeicher2 = CreateCompatibleDC(0); 

SelectObject(BildSpeicher2, Bild2); 

/**************************/

  //Bearbeiten der Daten mit GetPixel()
  //und einige weitere Funktionalitäten, die den Bildspeicher oder
  //die Bilder selbst nicht berühren

/**************************/

HDC dcPicture;
HBITMAP BildGesammt;
HGDIOBJ OldObj;
void *dibvalues;
BITMAPINFO bi;

dcPicture=CreateCompatibleDC(BildSpeicher1);

//an dieser Stelle habe ich auch schon mit &quot;CreateCompatibleBitmap()&quot; experimentiert
BildGesammt=CreateDIBSection(BildSpeicher1,&amp;bi,DIB_RGB_COLORS,(void**)&amp;dibvalues,NULL,NULL);
//oder:
//BildGesammt = CreateCompatibleBitmap(BildSpeicher1, /*breite beider Bilder*/, /*Höhe beider Bilder zusammen*/);

//warum tut man dies eigentlich??? 
//ich vermute mal, um die BITMAP Variable mit dem SpeicherDC zu &quot;verbinden&quot;
OldObj=SelectObject(dcPicture,BildGesammt);

BitBlt(dcPicture,0,0,ParameterBild2.bmWidth,ParameterBild2.bmHeight,BildSpeicher2,0,0,SRCCOPY); 

BitBlt(dcPicture,/*Höhe des ersten Bildes*/,0,ParameterBild1.bmWidth,ParameterBild1.bmHeight,BildSpeicher1,0,0,SRCCOPY);

DeleteDC(dcPicture); 
DeleteObject(OldObj);
DeleteDC(BildSpeicher1);
DeleteDC(BildSpeicher2);

return (BildGesammt)
}		
[/cpp]
</code></pre>
<p>Wo liegt denn jetzt mein Denkfehler??? Ich erstelle einen neuen SpeicherDC, und schreibe per &quot;BitBld()&quot; die Daten in ebend diesen. Als Ergebnis erhalte ich je nachdem entweder gar nix, oder ein schwarzes Bild, was allerdings in den Abmessungen schon sehr genau hinhaut. Ich vermute mal, dass ich deshalb gar nicht so weit weg bin...</p>
<p>Ich hoffe mir kann geholfen werden. Ich bedanke mich schon einmal im Voraus für die hoffentlich sehr zahl- und hilfreichen Antworten.</p>
<p>Gruß Stephan</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/198558/zwei-verschiedene-bilder-hdc-in-einen-dc-schreiben</link><generator>RSS for Node</generator><lastBuildDate>Wed, 29 Apr 2026 03:02:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/198558.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 22 Nov 2007 17:40:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zwei verschiedene Bilder (HDC) in einen DC Schreiben on Thu, 22 Nov 2007 17:40:10 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>ich bin echt am verzweifeln, ich sitz hier den ganzen Tag an so nem billigen Problem. Ich denke langsam, dass ich einfach zu doof für diesen GeräteDevice bin. Das Problem ist zwar etwas kompliziert, aber ich versuchs mal:</p>
<p>Es existiert eine globale Variable vom Typ &quot;HBITMAP&quot;in der ein Bitmap abgelegt werden soll. Dieses Bitmap wird dann einfach in einem Fenster dargestellt... Das funktioniert...</p>
<p>Nun habe ich eine Funktion, die übernimmt zwei Bitmaps. Diese Bitmaps werden jeweils in einen SpeicherDC geladen, um über &quot;GetPixel&quot; an die Daten der Bilder zu gelangen. Das funktioniert tadellos, zumindest denke ich das, da die Daten zu stimmen scheinen. Nachdem einige Berechnungen mit den Daten passiert sind (was auch funktioniert) soll nun der Inhalt beider Bilder in ein Bild geschrieben werden, und die Funktion gibt dieses zusammengestellte Bild als &quot;HBITMAP&quot; an die aufrufende Funktion zurück (in die oben erwähnte globale Variable). Genau da liegt das Problem... Ich schaffe es nicht die beiden Bildinhalte in einen zu schreiben... Hier mal mein (gekürzter) Code bisher:</p>
<pre><code>[cpp]
//aufruf der Funktion:
  .
  .
  .
//wie man sieht, ist das erste Bild der beiden, das schon gespeicherte
TempBild = HBITMAP)::LoadImage(0,pfad.str().c_str(),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

m_hBitmapGesammt = //Globale Variable vom Typ &quot;HBITMAP&quot; 
		Bild_Zusammensetzen(m_hBitmapGesammt, TempBild, /*einige andere Parameter*/);
  .
  .
  .

//Die Funktion selbst:
HBITMAP Bild_Zusammensetzen(HBITMAP Bild1, HBITMAP Bild2, /*einige andere Parameter*/)
{
//erster Bildspeicher
HDC BildSpeicher1 = CreateCompatibleDC(0); 

SelectObject(BildSpeicher1, Bild1); 

//zweiter Bildspeicher
HDC BildSpeicher2 = CreateCompatibleDC(0); 

SelectObject(BildSpeicher2, Bild2); 

/**************************/

  //Bearbeiten der Daten mit GetPixel()
  //und einige weitere Funktionalitäten, die den Bildspeicher oder
  //die Bilder selbst nicht berühren

/**************************/

HDC dcPicture;
HBITMAP BildGesammt;
HGDIOBJ OldObj;
void *dibvalues;
BITMAPINFO bi;

dcPicture=CreateCompatibleDC(BildSpeicher1);

//an dieser Stelle habe ich auch schon mit &quot;CreateCompatibleBitmap()&quot; experimentiert
BildGesammt=CreateDIBSection(BildSpeicher1,&amp;bi,DIB_RGB_COLORS,(void**)&amp;dibvalues,NULL,NULL);
//oder:
//BildGesammt = CreateCompatibleBitmap(BildSpeicher1, /*breite beider Bilder*/, /*Höhe beider Bilder zusammen*/);

//warum tut man dies eigentlich??? 
//ich vermute mal, um die BITMAP Variable mit dem SpeicherDC zu &quot;verbinden&quot;
OldObj=SelectObject(dcPicture,BildGesammt);

BitBlt(dcPicture,0,0,ParameterBild2.bmWidth,ParameterBild2.bmHeight,BildSpeicher2,0,0,SRCCOPY); 

BitBlt(dcPicture,/*Höhe des ersten Bildes*/,0,ParameterBild1.bmWidth,ParameterBild1.bmHeight,BildSpeicher1,0,0,SRCCOPY);

DeleteDC(dcPicture); 
DeleteObject(OldObj);
DeleteDC(BildSpeicher1);
DeleteDC(BildSpeicher2);

return (BildGesammt)
}		
[/cpp]
</code></pre>
<p>Wo liegt denn jetzt mein Denkfehler??? Ich erstelle einen neuen SpeicherDC, und schreibe per &quot;BitBld()&quot; die Daten in ebend diesen. Als Ergebnis erhalte ich je nachdem entweder gar nix, oder ein schwarzes Bild, was allerdings in den Abmessungen schon sehr genau hinhaut. Ich vermute mal, dass ich deshalb gar nicht so weit weg bin...</p>
<p>Ich hoffe mir kann geholfen werden. Ich bedanke mich schon einmal im Voraus für die hoffentlich sehr zahl- und hilfreichen Antworten.</p>
<p>Gruß Stephan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1408366</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1408366</guid><dc:creator><![CDATA[Predator_Jo]]></dc:creator><pubDate>Thu, 22 Nov 2007 17:40:10 GMT</pubDate></item><item><title><![CDATA[Reply to Zwei verschiedene Bilder (HDC) in einen DC Schreiben on Fri, 23 Nov 2007 12:40:36 GMT]]></title><description><![CDATA[<p>Weiss denn wiklich keiner was???</p>
<p>Oh man ey, ich bin echt so langsam am durchdrehen. Eine Kleinigkeit habe ich herrausgefunden: Es muss an der Übergabe des SpeicherDC liegen.</p>
<p>Denn wenn ich die Zeile 42, also:</p>
<pre><code>[cpp]
dcPicture = CreateCompatibleDC(0);
[/cpp]
</code></pre>
<p>durch:</p>
<pre><code>[cpp]
dcPicture = GetDC(0);
[/cpp]
</code></pre>
<p>ersetze, dann wird das richtige Ergebniss auf dem Desktop angezeigt. Das ist ja auch soweit logisch, da ich mir ja quasi den DesktopSpeicherDC hole und in diesem rumschreibe... Die BitBlt() Funktionen arbeiten also korrekt, und auch mit den richtigen Daten. Nur die Darstellung der globalen BITMAP Variable klapt nicht, ich vermute mal, dass ich den erstellten SpeicherDC nicht richtig an die globale Variable übergebe, eine Zuweisung von dem erstellen HBITMAP zum globalem HBITMAP scheint nicht zu reichen...</p>
<p>Aber wie mache ich das denn sonst? Weiss denn keiner einen Rat?</p>
<p>Gruß<br />
Stephan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1408793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1408793</guid><dc:creator><![CDATA[Predator_Jo]]></dc:creator><pubDate>Fri, 23 Nov 2007 12:40:36 GMT</pubDate></item><item><title><![CDATA[Reply to Zwei verschiedene Bilder (HDC) in einen DC Schreiben on Fri, 23 Nov 2007 14:41:20 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>ich glaube ich konnte es jetzt noch etwas genauer Eingrenzen.</p>
<p>Ich habe mal mit dem Speicheralgoritmus von hier:</p>
<p><a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-39400.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-39400.html</a></p>
<p>experimentiert, und bin zu dem Schluss gekommen, das der SpeicherDC den ich mittels &quot;CreateCompatibleDC(0)&quot; erzeuge irgendwie nicht kompatibel ist. Die Funktion übernimmt ja nur den SpeicherDC und speichert es als Bitmap ab, aber auch hier bekomme ich nur ein Schwarzes Bild. Mit dem &quot;GetDC(0)&quot; dagegen funktioniert das Abspeichern prima, also bekomme ich damit einen kompatiblen DC...</p>
<p>Als konsequenz denke ich mir nun, das ich einen SpeicherDC erstellen muss, der mit den schon vorhanden SpeicherDC's kompatibel ist, in etwa so:</p>
<pre><code>dcPicture = CreateCompatibleDC(BildSpeicher1);
</code></pre>
<p>Aber das funktioniert nicht...</p>
<p>Ich werd noch wahnsinnig...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1408899</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1408899</guid><dc:creator><![CDATA[Predator_Jo]]></dc:creator><pubDate>Fri, 23 Nov 2007 14:41:20 GMT</pubDate></item><item><title><![CDATA[Reply to Zwei verschiedene Bilder (HDC) in einen DC Schreiben on Fri, 23 Nov 2007 18:42:58 GMT]]></title><description><![CDATA[<p>So... Update:</p>
<p>ich habe jetzt über &quot;FindWindow&quot; und &quot;FindWindowEx()&quot; ein Handel auf das Fenster, in dem das Bild dargestellt werden soll. Die &quot;BitBlt()&quot; Funktion kann damit anscheinend gut arbeiten, denn das Abspeichern funktioniert. Das korrekte Bild wird anschließend auch ganz kurz im Fenster dargstellt, was auch logisch erscheint, da ich ja im DC dieses Fensters rumschreibe. Das anschließende Invalidate macht dies dann aber trotz der Übergabe des erstellten Gesammtbildes wieder zu nichte...</p>
<p>Der Fehler liegt also daran, dass die Zuweisung des SpeicherDC's an die globale Variable nicht funktioniert. Obwohl ich das Gesamtbild übergebe und im PAINT Event dann wieder per &quot;SelectObject()&quot; dieses Bitmap in einen neuen SpeicherDC selektiere...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1409054</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1409054</guid><dc:creator><![CDATA[Predator_Jo]]></dc:creator><pubDate>Fri, 23 Nov 2007 18:42:58 GMT</pubDate></item><item><title><![CDATA[Reply to Zwei verschiedene Bilder (HDC) in einen DC Schreiben on Fri, 23 Nov 2007 22:28:17 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">HDC tmpDC=GetDC(NULL);
HDC dsPicture=CreateCompatibleDC(tmpDC);
HBITMAP BildGesamt=CreateCompatibleBitmap(tmpDC,breite,hoehe);
ReleaseDC(tmpDC);
</code></pre>
<p>...sollte klappen. Wichtig dabei ist bei CreateCompatibleBitmap() nicht dsPicture sondern tmpDC zu nehmen:</p>
<p>msdn schrieb:</p>
<blockquote>
<p>When the memory DC is created, its display surface is exactly one monochrome pixel wide and one monochrome pixel high.</p>
</blockquote>
<p>...und wenn man dann den frisch erzeugten MemoryDC bei CreateCompatibleBitmap() angibt, wird dort eine Monochrom-Bitmap erzeugt - Gibt man tmpDC an erhält man die Desktop-Farbtiefe <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=";D"
      alt="😉"
    /></p>
<p>InvalidateRect() sorgt meistens/oft dafür das WM_ERASEBKGND und WM_PAINT Nachrichten ans Fenster geschickt werden. Wenn das Fenster nicht deins ist und du quasi auf WM_PAINT/WM_ERASEBKGND keinen Eingriff hast ist klar warum das Bild verschwindet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1409132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1409132</guid><dc:creator><![CDATA[geeky]]></dc:creator><pubDate>Fri, 23 Nov 2007 22:28:17 GMT</pubDate></item><item><title><![CDATA[Reply to Zwei verschiedene Bilder (HDC) in einen DC Schreiben on Sat, 24 Nov 2007 13:06:11 GMT]]></title><description><![CDATA[<p>geeky schrieb:</p>
<blockquote>
<p>[cpp]</p>
<p>msdn schrieb:</p>
<blockquote>
<p>When the memory DC is created, its display surface is exactly one monochrome pixel wide and one monochrome pixel high.</p>
</blockquote>
</blockquote>
<p>Tja, wie war das: &quot;wer lesen kann ist klar im Vorteil...&quot;</p>
<p>Verdammt so ein Mist... Alles klar, jetzt funktioniert alles, ich bedanke mich vielmals für diesen sehr hilfreichen Hinweis.</p>
<p>Macht weiter so...</p>
<p>Gruß<br />
Stephan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1409326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1409326</guid><dc:creator><![CDATA[Predator_Jo]]></dc:creator><pubDate>Sat, 24 Nov 2007 13:06:11 GMT</pubDate></item></channel></rss>