2016-04-06 8 views
1

Позвольте мне сказать, что я использую старые технологии по сегодняшним стандартам! Это происходит в MFC на Visual Studio 2005 и работает под WinXP. (Если это не удалось ... ;-))MFC CListCtrl не появляется после минимизации восстановления

У меня есть диалоговое приложение, которое имеет CTabCtrl с двумя вкладками. Каждый из них содержит CListCtrl. Они отлично работают при нормальных обстоятельствах. Они правильно заполняют и показывают и прячутся, как должны. Когда я сначала открываю приложение, выбор дисплея правильный. Если я затем минимизирую диалог и восстанавливаю, CList Ctrl не отображает, вкладка пуста. Это единственный контроль, который имеет эту проблему. Другой CListCtrl вне CTabCtrl отображается правильно. Если я затем поменяю вкладки и обратно, появится другая вкладка, тогда первая появится как обычная.

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

я на самом деле решил эффект этой проблемы, добавив в мою OnSysCommand (...) следующее:

if ((nID & 0xFFF0) == SC_RESTORE) 
{ 
    m_ctrlReadList.Invalidate(); 
} 

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

+0

Это может быть проблема, связанная с z-порядком? –

+0

Думаю, нам нужно больше узнать о соответствующем коде, который поможет вам. – rrirower

+0

1. В редакторе диалогов посмотрите, есть ли какой-либо другой элемент управления. 2. После восстановления используйте Spy ++, чтобы увидеть ту же ситуацию – Ajay

ответ

0

Мое объяснение основано на фактах того, что я нашел, но это было для меня опытом обучения, так что я извиняюсь, если немного получу некоторые из них, я все еще позволяю ему успокоиться.

Наряду с этой проблемой я нашел другую, которая оказалась актуальной. Из характера программы, которую я пишу, моим CListCtrls нужны заголовки с фиксированной шириной. Теперь это оказалось другим, что я не мог настроить! Мне просто нужно было не допустить, чтобы пользователь захватывал и изменял размер разделителей заголовка или дважды щелкал их, чтобы авторизовать, и, конечно, есть функциональность в CListCtrl на основе его дочернего CHeaderCtrl, чтобы установить это, не так ли? Ну, видимо, нет. Например, LVS_EX_HEADERDRAGDROP - это не так.

Итак, я исследовал попытки захвата сообщений, которые позволили бы мне самому себе, и что вы знаете, я не мог! Я мог бы заманить в ловушку несколько, но не те, которые мне нужны. Я искал HDN_BEGINTRACK и HDN_DIVIDERDBLCLICK. (Мы не будем вдаваться в то, что вам нужно иметь дело с A и W версиями этих отдельно!) CHeaderCtrl является дочерним элементом CListCtrl, но он отправляет свои сообщения обратно в CDialog в качестве родителя CListCtrl. Я пробовал там, используя как мои списки, так и 0 как ID, которые, по-видимому, используют заголовки. Многие из них просто не появились там вообще.

Итак, я создал свой собственный класс CListCtrl, наследующий от CListCtrl, переопределив OnNotify, и они появились там. Я просто запретил, чтобы CListCtrl :: On Notify вызывался для этих сообщений, и он работал, без изменения размера.

Я также играл с Z-орденом, который мог бы быть релевантным. Я не объяснял раньше, но этот и другой список находятся на двух вкладках, точно выровненных друг над другом. Выбор вкладок HIDE и SHOW для каждого из списков по очереди. В другом списке не было проблем с отображением, даже когда я изменил отображение по умолчанию в OnInitDialog, чтобы показать его при запуске.

Это было проблемно. Поэтому изменение Z-порядка в OnInitDialog, где я их установил, ничего не делал! И втирать его в этот второй список также был неуязвим по умолчанию, как я и хотел, и я не мог понять, почему.Их свойства перечислены точно так же, и в коде не было нигде, где любой другой аспект был задан вручную для них, они были теоретически идентичны, но практически не так. Так расстраивает !!!

И в результате этого, когда проблема с изменением размера заголовка решена, моя проблема с отображением тоже исчезла! Мне кажется, и некоторые другие, которые сообщают о подобных симптомах, как я, как будто CListCtrl является еще одним из слегка шелушащихся и нуждается в небольшом массировании, чтобы извлечь максимум из этого.

Я надеюсь, что это имеет смысл для тех из вас, кто хорошо знает этот контроль. Я был удивлен, насколько простым было решение, но это также удивило меня, что диагностический процесс был настолько сложным. Разумеется, это может случиться и в системе старения, в которой я работаю. В настоящее время я делаю это только для удовольствия, и расходы на обновление VS с 2005 года для случайного использования не являются первоочередной задачей. Я уверен, что некоторые из симптомов не будут отображаться в других средах сборки и запуска, но, возможно, стоит иметь проблему и мое решение для записи где-нибудь в Google, чтобы найти для других.