Ошибка при создании CDC, help!
От: Аноним  
Дата: 24.02.02 20:45
Оценка:
Привет всем.
Такая проблема: в моей функции DrawGraph примерно через 1-2 минуцты работы программы происходит ошибка при очередном создании контекста dc. Функция вызывается на WM_TIMER (он установлен на 10мсек). Привожу код:

void CGraphView::OnDraw(CDC* pDC)
{
    //рисуем график
    DrawGraph(pDC);
}

void CGraphView::OnTimer(UINT nIDEvent) 
{
    // TODO: Add your message handler code here and/or call default
    // чего-то тут делаю 
..............................................

    CDC *pDC = this->GetDC();
    DrawGraph(pDC);
}

void CGraphView::DrawGraph(CDC *pDC)
{
        
    CRect clientRect;
    GetClientRect(&clientRect);

    CDC dc;
    try{
        if(!dc.CreateCompatibleDC(pDC)) throw 1;
    }
    catch(int)
    {
        MessageBox("Ошибка создания контекста!");
        return;
    }
    
    CBitmap bmp;
    bmp.CreateCompatibleBitmap(pDC,clientRect.Width(),clientRect.Height());
    CBitmap* oldBitmap = dc.SelectObject(&bmp);
        //çàïîëíÿåì ñíà÷àëà íóæíûì öâåòîì áýêãðàóíä
    CBrush bkgrndBrush(RGB(0,0,0));
    dc.FillRect(&clientRect,&bkgrndBrush);
        
        
    double kX=(double)clientRect.Width()/1000;
    p = Y.begin();
    double y = clientRect.Height()/2-(*(p++)*100);
    
    CPen pen1(PS_SOLID,1,RGB(255,255,255));
    CPen* oldPen = dc.SelectObject(&pen1);
    dc.MoveTo(0,clientRect.Height()/2);
    dc.LineTo(clientRect.Width(),clientRect.Height()/2);
    dc.SelectObject(oldPen);
        
    CPen pen2(PS_SOLID,1,RGB(255,0,0));
    oldPen = dc.SelectObject(&pen2);
    
    dc.MoveTo(0,y);
    for(int i=0;i<Y.size()-1;i++)
    {
        y = clientRect.Height()/2-(*(p++)*clientRect.Height()/2);
        double xx = (double)i*kX;
        dc.LineTo((int)xx,y);
    }
    dc.SelectObject(oldPen);

    pDC->BitBlt( 0,0,clientRect.Width(),clientRect.Height(),
            &dc,0,0,SRCCOPY);

    dc.SelectObject(oldBitmap);

    dc.DeleteDC();
}


Вроде бы возвращаю везде все GDI-объекты, удаляю сам dc....
В чём трабл??

Буду благодаврен за совет,
Роман.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.