<?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[CClientDC ersetzen durch GetDC]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich habe ein Array aus unsigned char erstellt, welches ich als Bild benutze</p>
<pre><code>unsigned char* m_Array
m_Array = new unsigned char[m_iWidth * m_iHeight * 3];
</code></pre>
<p>Nachdem das Bild gefüllt und bearbeitet wurde, kann es durch folgenden Quellcode in einer Picturebox angezeigt werden. Der Picturebox ist eine Controlvariable (m_statPic) vom Typ CStatic zugefügt.</p>
<pre><code>bool CTestDlg::ShowPic(CStatic* Picturebox)
{
	//Bitmapheader mit Informationen zum Bild für HBITMAP
	BITMAPINFO bmi;
	bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	bmi.bmiHeader.biWidth = m_iWidth;
	bmi.bmiHeader.biHeight = m_iHeight;
	bmi.bmiHeader.biPlanes = 1;
	bmi.bmiHeader.biBitCount = 24;
	bmi.bmiHeader.biCompression = BI_RGB;
	bmi.bmiHeader.biSizeImage = 0;
	bmi.bmiHeader.biXPelsPerMeter = 1000;
	bmi.bmiHeader.biYPelsPerMeter = 1000;	
	bmi.bmiHeader.biClrUsed = 0;
	bmi.bmiHeader.biClrImportant = 0;

	CClientDC dc(this);	//verknüpft dc mit dem  Fenster 
	HBITMAP hBitmap;		//Bitmap-Handle erstellen

	//erstellt und dimensioniert hBitmap
	hBitmap =  CreateCompatibleBitmap(dc,m_iWidth,m_iHeight);
	//wandelt Array* in hBitmap um
	SetDIBits(dc, hBitmap, 0, m_iHeight, m_Array, &amp;bmi, DIB_PAL_COLORS);	

	Picturebox-&gt;SetBitmap(getHBitmap());

	DeleteObject(hBitmap);		//Speicher wieder freigeben
	ReleaseDC(&amp;dc);				//Speicher wieder freigeben

	return false;
}
</code></pre>
<p>Jetzt habe ich eine neue Klasse erzeugt, in der ich ein Array als Bild verwalten möchte. Das heißt, die Deklaration des Array, das Bearbeiten des Array und die Routine zum anzeigen des Array werden ebenfalls als Methoden dieser neuen Klasse ArrayPic ausgelagert.</p>
<p>In der ShowPic() muss dann allerdings die Verknüpfung des dc anders realisiert werden, da der this-Pointer auf das falsche Objekt zeigen würde. Mein Versuch zur Korrektur war</p>
<pre><code>bool CTestDlg::ShowPic([b]CWnd* pWnd,[/b] CStatic* Picturebox)
{
...
HDC hdc = GetDC(*pWnd);
...
ReleaseDC(*pWnd, hdc);
}
</code></pre>
<p>Der Aufruf der Methode erfolgt über</p>
<pre><code>ArrayPic Obj;
Obj.setNew(...);
Obj.DrawRect(...);
//Bis hier hin ist noch alles OK.
//Das Auslesen einzelner Bildpunkte etc. klappt.
//Das Array ist also da und gefüllt
Obj.ShowPic(&amp;m_hWnd, &amp;m_statPic);
</code></pre>
<p>Leider ohne erfolg. Nachdem die Routine ausgelagert und abgeändert wurde, ist auf dem Bildschirm kein Bild zu sehen.</p>
<p>Bitte um Hilfe... trotz der Menge Text.<br />
Gruß,<br />
Alex</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/186135/cclientdc-ersetzen-durch-getdc</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Apr 2026 09:37:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/186135.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 Jul 2007 12:01:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to CClientDC ersetzen durch GetDC on Thu, 05 Jul 2007 12:01:04 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich habe ein Array aus unsigned char erstellt, welches ich als Bild benutze</p>
<pre><code>unsigned char* m_Array
m_Array = new unsigned char[m_iWidth * m_iHeight * 3];
</code></pre>
<p>Nachdem das Bild gefüllt und bearbeitet wurde, kann es durch folgenden Quellcode in einer Picturebox angezeigt werden. Der Picturebox ist eine Controlvariable (m_statPic) vom Typ CStatic zugefügt.</p>
<pre><code>bool CTestDlg::ShowPic(CStatic* Picturebox)
{
	//Bitmapheader mit Informationen zum Bild für HBITMAP
	BITMAPINFO bmi;
	bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	bmi.bmiHeader.biWidth = m_iWidth;
	bmi.bmiHeader.biHeight = m_iHeight;
	bmi.bmiHeader.biPlanes = 1;
	bmi.bmiHeader.biBitCount = 24;
	bmi.bmiHeader.biCompression = BI_RGB;
	bmi.bmiHeader.biSizeImage = 0;
	bmi.bmiHeader.biXPelsPerMeter = 1000;
	bmi.bmiHeader.biYPelsPerMeter = 1000;	
	bmi.bmiHeader.biClrUsed = 0;
	bmi.bmiHeader.biClrImportant = 0;

	CClientDC dc(this);	//verknüpft dc mit dem  Fenster 
	HBITMAP hBitmap;		//Bitmap-Handle erstellen

	//erstellt und dimensioniert hBitmap
	hBitmap =  CreateCompatibleBitmap(dc,m_iWidth,m_iHeight);
	//wandelt Array* in hBitmap um
	SetDIBits(dc, hBitmap, 0, m_iHeight, m_Array, &amp;bmi, DIB_PAL_COLORS);	

	Picturebox-&gt;SetBitmap(getHBitmap());

	DeleteObject(hBitmap);		//Speicher wieder freigeben
	ReleaseDC(&amp;dc);				//Speicher wieder freigeben

	return false;
}
</code></pre>
<p>Jetzt habe ich eine neue Klasse erzeugt, in der ich ein Array als Bild verwalten möchte. Das heißt, die Deklaration des Array, das Bearbeiten des Array und die Routine zum anzeigen des Array werden ebenfalls als Methoden dieser neuen Klasse ArrayPic ausgelagert.</p>
<p>In der ShowPic() muss dann allerdings die Verknüpfung des dc anders realisiert werden, da der this-Pointer auf das falsche Objekt zeigen würde. Mein Versuch zur Korrektur war</p>
<pre><code>bool CTestDlg::ShowPic([b]CWnd* pWnd,[/b] CStatic* Picturebox)
{
...
HDC hdc = GetDC(*pWnd);
...
ReleaseDC(*pWnd, hdc);
}
</code></pre>
<p>Der Aufruf der Methode erfolgt über</p>
<pre><code>ArrayPic Obj;
Obj.setNew(...);
Obj.DrawRect(...);
//Bis hier hin ist noch alles OK.
//Das Auslesen einzelner Bildpunkte etc. klappt.
//Das Array ist also da und gefüllt
Obj.ShowPic(&amp;m_hWnd, &amp;m_statPic);
</code></pre>
<p>Leider ohne erfolg. Nachdem die Routine ausgelagert und abgeändert wurde, ist auf dem Bildschirm kein Bild zu sehen.</p>
<p>Bitte um Hilfe... trotz der Menge Text.<br />
Gruß,<br />
Alex</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1318878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1318878</guid><dc:creator><![CDATA[WilliamSpiderWeb]]></dc:creator><pubDate>Thu, 05 Jul 2007 12:01:04 GMT</pubDate></item></channel></rss>