2016-10-20 1 views
0

Я пытаюсь отобразить изображение в CScrollView -derived класса:не OnDraw вызывался

C++ CScrollView, how to scroll an image?

Так что я хочу, чтобы переопределить OnDraw, чтобы переместить код из OnPaint в OnDraw. Но я не могу. Каждый раз, когда я звоню Invalidate(), только OnPaint получает вызов.

void CCardioAppView::OnDraw(CDC* pDC) 
{ 

} 

void CCardioAppView::OnPaint() 
{ 
    if (theApp.ImageFolderPath == _T("")) return; 
//---------------------метод № 2 с CPictureHolder------------------------------- 
    CPaintDC dc(this); 
    CBitmap bmp; 
    BITMAP b; 
    HBITMAP hbitmap; 
    CRect rect; 
    auto bmp_iter = theApp.FullBmpMap.find(m_iCurrentImage); 

    if (bmp_iter == theApp.FullBmpMap.end()) return; 

    hbitmap = bmp_iter->second; 
    bmp.Attach((*bmp_iter).second); 
    bmp.GetObject(sizeof(BITMAP), &b); 

    GetClientRect(&rect); 
    scaleRect = rect; 
    OriginalWidth = b.bmWidth; 
    OriginalHeight = b.bmHeight; 
    if (rect.Height() <= b.bmHeight) 
     scaleRect.right = rect.left + ((b.bmWidth*rect.Height())/b.bmHeight); 
    else if (rect.Height() > b.bmHeight) 
    { 
     scaleRect.right = b.bmWidth; 
     scaleRect.bottom = b.bmHeight; 
    } 
    scaleRect.right = scaleRect.right + scale_koef_g; 
    scaleRect.bottom = scaleRect.bottom + scale_koef_v; 

    pic.CreateFromBitmap(hbitmap); 
    pic.Render(&dc, scaleRect, rect); 

    (*bmp_iter).second.Detach(); 
    (*bmp_iter).second.Attach(bmp); 
    bmp.Detach(); 

    int isclWidth = scaleRect.Width(); 
    int isclHeight = scaleRect.Height(); 
    int irHeight = rect.Height(); 
    int irWidth = rect.Width(); 

    if ((isclWidth> irWidth)||(isclHeight > irHeight)) 
    { 
     SetScrollSizes(MM_TEXT, CSize(isclWidth, isclHeight)); 
    } 
    else SetScrollSizes(MM_TEXT, CSize(irWidth, irHeight)); 
} 
+0

Не бойтесь читать документацию ([Рисование в представлении] (https://msdn.microsoft.com/en-us/library/ssdhfz2t.aspx)). – IInspectable

ответ

1

Конечно, это не называется OnDraw(). Когда вы вызываете Invalidate(), оно заканчивается сообщением WM_PAINT для производного класса CView. По умолчанию реализация CView::OnPaint() получает краску DC, а затем она вызывает CView::OnDraw(). Вы переопределяете OnPaint(), и вы никогда не звоните OnDraw() в свой обработчик OnPaint().

Вы можете переместить некоторые из ваших OnPaint() кода в OnDraw() для очевидного материала, кроме как

После этого вы можете удалить OnPaint() декларацию и реализацию. Затем удалите запись карты сообщений ON_WM_PAINT(). Я не могу ручаться в любом случае для вашего кода рисования.