<?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[StretchBlt skaliert falsch]]></title><description><![CDATA[<p>Ich benutze StretchBlt in der folgenden Form:</p>
<pre><code class="language-cpp">m_pDC-&gt;StretchBlt(
	m_rect_dest.left, // x-coord of destination upper-left corner
	m_rect_dest.top,  // y-coord of destination upper-left corner
	m_rect_dest.Width(), // width of destination rectangle
	m_rect_dest.Height(), // height of destination rectangle
	this, // handle to source DC
	0, // x-coord of source upper-left corner
	0, // y-coord of source upper-left corner
	m_rect_source.Width(), // width of source rectangle
	m_rect_source.Height(),  // height of source rectangle
	SRCCOPY);
</code></pre>
<p>Wenn m_rect_source kleiner ist als m_rect_dest, dann wird das Bild vergrößert, umgekehrt wird das größere Bild jedoch um den Faktor den es größer ist kleiner dargestellt, es füllt das Bild also nicht aus, sondern bei einem Unterschied von 2 nur zu einem viertel.</p>
<p>Nutze ich StretchBlt in irgendeiner Weise falsch ?</p>
<p>Das ganze benutze ich in einem CMemDC der folgenden Art:</p>
<pre><code class="language-cpp">#ifndef _MEMDC_H_
#define _MEMDC_H_

class CMemDC : public CDC {
private:	
	CBitmap		m_bitmap;	// Offscreen bitmap
	CBitmap*	m_oldBitmap;	// bitmap originally found in CMemDC
	CDC*		m_pDC;		// Saves CDC passed in constructor
	CRect		m_rect_dest;	// Rectangle of drawing area.
	CRect		m_rect_source;  // Rectangle of source area.
	BOOL		m_bMemDC;	// TRUE if CDC really is a Memory DC.
public:

	CMemDC(CDC* pDC, const CRect* pSourceRect = NULL, const CRect* pDestRect = NULL) : CDC()
	{
		ASSERT(pDC != NULL); 

		// Some initialization
		m_pDC = pDC;
		m_oldBitmap = NULL;
		m_bMemDC = !pDC-&gt;IsPrinting();

		// Get the rectangle to draw
		if (pDestRect == NULL) {
			pDC-&gt;GetClipBox(&amp;m_rect_dest);
		} else {
			m_rect_dest = *pDestRect;
		}
		// Get the rectangle to draw
		if (pSourceRect == NULL) {
			pDC-&gt;GetClipBox(&amp;m_rect_source);
		} else {
			m_rect_source = *pSourceRect;
		}

		if (m_bMemDC) {
			// Create a Memory DC
			CreateCompatibleDC(pDC);
			pDC-&gt;LPtoDP(&amp;m_rect_dest);

			m_bitmap.CreateCompatibleBitmap(pDC, m_rect_dest.Width(), m_rect_dest.Height());
			m_oldBitmap = SelectObject(&amp;m_bitmap);

			SetMapMode(pDC-&gt;GetMapMode());

			SetWindowExt(pDC-&gt;GetWindowExt());
			SetViewportExt(pDC-&gt;GetViewportExt());

			pDC-&gt;DPtoLP(&amp;m_rect_dest);
			SetWindowOrg(m_rect_dest.left, m_rect_dest.top);
		} else {
			// Make a copy of the relevent parts of the current DC for printing
			m_bPrinting = pDC-&gt;m_bPrinting;
			m_hDC       = pDC-&gt;m_hDC;
			m_hAttribDC = pDC-&gt;m_hAttribDC;
		}

		// Fill background 
		FillSolidRect(m_rect_dest, pDC-&gt;GetBkColor());
	}

	~CMemDC()	
	{		
		if (m_bMemDC) {

			m_pDC-&gt;StretchBlt(
				m_rect_dest.left, // x-coord of destination upper-left corner
				m_rect_dest.top,  // y-coord of destination upper-left corner
				m_rect_dest.Width(), // width of destination rectangle
				m_rect_dest.Height(), // height of destination rectangle
				this, // handle to source DC
				0, // x-coord of source upper-left corner
				0, // y-coord of source upper-left corner
				m_rect_source.Width(), // width of source rectangle
				m_rect_source.Height(),  // height of source rectangle
				SRCCOPY);

			//Swap back the original bitmap.
			SelectObject(m_oldBitmap);		
		} else {
			// All we need to do is replace the DC with an illegal value,
			// this keeps us from accidently deleting the handles associated with
			// the CDC that was passed to the constructor.			
			m_hDC = m_hAttribDC = NULL;
		}	
	}

	// Allow usage as a pointer	
	CMemDC* operator-&gt;() 
	{
		return this;
	}	

	// Allow usage as a pointer	
	operator CMemDC*() 
	{
		return this;
	}
};

#endif
</code></pre>
<p>Das ganze wird aufgerufen über</p>
<pre><code class="language-cpp">void CGraphCtrl::OnPaint() 
{
	CPaintDC dc(this); // device context for painting	

	CRect (rc_dest);
	rc_dest=GetSize();

	CRect (rc_source);
	rc_source=GetPlotDataSize();

	CMemDC pDC(&amp;dc,&amp;rc_source, &amp;rc_dest); // Double Buffering
	PlotToDC(&amp; pDC);

}
</code></pre>
<p>Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/181158/stretchblt-skaliert-falsch</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Apr 2026 04:36:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/181158.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 10 May 2007 14:17:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to StretchBlt skaliert falsch on Thu, 10 May 2007 14:17:11 GMT]]></title><description><![CDATA[<p>Ich benutze StretchBlt in der folgenden Form:</p>
<pre><code class="language-cpp">m_pDC-&gt;StretchBlt(
	m_rect_dest.left, // x-coord of destination upper-left corner
	m_rect_dest.top,  // y-coord of destination upper-left corner
	m_rect_dest.Width(), // width of destination rectangle
	m_rect_dest.Height(), // height of destination rectangle
	this, // handle to source DC
	0, // x-coord of source upper-left corner
	0, // y-coord of source upper-left corner
	m_rect_source.Width(), // width of source rectangle
	m_rect_source.Height(),  // height of source rectangle
	SRCCOPY);
</code></pre>
<p>Wenn m_rect_source kleiner ist als m_rect_dest, dann wird das Bild vergrößert, umgekehrt wird das größere Bild jedoch um den Faktor den es größer ist kleiner dargestellt, es füllt das Bild also nicht aus, sondern bei einem Unterschied von 2 nur zu einem viertel.</p>
<p>Nutze ich StretchBlt in irgendeiner Weise falsch ?</p>
<p>Das ganze benutze ich in einem CMemDC der folgenden Art:</p>
<pre><code class="language-cpp">#ifndef _MEMDC_H_
#define _MEMDC_H_

class CMemDC : public CDC {
private:	
	CBitmap		m_bitmap;	// Offscreen bitmap
	CBitmap*	m_oldBitmap;	// bitmap originally found in CMemDC
	CDC*		m_pDC;		// Saves CDC passed in constructor
	CRect		m_rect_dest;	// Rectangle of drawing area.
	CRect		m_rect_source;  // Rectangle of source area.
	BOOL		m_bMemDC;	// TRUE if CDC really is a Memory DC.
public:

	CMemDC(CDC* pDC, const CRect* pSourceRect = NULL, const CRect* pDestRect = NULL) : CDC()
	{
		ASSERT(pDC != NULL); 

		// Some initialization
		m_pDC = pDC;
		m_oldBitmap = NULL;
		m_bMemDC = !pDC-&gt;IsPrinting();

		// Get the rectangle to draw
		if (pDestRect == NULL) {
			pDC-&gt;GetClipBox(&amp;m_rect_dest);
		} else {
			m_rect_dest = *pDestRect;
		}
		// Get the rectangle to draw
		if (pSourceRect == NULL) {
			pDC-&gt;GetClipBox(&amp;m_rect_source);
		} else {
			m_rect_source = *pSourceRect;
		}

		if (m_bMemDC) {
			// Create a Memory DC
			CreateCompatibleDC(pDC);
			pDC-&gt;LPtoDP(&amp;m_rect_dest);

			m_bitmap.CreateCompatibleBitmap(pDC, m_rect_dest.Width(), m_rect_dest.Height());
			m_oldBitmap = SelectObject(&amp;m_bitmap);

			SetMapMode(pDC-&gt;GetMapMode());

			SetWindowExt(pDC-&gt;GetWindowExt());
			SetViewportExt(pDC-&gt;GetViewportExt());

			pDC-&gt;DPtoLP(&amp;m_rect_dest);
			SetWindowOrg(m_rect_dest.left, m_rect_dest.top);
		} else {
			// Make a copy of the relevent parts of the current DC for printing
			m_bPrinting = pDC-&gt;m_bPrinting;
			m_hDC       = pDC-&gt;m_hDC;
			m_hAttribDC = pDC-&gt;m_hAttribDC;
		}

		// Fill background 
		FillSolidRect(m_rect_dest, pDC-&gt;GetBkColor());
	}

	~CMemDC()	
	{		
		if (m_bMemDC) {

			m_pDC-&gt;StretchBlt(
				m_rect_dest.left, // x-coord of destination upper-left corner
				m_rect_dest.top,  // y-coord of destination upper-left corner
				m_rect_dest.Width(), // width of destination rectangle
				m_rect_dest.Height(), // height of destination rectangle
				this, // handle to source DC
				0, // x-coord of source upper-left corner
				0, // y-coord of source upper-left corner
				m_rect_source.Width(), // width of source rectangle
				m_rect_source.Height(),  // height of source rectangle
				SRCCOPY);

			//Swap back the original bitmap.
			SelectObject(m_oldBitmap);		
		} else {
			// All we need to do is replace the DC with an illegal value,
			// this keeps us from accidently deleting the handles associated with
			// the CDC that was passed to the constructor.			
			m_hDC = m_hAttribDC = NULL;
		}	
	}

	// Allow usage as a pointer	
	CMemDC* operator-&gt;() 
	{
		return this;
	}	

	// Allow usage as a pointer	
	operator CMemDC*() 
	{
		return this;
	}
};

#endif
</code></pre>
<p>Das ganze wird aufgerufen über</p>
<pre><code class="language-cpp">void CGraphCtrl::OnPaint() 
{
	CPaintDC dc(this); // device context for painting	

	CRect (rc_dest);
	rc_dest=GetSize();

	CRect (rc_source);
	rc_source=GetPlotDataSize();

	CMemDC pDC(&amp;dc,&amp;rc_source, &amp;rc_dest); // Double Buffering
	PlotToDC(&amp; pDC);

}
</code></pre>
<p>Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1282433</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1282433</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Thu, 10 May 2007 14:17:11 GMT</pubDate></item><item><title><![CDATA[Reply to StretchBlt skaliert falsch on Fri, 11 May 2007 06:26:45 GMT]]></title><description><![CDATA[<p>Vielleicht die Frage mal anders formuliert:<br />
Wie skaliert man zugroße/zukleine Bilder in MFC in ein dc richtig ?</p>
<p>Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1282768</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1282768</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Fri, 11 May 2007 06:26:45 GMT</pubDate></item></channel></rss>