Мой яд вам, товарищи (это в хорошем смысле, ибо яд, как известно, лекарство).
2 runner,
Обнаружил, что CTabCtrl не дружит с CListCtrl и CSliderCtrl.
CTabCtrl инкапсулирует элемент управления из состава common controls winapi. «Контролы» шелл – это очень и очень устойчиво работающая часть WinAPI. Всё там «дружит». Программируете, товарисчъ плохо. В мфц много, на мой взгляд, ненужных заморочек, но они совсем в другом.
Дочерний диалог открытый на странице не прорисовывает вначале Лист и Слайдер. Потом прорисовывает - после перенесения фокуса или заслонения окна другим окном. Похоже, что надо их как-то дополнительно прорисовать. Но не могу найти как %(.
То, что Вы пишете (особенно про инвалидейт ниже), говорит о том, что неправильно спроектированы окна, которые являются родительскими по отношению к Вашим контролам. В таких случаях бывает «мерцание» контролов, задержки в перерисовке, а в худшем случае – то, что у Вас. Попробуйте проверить свойства всех родительских окон. Например, для диалогов и табконтрола попробуйте сделать так (этот класс должен наследовать и от CTabCtrl, т.е. class CMyTabPageCtrl : public CTabCtrl, ….):
Код: Выделить всё
//-----------------------------------------------------------------------
void CMyTabPageCtrl::SetClipStyle(void)
{
LONG wStyle = GetWindowLong(m_hWnd,GWL_STYLE);
wStyle |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
SetWindowLong(m_hWnd,GWL_STYLE, wStyle);
}
Здесь обратите внимание на свойства окон WS_CLIPSIBLINGS | WS_CLIPCHILDREN.
2 Woozy,
Я бы попробовал перекрыть событие переключения таба в таб-контроле
Я бы не пробовал, а так бы и делал. Ты знаешь, Вузи, а ведь по другому и не делают

)). Делают, конечно, поразному. Профессионалы (ну, ты понимаешь, я о себе здесь) приблизительно так:
Код: Выделить всё
//----------------------------------------------------------------
void CMyTabPageCtrl::ActivatePage(int IndexPageToActivate)
{
for (int i = 0; i < cnt_pages; i++)
Pages[i].pWnd->ShowWindow((i == IndexPageToActivate) ? SW_SHOW : SW_HIDE);
}
и выдал бы ->Show() для обоих внутренних контролов.
Ты, во-первых, невнимательно читаешь пост автора топика (поэтому и пишешь ерунду). Товарищь контролы промещает на диалоги. Причём здесь отображение CListCtrl и CSliderCtrl?
Во-вторых рисование контролов непосредственно на табе – по меньшей мере (чтобы тебя не обидеть, Вузи) – так делают или новички, которые ничего не знают, или профи (но и то при условии, что контролов совсем немного).
В-третьих, ты мог бы заметить, что если у автора топика возникают ТАКИЕ вопросы ( как возникают), то до отрисовки контролов непосредственно на табе ему ещё очень далеко. Он пробует проектировать по стандартой схеме гуистов – рисует на диалогах (и правильно делает). У него Таб переключает диалоги.
В-четвёртых, Вузи, VC++ – это не СBuilder, так горячо любимый в совке. Это там публика довольствуется шоу и хайд. И CWnd-объекты мфц и винапи используют схожую по интерфейсу функцию (читай мсдн) ShowWindow:
Код: Выделить всё
BOOL ShowWindow(
HWND hWnd, // handle to window
int nCmdShow // show state
);
И то, что ты написал про «и выдал бы ->Show() для обоих внутренних контролов» - здесь не причём. Хотя я понимаю, конечно, стереотипы Борланда и дельфи давлеют….
2 runner,
Thanks a lot!
Решение лежало близко. Помогло ->Invalidate() т.к. Show() для CWnd нету. Интересно, а почему оно их не рисует? А может рисует и перекрывает? На досуге разберусь.
Ничего по большому счёту Вам не помогло. Наивный. Это говорит только о том, что не правильно спроектировано ваше приложение. Не требуется, понимаете,
не требуется в обычной практике программирования (если, конечно, это программирование - качественное) схожих задач использовать ->Invalidate() для изнасилования окна.
2 Woozy,
А, точно, в MFC вроде ShowWindow ещё есть. Не местные мы, ATL-ные...
Что значит ещё есть? Там больше ничего и нет. Или ShowWindow мфц, или аналогичная функция винапи.
Отчего-то мне сдаётся, что MFC "любит" работать с диалогами размещёнными на страницах табов.
Только так грамотные программисты и делают (работают с диалогами). Ты не сможешь мне привести пример профессионального кода, где б сделано было по другому(при условии большого числа контролов).
Когда ты кладёшь на таб-страницу просто контролы - то у них вроде как нет чуткого "родителя", что их будет обязательно отрисовывать.
Вузи, ещё раз говорю тебе, что непосредственно укладывают контролы «на Таб» – только настоящие профи, которые пишут всё руками, в том числе файлы ресурсов (ну, где про контролы всякая всячина). Да и то – извращенцы, да и то при очень небольшом числе контролов, да и то при незатейлевой обработке сообщений приложения.
Напоследок ещё раз укушу тебя, Вузи. Родитель всё равно будет (если программировать не как серая масса, как все, а тем извратом, что ты предлагаешь). И имя тому родителю будет – табконтрол. И родитель этот, как тебе не покажется странным – ничуть не хуже окна диалога.
ПС.
Горько мне и обидно. А я ведь верил тебе, Вузи.