День добрый, пишу приложение для КПК на MFC.
У меня проект основан на диалогах, но мне нужна прокручиваемая область, поэтому я прикрутил CscrollView к CDialog (выдрал из какой-то статьи):
CScrollView *pInfoScroll ;
m_pInfoScroll = (MyScrollView*)(RUNTIME_CLASS(MyScrollView)->CreateObject());
CCreateContext context;
context.m_pCurrentDoc = NULL;
m_pInfoScroll->Create(NULL,
NULL,
NULL,
// you will have to adjust the size of this rect to make
// the view fit at the desired location in your dialog box.
CRect(0, 0, clientRect.Width(), clientRect.Height()),
this,
123,
&context);
((CScrollView*)m_pInfoScroll)->OnInitialUpdate();
m_pInfoScroll->ShowWindow(SW_SHOW);
На компоненте CScrollView я рисую в обработчике OnDraw:
void CscrollviewView::OnDraw(CDC* pDC)
{
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap b;
CRect rect;
GetClientRect(&rect);
b.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
memDC.SelectObject(&b);
memDC.FillSolidRect(rect, RGB(0xff,0xff,0xff));
memDC.FillSolidRect(50, 50, 160, 120, RGB(255, 255, 128));
memDC.Ellipse(50 + 80, 50, 50 + 80 + 160, 50 + 120);
memDC.MoveTo(32767, 50);
memDC.LineTo(32767, 150);
memDC.MoveTo(32600, 100);
memDC.LineTo(32900, 100);
CPoint cp = GetScrollPosition();
pDC->BitBlt(0, cp.y, rect.Width(), rect.Height(), &memDC, 0, cp.y, SRCCOPY);
// TODO: add draw code for native data here
}
и еще функция :
void CscrollviewView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
// TODO: calculate the total size of this view
CRect clientRect;
GetClientRect(&clientRect);
SetScrollSizes(MM_TEXT, CSize(clientRect.Width(), clientRect.Height()*2));
this->Invalidate();
}
Так вот суть проблемы: не хочет перерисовываться CScrollView после того, как я подергаю скроллеры, хотя, если сделать тот же самый код для нормального MFC приложения и использовать MDI форму — то этот код работает, под эмулятором я проверял, после того как я подергаю скроллеры, то функция OnDraw — снова вызывается!!! но не перерисовает контент. Еще пробовал баловаться функцией
BOOL CscrollviewView::OnEraseBkgnd(CDC * pDC) {
return FALSE;
}
пробовал и без нее, ничего не помогает.
Уважаемые ГУРУ, может кто сталкивался с этой бедой? Заранее людям, потратившим свое время говорю СПАСИБО!