Стрелки полосы прокрутки не перерисовываются, в то время как беговая дорожка перерисовывается правильно - PullRequest
0 голосов
/ 03 июня 2011

Я создал пользовательский элемент управления, зарегистрировав для него новый класс и создав его как дочерний элемент для окна верхнего уровня.Элемент управления в основном список.Чтобы сэкономить некоторые усилия, я решил использовать класс окна WS_VSCROLL, чтобы добавить полосы прокрутки к своему пользовательскому элементу управления.

Моя проблема в том, что, когда я изменяю размер окна, я перехожу к пересчету размера кнопки.размер страницы и т. д., затем вызовите SetScrollInfo с переменной перерисовки, установленной в значение true.Это правильно перерисовывает чертёж, но стрелки не перерисовываются.Поэтому, если я изменю размер окна снизу, верхняя стрелка все еще хороша , но нижняя пропадает.Если я изменю размер вправо, то обе стрелки меняют положение , и поэтому обе исчезают .

Я не могу найти способ получить дескриптор внутреннего элемента управления полосы прокрутки, который создает WS_VSCROLLдля того, чтобы назвать недействительным на это или что-то.Я действительно не знаю, как пройти форму здесь.Следует иметь в виду, что если я добавлю CS_VREDRAW |CS_HREDRAW к окну верхнего уровня, все рисуется правильно, поэтому я знаю, что по крайней мере все внутренние значения в порядкеПросто так я получаю слишком много перерисовок и мерцаний.

РЕДАКТИРОВАТЬ: Я публикую некоторый код.Я действительно хотел избежать этого, потому что я, вероятно, буду опозорен, но, пожалуйста, знайте, что, вероятно, никто, кроме меня, никогда не будет его использовать.

Элемент управления представляет собой колонку твитов, аналогично тому, как работает Tweetdeck.Каждый твит - это тоже пользовательский элемент управления, но он прекрасно рисует, и у меня нет проблем.Сам элемент управления столбца вообще не отвечает на WM_PAINT, потому что он просто содержит элементы управления Tweet, которые обрабатывают свою собственную отрисовку.

Вот также классы окна для каждого из них:

  • класс регистра верхнего уровня равен NULL, а класс CreateWindow - WS_OVERLAPPED |WS_CLIPCHILDREN.
  • регистр класса столбца равен NULL, а класс CreateWindow - WS_CHILD |WS_VSCROLL.
  • регистр класса твита равен NULL, а класс CreateWindow - WS_CHILD.

Код:

LRESULT Column::OnResize(WPARAM wParam, LPARAM lParam) // responds to WM_SIZE
{
    // global height var
    lastWidth = width;
    lastHeight = height;
    width = LOWORD(lParam);
    height = HIWORD(lParam);
    //updateScrollPageSize();

    SCROLLINFO si;
    si.cbSize = sizeof(si);
    si.fMask  = SIF_ALL;
    GetScrollInfo (hWnd, SB_VERT, &si);

    // Resize all child tweets
    if (lastWidth != width ||
        lastHeight != height && si.nMax - si.nPos < height)
    {
        // C++0x lambdas can only take in local variables?!
        int localWidth = width;
        int *tweetBottomPtr = &lastTweetBottom;
        *tweetBottomPtr = 0;
        std::for_each(tweets.begin(), tweets.end(),
                      [localWidth, tweetBottomPtr, &si](TweetBox *tweet)
        {
            MoveWindow(tweet->getHandle(),
                       tweet->getX(), *tweetBottomPtr - si.nPos,
                       localWidth, tweet->getHeight(), TRUE);
            *tweetBottomPtr += tweet->getHeight();
        });
    }

    updateScrollPageSize();
    UpdateWindow(hWnd);

    return 0;
}

и

void Column::updateScrollPageSize()
{
    SCROLLINFO si;
    // Set the vertical scrolling range and page size
    si.cbSize = sizeof(si);
    si.fMask  = SIF_ALL;
    GetScrollInfo (hWnd, SB_VERT, &si);

    si.fMask  = SIF_PAGE | SIF_RANGE;
    si.nMin = 0;
    si.nMax = lastTweetBottom;
    si.nPage  = (int)((float)height / lastTweetBottom * si.nMax);
    SetScrollInfo(hWnd, SB_VERT, &si, TRUE);
}

Ответы [ 2 ]

0 голосов
/ 04 июня 2011

Вы можете попробовать отправить дополнительное сообщение WM_NCPAINT в столбец в вашем обработчике WM_SIZE.Но я подумал, что это произойдет автоматически.

Но я считаю решение, предложенное BrendanMcK, для использования списка по умолчанию победителем.Жаль, что это не ответ.

0 голосов
/ 03 июня 2011

Реализуйте полосы прокрутки в родительском классе, а не в своем дочернем классе. Это предотвратит перерисовку сообщений дочернему классу, заставив дочерний класс полностью перерисовать его самостоятельно. Не обрабатывайте сообщения wm_paint в своем родительском классе, только в своем дочернем классе. Это позволит окнам выполнять обработку по умолчанию на полосе прокрутки. И оба окна должны быть CS_HREDRAW | CS_VREDRAW.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...