MF C: как получить доступ к полосе прокрутки при использовании CScrollView? - PullRequest
0 голосов
/ 06 марта 2020

Я создаю проект со следующими настройками.

  + Application type: Single document
  + Use Unicode libraries: NO
  + Project style: MFC standard
  + Use of MFC: Use MFC in a shared DLL
  + Base class: CScrollView

Я изменяю только OnDraw для вывода большого количества строк.

void CMRCView::OnDraw(CDC* pDC)
{
    CMRCDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;

    // TODO: add draw code for native data here

    CFont font;
    int font_pixels_height;

    /* set up font and figure out its height, omit here ... */

    CRect rect;
    GetClientRect(&rect);

    rect.bottom = font_pixels_height;

    CFont *old_font = pDC->SelectObject(&font);

    for (int i = 0; i < 10000; ++i)
    {
        pDC->DrawText("hello world 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789",
                      -1, &rect, DT_LEFT);
        rect.top += font_pixels_height;
        rect.bottom += font_pixels_height;
    }

    pDC->SelectObject(old_font);
}

Вывод в порядке. Когда я раскрываю окно, я вижу больше линий, но полоса прокрутки ни вертикальная, ни горизонтальная отсутствует.

1 Ответ

2 голосов
/ 06 марта 2020

Я думаю, вам нужно более внимательно прочитать документацию. Класс CScrollView определяет относительно немного дополнительных (к своему базовому классу CView) методов. Он будет автоматически отображать полосы прокрутки, если прокручиваемая область больше видимой клиентской области. Некоторые ключевые методы: SetScrollSizes(), GetScrollPosition() и GetClientRect() (унаследовано от CWnd).

Пересчитайте размер области прокрутки (и вызовите SetScrollSizes()) в любом случае, это может понадобиться - для Например, изменение данных в вашем CDocument или когда пользователь изменяет некоторые «Параметры просмотра».

Тогда есть два способа нарисовать (OnDraw()) ваш документ:

  • Нарисуйте всю прокручиваемую область. Это очень просто реализовать, но как-то «расточительно», поскольку может закрашивать область, которая не видна.
  • Рисовать только видимую часть прокручиваемой области. Позвоните GetTotalSize() (или просто проверьте значения, которые вы ранее передали SetScrollSizes() - вам придется их сохранить), GetClientRect() и GetScrollPosition(), чтобы определить, что вам нужно рисовать. Вы должны рисовать только прямоугольник, возвращенный GetClientRect() (вам нужно сместить его на положение прокрутки, возвращаемое GetScrollPosition()).

В любом случае вы также должны проверить, имеет ли прокручиваемый размер меньше, чем видимый клиентский прямоугольник) и в горизонтальном, и в вертикальном направлениях. Если это так, заполните остальные цвета нейтральным цветом, указав область «без данных» или «пустую». Лучше использовать стандартный системный цвет, возвращаемый GetSysColor() (например, COLOR_3DFACE или COLOR_BTNFACE), или какой-нибудь пользовательский более темный bru sh.

...