Re: LBUTTONDOWN() problem
On Sep 2, 1:47 pm, neha <coolcapr...@gmail.com> wrote:
Hi all,
I have written a piece of code to increment the font size of text
whenever i left click in the client area
void CTextDisplayView::OnLButtonDown(UINT nFlags, CPoint point)
{
CView::OnLButtonDown(nFlags, point);
CString str="Hello";
int x1=point.x;
int y1=point.y;
LOGFONT lf;
HFONT font;
memset(&lf, 0, sizeof(LOGFONT)); // Clear out stru=
cture.
lf.lfHeight = x1;
strcpy(lf.lfFaceName, "Comic Sans MS");
font=(HFONT)m_font.CreateFontIndirect(&lf);
CClientDC dc2(this);
dc2.SelectObject(m_font);
dc2.TextOut(x1,y1,str);
::ReleaseDC(m_hWnd,dc2);
}
whenever i execute the application, on first left click it
displays the text with size a the co-ordinate recieved in
lbuttondown's CPoint point argument, but on second button click it
stop the application with error (Debug assertion Failed!).
i want to display text with incremented fontsize on every
leftbutton click.
Please help me out.
ASSERT is in what file/line? Did you look in there? If you did there,
you could have understood this by yourself. (i.e. I think you should
do it the next time you get an assert ;-) ).
That said...
ASSERT is in BOOL CGdiObject::Attach(HGDIOBJ hObject),
line
ASSERT(m_hObject == NULL); // only attach once, detach on
destroy
...., right?
The problem is that you call CreateFontIndirect multiple times without
calling DeleteObject. MFC classes that are in fact wrappers around OS
handles (case here, CFont represents and wraps HFONT of Win API), have
implicit contract WRT object creation: it is programmer's duty is to
call creation function; if that succeeded, he has to call deletion
function before calling creation function again. But more usually,
code just destroys the corresponding class instance and creates a new
one (in which case, destructor disposes off the underlying handle)..
You did not do that with m_font: every time you click, you try to
"create" it. That is an error. It would have been an error if you
worked with raw HFONT, too.
Moreover, your code contains many other errors. It only seems to work.
For example, you should not be paint anything in the situation you
have here. You should invalidate (part of) your window, then wait for
WM_PAINT. That is, except in exceptional situations ;-), you only
paint in WM_PAINT.
Back to drawing board? ;-)
HTH,
Goran.