Прокрутка списка управления MFC показывает дополнительные линии сетки - PullRequest
2 голосов
/ 08 октября 2008

Я использую элемент управления списком MFC в виде отчета со строками сетки для отображения данных в расплывчатой ​​форме.

Иногда, когда пользователь прокручивает элемент управления по вертикали, рисуются дополнительные линии сетки, что выглядит ужасно.

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

Похоже, это происходит, когда размер окна управления списком не является точным четным числом строк, так что частичная строка видна внизу.

Если я отрегулирую размер элемента управления списком так, чтобы частичные строки не были видны, проблема будет решена. Тем не менее, он появится, когда программа будет запущена на другом компьютере, предположительно из-за изменения количества пикселей, занятых строкой.

Я предполагаю, что это взаимодействие между разрешением экрана, размером шрифта и "диалоговыми единицами".

Полагаю, мне нужно программно изменить размер элемента управления при его создании. Но какого размера?

Я пытался использовать метод ApproximateViewRect (), но не могу заставить его работать. Возможно, этот метод не знает о просмотре отчета?

Другим методом, я полагаю, было бы создание собственной специализации CListCtrl и переопределение любого метода, выполняющего прокрутку. Похоже, это будет много работы.

Этот снимок экрана показывает тесно связанную проблему, где линии сетки пропадают без вести

alt text

а вот еще один с дополнительными линиями сетки

alt text

Единственное различие между этими двумя и между ними и тем, которое прекрасно прокручивается, состоит в том, что размер элемента управления по вертикали отличается на несколько пикселей.

Ответы [ 4 ]

6 голосов
/ 08 октября 2008

Это действительно ошибка, связанная с «плавной прокруткой», вот обходной путь:

void CMyListCtrl::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    __super::OnVScroll(nSBCode, nPos, pScrollBar);
    Invalidate();
    UpdateWindow();
}
1 голос
/ 08 октября 2008

Я помню, что это ошибка в ListView (не только через MFC, но и общий элемент управления в целом). Быстрый взгляд на это, похоже, поражает многих людей, приходящих к такому же выводу. Я полагаю, поскольку в Проводнике Windows нет линий сетки, они не чувствуют необходимости исправлять это? Я помню это еще в конце 90-х годов.

Я полагаю, хитрость заключается в том, чтобы сделать окно недействительным после прокрутки - может быть, в ответ на сообщение VSCROLL? Просто предположение.

0 голосов
/ 08 октября 2008

Чтобы исправить эту ошибку в элементе управления списком MFC, вам нужно специализировать элемент управления, переопределить метод, который отвечает на прокрутку, и заставить его полностью перерисовать список после того, как он сделал прокрутку.

заголовок интерфейса

class cSmoothListControl : public CListCtrl
{
public:
    DECLARE_MESSAGE_MAP()
    afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
};

реализация:

BEGIN_MESSAGE_MAP(cSmoothListControl, CListCtrl)
ON_WM_VSCROLL()
END_MESSAGE_MAP()

void cSmoothListControl::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    // call base class method to do scroll
    CListCtrl::OnVScroll(nSBCode, nPos, pScrollBar);

    // force redraw to cover any mess that may be created
    Invalidate();
    UpdateWindow();
}
0 голосов
/ 08 октября 2008

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

Может быть, вы можете опубликовать скриншот, чтобы проиллюстрировать проблему? Я полагаю, вы бы предпочли исправить проблему с перерисовкой, а не точно определить размер элемента управления?

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