<?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[Text direkt in Memory schreiben]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hab da ein kleines Problem was ich optimieren möchte. Ich brauche eine art Textlayer in als Bitmap Array.</p>
<p>unsigned int TextArray[100*100*4]; z.B. das wird dynamisch angelegt</p>
<p>mit dem folgenden code sichere ich mir zur Laufzeit den Hintergrund vom Bildschirm, lösche die Fläche,schreibe den Text ganz normal da rein, kopiere mir den neuen Bildschirm in mein Memory Bereich und restauriere danach den zuvor gespeicherten Hintergrund. Alles über BitBlitting was recht schnell geht aber ich glaube der Weg ist etwas umständlich. Erstmal der Code.</p>
<pre><code class="language-cpp">void CCaptureZ_ButtonCtrl::GrabText(CDC *pDC,int sx,int sy,int nWidth,int nHeight)
{
	CDC					memDC;
	CBitmap				memBmp;
	CBitmap				*pOldmemDC;

	// copy background to memDC
	memDC.CreateCompatibleDC(pDC);		
	memBmp.CreateCompatibleBitmap(pDC,nWidth,nHeight);
	pOldmemDC = memDC.SelectObject(&amp;memBmp);

	BITMAPINFO	bmi[1];
	bmi[0].bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	bmi[0].bmiHeader.biWidth = nWidth;
	bmi[0].bmiHeader.biHeight = nHeight;
	bmi[0].bmiHeader.biPlanes = 1;
	bmi[0].bmiHeader.biBitCount = 32;		// 32
	bmi[0].bmiHeader.biCompression = BI_RGB;
	bmi[0].bmiHeader.biSizeImage = 0;
	bmi[0].bmiHeader.biXPelsPerMeter = 75;
	bmi[0].bmiHeader.biYPelsPerMeter = 75;
	bmi[0].bmiHeader.biClrUsed = 0;
	bmi[0].bmiHeader.biClrImportant = 0;

	int	srcX = 0;
	int	srcY = 0;
	int	dstX = 0;
	int	dstY = 0;
	int	dstW = nWidth;
	int	dstH = nHeight;

// nachdem der Background gesichert ist, löschen wir mal den Bereich kurz

	unsigned int FillColor = RGB_MAKE(0,0,0);

	for (int py=0;py&lt; nHeight;py++)
		for (int px=0;px&lt; nWidth;px++)
			mem_Text_Bitmap_Ptr[px+py*nWidth] = FillColor;

	CRect rect;
	rect.left = 0;
	rect.top = 0;
	rect.right = nWidth;
	rect.bottom = nHeight * 0.8f;

// erstmal per BitBlitting löschen, da weiß ich das es weiß ist !!!
// copy Image to memDC     // das hier kopiert den hintergrund aus dem speicher in memDC
	SetDIBitsToDevice(memDC,dstX, dstY, dstW, dstH, srcX, srcY, 0, dstH, mem_Text_Bitmap_Ptr, bmi, DIB_RGB_COLORS);

// draw memDC to screen    // das hier malt das bild auf den bildschirm von memDC zu pCD
	pDC-&gt;BitBlt( sx, sy,nWidth,nHeight,&amp;memDC,0,0,SRCCOPY);	 

// Jetzt mal den Text auf den weißen Hintergrung
	DrawText(pDC,rect,ODS_SELECTED);		// state = ODS_SELECTED

// kopiert vom schirm in memcd
	memDC.BitBlt(0,0,nWidth,nHeight,pDC, sx, sy,SRCCOPY);

// wandelt memdc in bitmap memory
// in mem_Text_Bitmap_Ptr ist jetzt das Bitmap vom Text mit Weißem Hintergrund
	GetDIBits(memDC,memBmp,0,nHeight,mem_Text_Bitmap_Ptr,bmi,DIB_RGB_COLORS);

	if(Flag_Background_Saved)
	{
		// jetzt erstmal den Background drüber malen damit man während der Button berechnung nix sieht
		// copy Image to memDC     // das hier kopiert den hintergrund aus dem speicher in memDC
		SetDIBitsToDevice(memDC,dstX, dstY, dstW, dstH, srcX, srcY, 0, dstH, mem_ButtonBackground_Ptr, bmi, DIB_RGB_COLORS);

		// draw memDC to screen    // das hier malt das bild auf den bildschirm von memDC zu pCD
		pDC-&gt;BitBlt( sx, sy,nWidth,nHeight,&amp;memDC,0,0,SRCCOPY);
	}
}
</code></pre>
<p>die Funktion DrawText(pDC,rect,ODS_SELECTED) schreibt den Text auf den Schirm, das geht auch gut, jezt hab ich mal probiert mit .TextOut() direkt in den Speicher zu schreiben aber der Text reagiert auf keine Formatierung wie Größe und Schriftart, hat da jemand ein Beispiel ?</p>
<p>hier noch die DrawText funktion</p>
<pre><code class="language-cpp">void CCaptureZ_ButtonCtrl::DrawText(CDC *pDC,CRect rect,UINT state)
{
	if (!m_ButtonText.IsEmpty())
   {
		CSize Extent = pDC-&gt;GetTextExtent(m_ButtonText/*strText*/);
      CPoint pt( rect.CenterPoint().x - Extent.cx/2 - 3,
      rect.CenterPoint().y - Extent.cy/2 - 2 );

      if (state &amp; ODS_SELECTED)
			pt.Offset(1,1);

      int nMode = pDC-&gt;SetBkMode(TRANSPARENT);
      CFont *pOldFont = SelectStockFont( pDC );

      if (state &amp; ODS_DISABLED)
			pDC-&gt;DrawState( pt,Extent,m_ButtonText,DSS_DISABLED,TRUE,0,(HBRUSH)NULL);
	   else
			pDC-&gt;SetTextColor(RGB_MAKE(255,255,255));
         pDC-&gt;TextOut(pt.x, pt.y, m_ButtonText);

			pDC-&gt;SelectObject(pOldFont);
			pDC-&gt;SetBkMode(nMode);
    }
}
</code></pre>
<p>thx</p>
<p>Micha</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/144888/text-direkt-in-memory-schreiben</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Jul 2026 21:17:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/144888.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 22 Apr 2006 17:51:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Text direkt in Memory schreiben on Sat, 22 Apr 2006 17:51:36 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hab da ein kleines Problem was ich optimieren möchte. Ich brauche eine art Textlayer in als Bitmap Array.</p>
<p>unsigned int TextArray[100*100*4]; z.B. das wird dynamisch angelegt</p>
<p>mit dem folgenden code sichere ich mir zur Laufzeit den Hintergrund vom Bildschirm, lösche die Fläche,schreibe den Text ganz normal da rein, kopiere mir den neuen Bildschirm in mein Memory Bereich und restauriere danach den zuvor gespeicherten Hintergrund. Alles über BitBlitting was recht schnell geht aber ich glaube der Weg ist etwas umständlich. Erstmal der Code.</p>
<pre><code class="language-cpp">void CCaptureZ_ButtonCtrl::GrabText(CDC *pDC,int sx,int sy,int nWidth,int nHeight)
{
	CDC					memDC;
	CBitmap				memBmp;
	CBitmap				*pOldmemDC;

	// copy background to memDC
	memDC.CreateCompatibleDC(pDC);		
	memBmp.CreateCompatibleBitmap(pDC,nWidth,nHeight);
	pOldmemDC = memDC.SelectObject(&amp;memBmp);

	BITMAPINFO	bmi[1];
	bmi[0].bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	bmi[0].bmiHeader.biWidth = nWidth;
	bmi[0].bmiHeader.biHeight = nHeight;
	bmi[0].bmiHeader.biPlanes = 1;
	bmi[0].bmiHeader.biBitCount = 32;		// 32
	bmi[0].bmiHeader.biCompression = BI_RGB;
	bmi[0].bmiHeader.biSizeImage = 0;
	bmi[0].bmiHeader.biXPelsPerMeter = 75;
	bmi[0].bmiHeader.biYPelsPerMeter = 75;
	bmi[0].bmiHeader.biClrUsed = 0;
	bmi[0].bmiHeader.biClrImportant = 0;

	int	srcX = 0;
	int	srcY = 0;
	int	dstX = 0;
	int	dstY = 0;
	int	dstW = nWidth;
	int	dstH = nHeight;

// nachdem der Background gesichert ist, löschen wir mal den Bereich kurz

	unsigned int FillColor = RGB_MAKE(0,0,0);

	for (int py=0;py&lt; nHeight;py++)
		for (int px=0;px&lt; nWidth;px++)
			mem_Text_Bitmap_Ptr[px+py*nWidth] = FillColor;

	CRect rect;
	rect.left = 0;
	rect.top = 0;
	rect.right = nWidth;
	rect.bottom = nHeight * 0.8f;

// erstmal per BitBlitting löschen, da weiß ich das es weiß ist !!!
// copy Image to memDC     // das hier kopiert den hintergrund aus dem speicher in memDC
	SetDIBitsToDevice(memDC,dstX, dstY, dstW, dstH, srcX, srcY, 0, dstH, mem_Text_Bitmap_Ptr, bmi, DIB_RGB_COLORS);

// draw memDC to screen    // das hier malt das bild auf den bildschirm von memDC zu pCD
	pDC-&gt;BitBlt( sx, sy,nWidth,nHeight,&amp;memDC,0,0,SRCCOPY);	 

// Jetzt mal den Text auf den weißen Hintergrung
	DrawText(pDC,rect,ODS_SELECTED);		// state = ODS_SELECTED

// kopiert vom schirm in memcd
	memDC.BitBlt(0,0,nWidth,nHeight,pDC, sx, sy,SRCCOPY);

// wandelt memdc in bitmap memory
// in mem_Text_Bitmap_Ptr ist jetzt das Bitmap vom Text mit Weißem Hintergrund
	GetDIBits(memDC,memBmp,0,nHeight,mem_Text_Bitmap_Ptr,bmi,DIB_RGB_COLORS);

	if(Flag_Background_Saved)
	{
		// jetzt erstmal den Background drüber malen damit man während der Button berechnung nix sieht
		// copy Image to memDC     // das hier kopiert den hintergrund aus dem speicher in memDC
		SetDIBitsToDevice(memDC,dstX, dstY, dstW, dstH, srcX, srcY, 0, dstH, mem_ButtonBackground_Ptr, bmi, DIB_RGB_COLORS);

		// draw memDC to screen    // das hier malt das bild auf den bildschirm von memDC zu pCD
		pDC-&gt;BitBlt( sx, sy,nWidth,nHeight,&amp;memDC,0,0,SRCCOPY);
	}
}
</code></pre>
<p>die Funktion DrawText(pDC,rect,ODS_SELECTED) schreibt den Text auf den Schirm, das geht auch gut, jezt hab ich mal probiert mit .TextOut() direkt in den Speicher zu schreiben aber der Text reagiert auf keine Formatierung wie Größe und Schriftart, hat da jemand ein Beispiel ?</p>
<p>hier noch die DrawText funktion</p>
<pre><code class="language-cpp">void CCaptureZ_ButtonCtrl::DrawText(CDC *pDC,CRect rect,UINT state)
{
	if (!m_ButtonText.IsEmpty())
   {
		CSize Extent = pDC-&gt;GetTextExtent(m_ButtonText/*strText*/);
      CPoint pt( rect.CenterPoint().x - Extent.cx/2 - 3,
      rect.CenterPoint().y - Extent.cy/2 - 2 );

      if (state &amp; ODS_SELECTED)
			pt.Offset(1,1);

      int nMode = pDC-&gt;SetBkMode(TRANSPARENT);
      CFont *pOldFont = SelectStockFont( pDC );

      if (state &amp; ODS_DISABLED)
			pDC-&gt;DrawState( pt,Extent,m_ButtonText,DSS_DISABLED,TRUE,0,(HBRUSH)NULL);
	   else
			pDC-&gt;SetTextColor(RGB_MAKE(255,255,255));
         pDC-&gt;TextOut(pt.x, pt.y, m_ButtonText);

			pDC-&gt;SelectObject(pOldFont);
			pDC-&gt;SetBkMode(nMode);
    }
}
</code></pre>
<p>thx</p>
<p>Micha</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1042877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1042877</guid><dc:creator><![CDATA[OnlyMicha]]></dc:creator><pubDate>Sat, 22 Apr 2006 17:51:36 GMT</pubDate></item><item><title><![CDATA[Reply to Text direkt in Memory schreiben on Sat, 22 Apr 2006 18:00:57 GMT]]></title><description><![CDATA[<p>Und wie hast Du es versucht direkt über den memDC abzuwickeln?<br />
Du musst nicht den realen DC sichern, dorthinein schreiben sichern und wieder den alten Inhalt zurückschaufeln. Es muss auch direkt über einen memDC gehen.<br />
Wie hast Du es denn gemacht? Evtl. hast Du nur enmal den DC verwechselt beim SelectObject.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1042887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1042887</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Sat, 22 Apr 2006 18:00:57 GMT</pubDate></item><item><title><![CDATA[Reply to Text direkt in Memory schreiben on Sun, 23 Apr 2006 10:55:49 GMT]]></title><description><![CDATA[<p>hier ist mal die alternative mit im code:</p>
<pre><code class="language-cpp">/* das alles kann wech...
// erstmal per BitBlitting löschen, da weiß ich das es weiß ist !!! 
// copy Image to memDC     // das hier kopiert den hintergrund aus dem speicher in memDC 
    SetDIBitsToDevice(memDC,dstX, dstY, dstW, dstH, srcX, srcY, 0, dstH, mem_Text_Bitmap_Ptr, bmi, DIB_RGB_COLORS); 

// draw memDC to screen    // das hier malt das bild auf den bildschirm von memDC zu pCD 
    pDC-&gt;BitBlt( sx, sy,nWidth,nHeight,&amp;memDC,0,0,SRCCOPY);      

// Jetzt mal den Text auf den weißen Hintergrung 
    DrawText(pDC,rect,ODS_SELECTED);        // state = ODS_SELECTED 

// kopiert vom schirm in memcd 
    memDC.BitBlt(0,0,nWidth,nHeight,pDC, sx, sy,SRCCOPY); 

// wandelt memdc in bitmap memory 
// in mem_Text_Bitmap_Ptr ist jetzt das Bitmap vom Text mit Weißem Hintergrund 
    GetDIBits(memDC,memBmp,0,nHeight,mem_Text_Bitmap_Ptr,bmi,DIB_RGB_COLORS);
*/ bis hierhin

memDC.TextOut(10,10,&quot;Hallo&quot;);
GetDIBits(memDC,memBmp,0,nHeight,mem_Text_Bitmap_Ptr,bmi,DIB_RGB_COLORS);
</code></pre>
<p>der Text wird auch angezeigt, später wenn ich die Bitmap darstelle, auch an Position 10,10 px und da steht auch Hallo, das Problem ist, ich finde keine Funktion wie ich Textgröße oder Schriftart einstellen kann.</p>
<p>und in der DrawText wird es scheinbar so gesetzt:</p>
<pre><code class="language-cpp">int nMode = pDC-&gt;SetBkMode(TRANSPARENT);
      CFont *pOldFont = SelectStockFont( pDC );

      if (state &amp; ODS_DISABLED)
			pDC-&gt;DrawState( pt,Extent,m_ButtonText,DSS_DISABLED,TRUE,0,(HBRUSH)NULL);
	   else
			pDC-&gt;SetTextColor(RGB_MAKE(255,255,255));
         pDC-&gt;TextOut(pt.x, pt.y, m_ButtonText);

			pDC-&gt;SelectObject(pOldFont);
			pDC-&gt;SetBkMode(nMode);
</code></pre>
<p>aber selbst wenn ich das vor mein TextOut setze reagiert das da nicht drauf.<br />
Ich muß sagen mit diesen Select Object geschichten da steig ich nicht ganz durch...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1043220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1043220</guid><dc:creator><![CDATA[OnlyMicha]]></dc:creator><pubDate>Sun, 23 Apr 2006 10:55:49 GMT</pubDate></item><item><title><![CDATA[Reply to Text direkt in Memory schreiben on Sun, 23 Apr 2006 16:16:24 GMT]]></title><description><![CDATA[<p>Du musst einen entsprechenden Font erzeugen (CreateFontIndirect) und diesen selektieren (SelectObject), nicht vergessen vor zersören des DCs den alten Font (der durch SelectObject returniert wird) wieder zu selektieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1043410</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1043410</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Sun, 23 Apr 2006 16:16:24 GMT</pubDate></item><item><title><![CDATA[Reply to Text direkt in Memory schreiben on Sun, 23 Apr 2006 21:08:53 GMT]]></title><description><![CDATA[<p>CreateFont ja das hab ich auch mal gefunden, das Problem ist:</p>
<p>dadurch das ich im Eigenschaftsfenster das Stock Prop Objekt habe öffnet sich sobald ich die Eigenschaft ändere, bzw. ist schon von vorn herein im Eigenschaftsdialog ein eigener Reiter für Font und auf den hab ich nicht so eifach Zugriff. Ich müßte da also schauen was eingestellt ist und das dann wieder in das neue Übertragen.</p>
<p>Oder... ich überlege grad... kann ich nicht das StockFont einfach kopieren? Nur<br />
wenn eine Kopie laufen würde, warum nicht gleich das alte? Irgendwo ist da noch der Wurm drin.</p>
<p>Außerdem, der pDC ist doch der gleiche wenn ich in meine DrawText() springe , da weise ich dem pDC doch auch das StockFont zu und habe immer nur Arial Type</p>
<p>würde heißen:</p>
<p>pDC-&gt;TextOut(pt.x, pt.y, m_ButtonText);</p>
<p>geht weil vorher dem pDC</p>
<p>CFont *pOldFont = SelectStockFont( pDC );</p>
<p>der StockFont zugeteilt wird aber ich über</p>
<p>memDC.TextOut(10,10,&quot;Hallo&quot;);</p>
<p>memDC das nicht weiß ?</p>
<p>und somit ein</p>
<p>CFont *pOldFont = SelectStockFont( memDC );</p>
<p>sollte das tun? bin ich da richtig ? na ich teste mal und gucke ob ich das jetzt verstanden habe... <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>Danke erstmal</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1043672</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1043672</guid><dc:creator><![CDATA[OnlyMicha]]></dc:creator><pubDate>Sun, 23 Apr 2006 21:08:53 GMT</pubDate></item><item><title><![CDATA[Reply to Text direkt in Memory schreiben on Sun, 23 Apr 2006 21:48:02 GMT]]></title><description><![CDATA[<p>vielleicht ist es zu spät aber alles was ich bis jetzt probiert hab ging noch nicht richtig...</p>
<p>das hier ist ggf. der Richtige Ansatz</p>
<pre><code class="language-cpp">// Stock Font für pDC wird so gesetzt
//   CFont *pOldFont = SelectStockFont( pDC );

// dann versuch ich mal den pDC StockFont zu kopieren ?
// weil ich setzte den ja nicht selber, der wird per Dialog gesetzt

	LOGFONT myFont;
// hier myFont.  Variablen setzen
	pDC-&gt;GetFontData(0,0,&amp;myFont,0);

	HFONT m_Font = CreateFontIndirect(&amp;myFont);
	memDC.SelectObject(m_Font);

// geht teilweise, Farbe usw aber Schriftart stimmt nicht

	memDC.SetTextColor(RGB_MAKE(255,255,255));
	memDC.SetBkColor(RGB_MAKE(0,0,0));
   memDC.TextOut(10,10, m_ButtonText);

	GetDIBits(memDC,memBmp,0,nHeight,mem_Text_Bitmap_Ptr,bmi,DIB_RGB_COLORS);
</code></pre>
<p>es Erzeugt einen Font wie ich ihn noch nie gesehen habe <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="😉"
    /> aber es ist auf keinen Fall eine Kopie des Richtigen aber Arial ist es nicht mehr also denke ich das geht den richtigen Weg...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1043683</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1043683</guid><dc:creator><![CDATA[OnlyMicha]]></dc:creator><pubDate>Sun, 23 Apr 2006 21:48:02 GMT</pubDate></item><item><title><![CDATA[Reply to Text direkt in Memory schreiben on Mon, 24 Apr 2006 06:15:38 GMT]]></title><description><![CDATA[<p>Setze alle Werte der LOGFONT Struktur auf 0, dann fülle die Struktur aus, mit dem Font Namen und der Größe. Dann führe CreateFontIndirect aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1043726</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1043726</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Mon, 24 Apr 2006 06:15:38 GMT</pubDate></item><item><title><![CDATA[Reply to Text direkt in Memory schreiben on Tue, 25 Apr 2006 21:04:48 GMT]]></title><description><![CDATA[<p>Danke dir erstmal,</p>
<p>die Lösung ist viel einfacher <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
<pre><code class="language-cpp">// hier da die Zeile : 
	memDC.SelectObject(SelectStockFont( pDC ));

	memDC.SetTextColor(RGB_MAKE(255,255,255));
	memDC.SetBkColor(RGB_MAKE(0,0,0));

      memDC.TextOut(pt.x,pt.y, m_ButtonText);

	GetDIBits(memDC,memBmp,0,nHeight,mem_Text_Bitmap_Ptr,bmi,DIB_RGB_COLORS);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1045261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1045261</guid><dc:creator><![CDATA[OnlyMicha]]></dc:creator><pubDate>Tue, 25 Apr 2006 21:04:48 GMT</pubDate></item></channel></rss>