none
Проблема скроллинга изображения в CScrollView RRS feed

  • Вопрос

  • Привет всем! Имеется следующая проблема.

    Необходимо сделать скроллинг очень большого изображения (до 4500 * 4500 пикселей). Для этого я унаследовал свой класс представления от CScrollView (MFC). Изображение отрисовывается в DC, содержащимся в памяти (CreateCompatibleDC, CreateCompatibleBitmap), а затем выводится в клиентскую область представления с помощью копирования из памяти: BitBlt. Скроллинг работает плавно, но есть одно НО. При прокрутке изображения заметны "артефакты" в виде мерцающей полосы с той стороны, в которую осуществляется скроллинг.

    Причина в том, что перед тем, как будет обработан метод OnDraw моего представления выполняется отрисовка фона по умолчанию (белого). Получается следующая картина: сначала отрисовывается белая полоска, потом на её месте рисуется часть моего изображения. В результате происходит мерцание на границе при скроллинге.

    Собственно вопрос: как заставить CScrollView не перерисовывать свой фон при изменении размеров окна?
    • Перемещено Abolmasov Dmitry 18 сентября 2012 г. 7:49 (От:Языки программирования)
    17 сентября 2012 г. 9:51

Ответы

Все ответы

  • Разобрался :) Может, кому поможет. Нужно написать обработчик сообщения WM_ERASEBKGND:

    BOOL CMyView::OnEraseBkgnd(CDC* pDC)
    {
         return TRUE;
    }
    

    17 сентября 2012 г. 10:48
  • Спасибо за выложенное решение проблемы.


    Для связи [mail]

    18 сентября 2012 г. 7:48
  • Справка рекомендует следующий код  "to prevent excessive background repainting":

    BOOL CMyView::OnEraseBkgnd(CDC* pDC)
    {
         CBrush br(GetSysColor(COLOR_WINDOW));
         FillOutsideRect(pDC, &br);
         return TRUE;
    }
    • Помечено в качестве ответа Abolmasov Dmitry 18 сентября 2012 г. 10:35
    18 сентября 2012 г. 9:56
  • Существует ли способ выполнить рисование ДО того, как CScrollView перерисует свою часть?

    Т.е.:

    1) поступает сообщение о том, что представление следует прокрутить;

    2) скроллбары устанавливаются в новую позицию;

    3) CScrollView перерисовывает видимую часть изображения;

    4) Мы получаем возможность рисовать в методе OnDraw:

    В частности, получаем ClipBox: pDC->GetClipBox(&rcClip);

    Можно ли как-нибудь получить ClipBox и отрисовать там своё изображение до того, как CScrollView отрисует остальную часть клиентского окна?

    • Изменено AlexSpl 24 сентября 2012 г. 13:30
    24 сентября 2012 г. 13:28