On Mar 10, 6:56 pm, "Peter Olcott" <NoS...@OCR4Screen.com>
wrote:
I am have built a general purpose bitmap/image handling
class and want to add TextOut() capability to this
class. To
do this I must convert some of my GDI local function
variables into GDI object member variables. This means
that
I must be able to re-use several GDI objects, instead of
constructing them and destroying them after a single
use.
Well, certainly nothing stops you from doing that, e.g.
(Warning: works with head-compiler and in head-debugger,
YMMV)
typedef shared_ptr<CGdiObject> SPGdiObject;
class COhSoGreat
{
typedef KeyType int;
std::map<KeyType, SPGdiObject> m_gdiObjects;
struct CTempGdiObjectSelection : noncopyable
{
CTempGdiObjectSelection(CDC& dc, const CGdiObject& o)
: m_dc(dc),
m_new(o) { m_pOld = dc.SelectObject(&o); }
~CTempGdiObjectSelection() {
m_dc.SelectObject(m_pOld); }
CDC& m_dc;
CGdiObject* m_pOld;
CGdiObject& m_new
}
void SoGreatDrawingCode(CDC& dc) const /*an important
const*/
{
{ CTempGdiObjectSelection SelectSomething(dc,
*m_gdiObject[someObjectKey]);
// Draw, baby, draw.
{ CTempGdiObjectSelection SelectSomething(dc,
*m_gdiObject[someObjectKey]);
// Draw, baby, draw.
}
}
}
void OtherFunctionsThatMustFillYourGdiObjectContainer()
{ // e.g.
SPGdiObject P(new CFont);
if (!P->CreateXYZ(params))
AfxThrowResourceException();
m_gdiObjects[some_key] = P;
}
};
Use an approach like this and it will be rather hard to
leak any
resources.
You also said:
"The main thing that I want to do is to manually free any
memory or resources that the CBitmap object is using. I
don't know what resources it is using, and I don't know
how
to free them."
Just let CBitmap C++ object be destroyed. As Joe said,
don't try to
get smart with leaving it selected in a DC while
destroyed. That's why
I proposed CTempGdiObjectSelection up here. If you can
make your gdi
object container constant while drawing (note the "const"
qualifier on
"SoGreatDrawingCode"), you're practically locked out of a
resource
leak (bar limitless ingenuity in shooting oneself in the
foot :-) ).
You say that you tried destroying gdi object while
selected and that
this works, but did you verify this with some GDI handle
monitor
program? There are some on the internet. Try this first.
What issues are raised with resource and memory leaks by
using CDC and CBitmap objects? How are these issues
mitigated?
Listening to Joe gets you far :-).
Goran.
Joseph M. Newcomer [MVP]