MFC CListCtrl не отображается после минимизации восстановления
Позвольте мне с самого начала сказать, что я использую старые технологии по сегодняшним стандартам! Это происходит в MFC на Visual Studio 2005 и работает под WinXP. (Если это не сломалось....;-))
У меня есть диалоговое приложение, которое имеет CTabCtrl с двумя вкладками. Каждый содержит CListCtrl. Они отлично работают в нормальных условиях. Они правильно заселяются, показывают и прячутся, как должны. Когда я впервые открываю приложение, выбор дисплея правильный. Если я затем сверну диалог и восстановлю, CList Ctrl не отображается, вкладка пуста. Это единственный контроль, который имеет эту проблему. Другой CListCtrl за пределами CTabCtrl отображается правильно. Если я затем поменяю местами вкладки и вернусь снова, появится другая вкладка, тогда первая появится как обычно.
Этого не происходит, если я получаю доступ к какой-либо другой части диалогового окна до минимизации, это происходит только тогда, когда минимизация является абсолютным первым действием, которое я предпринимаю. Это также происходит с CListCtrl, который у меня есть на другой вкладке, если я устанавливаю эту вкладку для выбора при запуске в OnInitDialog, где я настраивал CTabCtrl.
Я фактически решил эффект этой проблемы, добавив в свой OnSysCommand(...) следующее:
if ((nID & 0xFFF0) == SC_RESTORE)
{
m_ctrlReadList.Invalidate();
}
но мне жаль, что я добавляю код для решения проблемы, которая случается только в таких странных обстоятельствах. Я не могу не думать, что есть кое-что, что я пропустил в настройке, которая ведет к такому поведению. Кто-нибудь может предложить какое-либо объяснение относительно того, что вызывает это в первую очередь?
1 ответ
Мое объяснение основано на фактах того, что я обнаружил, но это был для меня опыт обучения, поэтому извинения, если я немного запутался, я все же позволю этому обосноваться в моем уме.
Наряду с этой проблемой я нашел другую, которая оказалась актуальной. Исходя из природы программы, которую я пишу, моим CListCtrls требовались заголовки фиксированной ширины. Теперь это оказалось другой вещью, которую я не мог настроить! Мне просто нужно было запретить пользователю захватывать и изменять размеры разделителей заголовка или делать двойной щелчок по ним для автоматического изменения размера, и, конечно, в CListCtrl есть функциональность, основанная на его дочернем CHeaderCtrl, для его настройки, не так ли? Ну, видимо, нет. LVS_EX_HEADERDRAGDROP, например, не так.
Поэтому я попытался захватить сообщения, которые позволили бы мне себя, и что вы знаете, я не мог! Я мог поймать в ловушку несколько, но не те, в которых я нуждался. Я искал HDN_BEGINTRACK и HDN_DIVIDERDBLCLICK. (Мы не будем вдаваться в тот факт, что вы ДОЛЖНЫ иметь дело с обеими версиями A и W по отдельности!) CHeaderCtrl является дочерним элементом CListCtrl, но он отправляет свои сообщения обратно на CDialog как родительский элемент CListCtrl. Я попытался использовать оба списка и 0 в качестве идентификатора, который, очевидно, используют заголовки. Многие из них просто не появились там вообще.
Поэтому я создал свой собственный класс CListCtrl, унаследованный от CListCtrl, переопределил OnNotify, и они оказались там. Я просто запретил вызывать CListCtrl::On Notify для этих сообщений, и это работало, вообще не работало с изменением размера.
Я также играл с Z-порядком, который мог бы иметь значение. Я не объяснял ранее, но этот и другой список находятся на двух вкладках, точно выровненных друг с другом. Выбор вкладок СКРЫВАЕТ и ПОКАЗЫВАЕТ каждый из списков по очереди. В другом списке не было проблем с отображением, даже когда я изменил отображение по умолчанию в OnInitDialog, чтобы показать его при запуске.
Это было под проблемным. Так что изменение Z-порядка в OnInitDialog, где я их настраивал - ничего не делало! И втирать его в этот второй список по умолчанию тоже нельзя было изменить, как я хотел, и я не мог понять, почему. Их свойства перечислены точно так же, и нигде в коде не было ни одного другого аспекта, установленного вручную, они были фактически теоретически идентичны, но практически не так. Так расстраивает!!!
И результатом этого является то, что теперь, когда проблема изменения размера заголовка решена, моя проблема с дисплеем также исчезла! Мне и некоторым другим кажется, что они сообщают о тех же симптомах, что и я, как будто CListCtrl - еще один из слегка облупленных и нуждается в небольшом массаже, чтобы извлечь из этого максимум пользы.
Я надеюсь, что это имеет смысл для тех из вас, кто хорошо знает этот контроль. Я был удивлен, насколько простым было решение, но также удивил меня, что процесс диагностики был настолько сложным. Конечно, это может быть связано со старением системы, в которой я работаю. В настоящее время я делаю это только для удовольствия, и затраты на обновление VS с 2005 года для случайного использования не являются первоочередной задачей. Я уверен, что некоторые из симптомов не будут отображаться в других средах сборки и запуска, но, возможно, стоит записать проблему и мое решение где-то в записи, чтобы Google мог ее найти для других.