Тупой вопрос по MFC
Правила форума
Пожалуйста, ознакомьтесь с правилами данного форума
Пожалуйста, ознакомьтесь с правилами данного форума
- Проф. Преображенский
- Графоман
- Сообщения: 20276
- Зарегистрирован: 08 ноя 2006, 11:10
Тупой вопрос по MFC
Обнаружил, что CTabCtrl не дружит с CListCtrl и CSliderCtrl. Дочерний диалог открытый на странице не прорисовывает вначале Лист и Слайдер. Потом прорисовывает - после перенесения фокуса или заслонения окна другим окном. Похоже, что надо их как-то дополнительно прорисовать. Но не могу найти как %(.
-
- Завсегдатай
- Сообщения: 278
- Зарегистрирован: 03 мар 2003, 08:55
- Откуда: RU->BC->ON->FI -> Chicago, IL -> Seattle, WA
Re: Тупой вопрос по MFC
Я бы попробовал перекрыть событие переключения таба в таб-контроле и выдал бы ->Show() для обоих внутренних контролов.
- Проф. Преображенский
- Графоман
- Сообщения: 20276
- Зарегистрирован: 08 ноя 2006, 11:10
Re: Тупой вопрос по MFC
Thanks a lot!Woozy писал(а):Я бы попробовал перекрыть событие переключения таба в таб-контроле и выдал бы ->Show() для обоих внутренних контролов.
Решение лежало близко. Помогло ->Invalidate() т.к. Show() для CWnd нету. Интересно, а почему оно их не рисует? А может рисует и перекрывает? На досуге разберусь.
-
- Завсегдатай
- Сообщения: 278
- Зарегистрирован: 03 мар 2003, 08:55
- Откуда: RU->BC->ON->FI -> Chicago, IL -> Seattle, WA
Re: Тупой вопрос по MFC
А, точно, в MFC вроде ShowWindow ещё есть. Не местные мы, ATL-ные...
Отчего-то мне сдаётся, что MFC "любит" работать с диалогами размещёнными на страницах табов. А в случае диалога - само диалоговое окно и ответственно за отрисовку внутренних контролов. Когда ты кладёшь на таб-страницу просто контролы - то у них вроде как нет чуткого "родителя", что их будет обязательно отрисовывать.
Отчего-то мне сдаётся, что MFC "любит" работать с диалогами размещёнными на страницах табов. А в случае диалога - само диалоговое окно и ответственно за отрисовку внутренних контролов. Когда ты кладёшь на таб-страницу просто контролы - то у них вроде как нет чуткого "родителя", что их будет обязательно отрисовывать.
-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
Мой яд вам, товарищи (это в хорошем смысле, ибо яд, как известно, лекарство).
2 runner,
Здесь обратите внимание на свойства окон WS_CLIPSIBLINGS | WS_CLIPCHILDREN.
2 Woozy,
)). Делают, конечно, поразному. Профессионалы (ну, ты понимаешь, я о себе здесь) приблизительно так:
Во-вторых рисование контролов непосредственно на табе – по меньшей мере (чтобы тебя не обидеть, Вузи) – так делают или новички, которые ничего не знают, или профи (но и то при условии, что контролов совсем немного).
В-третьих, ты мог бы заметить, что если у автора топика возникают ТАКИЕ вопросы ( как возникают), то до отрисовки контролов непосредственно на табе ему ещё очень далеко. Он пробует проектировать по стандартой схеме гуистов – рисует на диалогах (и правильно делает). У него Таб переключает диалоги.
В-четвёртых, Вузи, VC++ – это не СBuilder, так горячо любимый в совке. Это там публика довольствуется шоу и хайд. И CWnd-объекты мфц и винапи используют схожую по интерфейсу функцию (читай мсдн) ShowWindow:
И то, что ты написал про «и выдал бы ->Show() для обоих внутренних контролов» - здесь не причём. Хотя я понимаю, конечно, стереотипы Борланда и дельфи давлеют….
2 runner,
2 Woozy,
Напоследок ещё раз укушу тебя, Вузи. Родитель всё равно будет (если программировать не как серая масса, как все, а тем извратом, что ты предлагаешь). И имя тому родителю будет – табконтрол. И родитель этот, как тебе не покажется странным – ничуть не хуже окна диалога.
ПС.
Горько мне и обидно. А я ведь верил тебе, Вузи.
2 runner,
CTabCtrl инкапсулирует элемент управления из состава common controls winapi. «Контролы» шелл – это очень и очень устойчиво работающая часть WinAPI. Всё там «дружит». Программируете, товарисчъ плохо. В мфц много, на мой взгляд, ненужных заморочек, но они совсем в другом.Обнаружил, что CTabCtrl не дружит с CListCtrl и CSliderCtrl.
То, что Вы пишете (особенно про инвалидейт ниже), говорит о том, что неправильно спроектированы окна, которые являются родительскими по отношению к Вашим контролам. В таких случаях бывает «мерцание» контролов, задержки в перерисовке, а в худшем случае – то, что у Вас. Попробуйте проверить свойства всех родительских окон. Например, для диалогов и табконтрола попробуйте сделать так (этот класс должен наследовать и от 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);
}
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);
}
Ты, во-первых, невнимательно читаешь пост автора топика (поэтому и пишешь ерунду). Товарищь контролы промещает на диалоги. Причём здесь отображение CListCtrl и CSliderCtrl?и выдал бы ->Show() для обоих внутренних контролов.
Во-вторых рисование контролов непосредственно на табе – по меньшей мере (чтобы тебя не обидеть, Вузи) – так делают или новички, которые ничего не знают, или профи (но и то при условии, что контролов совсем немного).
В-третьих, ты мог бы заметить, что если у автора топика возникают ТАКИЕ вопросы ( как возникают), то до отрисовки контролов непосредственно на табе ему ещё очень далеко. Он пробует проектировать по стандартой схеме гуистов – рисует на диалогах (и правильно делает). У него Таб переключает диалоги.
В-четвёртых, Вузи, VC++ – это не СBuilder, так горячо любимый в совке. Это там публика довольствуется шоу и хайд. И CWnd-объекты мфц и винапи используют схожую по интерфейсу функцию (читай мсдн) ShowWindow:
Код: Выделить всё
BOOL ShowWindow(
HWND hWnd, // handle to window
int nCmdShow // show state
);
2 runner,
Ничего по большому счёту Вам не помогло. Наивный. Это говорит только о том, что не правильно спроектировано ваше приложение. Не требуется, понимаете, не требуется в обычной практике программирования (если, конечно, это программирование - качественное) схожих задач использовать ->Invalidate() для изнасилования окна.Thanks a lot!
Решение лежало близко. Помогло ->Invalidate() т.к. Show() для CWnd нету. Интересно, а почему оно их не рисует? А может рисует и перекрывает? На досуге разберусь.
2 Woozy,
Что значит ещё есть? Там больше ничего и нет. Или ShowWindow мфц, или аналогичная функция винапи.А, точно, в MFC вроде ShowWindow ещё есть. Не местные мы, ATL-ные...
Только так грамотные программисты и делают (работают с диалогами). Ты не сможешь мне привести пример профессионального кода, где б сделано было по другому(при условии большого числа контролов).Отчего-то мне сдаётся, что MFC "любит" работать с диалогами размещёнными на страницах табов.
Вузи, ещё раз говорю тебе, что непосредственно укладывают контролы «на Таб» – только настоящие профи, которые пишут всё руками, в том числе файлы ресурсов (ну, где про контролы всякая всячина). Да и то – извращенцы, да и то при очень небольшом числе контролов, да и то при незатейлевой обработке сообщений приложения.Когда ты кладёшь на таб-страницу просто контролы - то у них вроде как нет чуткого "родителя", что их будет обязательно отрисовывать.
Напоследок ещё раз укушу тебя, Вузи. Родитель всё равно будет (если программировать не как серая масса, как все, а тем извратом, что ты предлагаешь). И имя тому родителю будет – табконтрол. И родитель этот, как тебе не покажется странным – ничуть не хуже окна диалога.
ПС.
Горько мне и обидно. А я ведь верил тебе, Вузи.
-
- Завсегдатай
- Сообщения: 278
- Зарегистрирован: 03 мар 2003, 08:55
- Откуда: RU->BC->ON->FI -> Chicago, IL -> Seattle, WA
Спасибо, доброхот ты, товарищ vg!vg писал(а):Мой яд вам, товарищи (это в хорошем смысле, ибо яд, как известно, лекарство).

Горько мне и обидно. А я ведь верил тебе, Вузи.



-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
2Woozy,
2) По поводу моего "критиканства" - в некоторой части ты прав.

2) Во-первых "самородок ты сибирский" - ты чего обзываешься?
Во-вторых, не сибирский, а Магаданский. Слыхал про такой мегаполис?
А вобще...., как ты догадался, что я и есть самородистый самородок? Кстати, надоб об этом промолчать. А то у нас здесь очередная борьба намечается - то ли с утечками мозгов, то ли с протечками мозгов. Вдруг не дадут мне "утечь" .
1) Речь не о тебе и других профи. Речь о товарище. В таких ситуациях ей (молодой поросли) - лучшее лекарство это яд. Ничего у него не работает. В том смысле, что, как ты понимаешь, в программировании не бывает "маленьких" косяков. А то получается - "хороша невеста, но чуть-чуть беременная". "Невылизанное программирование" может отозваться товарищу с Invalidate действительно инвалидным программированием в будущем. Так, что ему не надо успокаиваться, а надо искать косяки в коде.Если надо чтоб работало, так оно ж работает, чо критиканствуешь?
2) По поводу моего "критиканства" - в некоторой части ты прав.
1) Кусаться буду здесь. Я еду из совка, где все, кому не лень по 10 раз на день устанавливают и переустанавливаю "свои порядки", как ты говоришь. Так, что на новые порядки даже не надейся - не будет тебе такого счастья.Вот приедешь, так и будешь свои порядки тут наводить, самородок ты сибирский.

2) Во-первых "самородок ты сибирский" - ты чего обзываешься?

А вобще...., как ты догадался, что я и есть самородистый самородок? Кстати, надоб об этом промолчать. А то у нас здесь очередная борьба намечается - то ли с утечками мозгов, то ли с протечками мозгов. Вдруг не дадут мне "утечь" .

-
- Завсегдатай
- Сообщения: 278
- Зарегистрирован: 03 мар 2003, 08:55
- Откуда: RU->BC->ON->FI -> Chicago, IL -> Seattle, WA
- Проф. Преображенский
- Графоман
- Сообщения: 20276
- Зарегистрирован: 08 ноя 2006, 11:10
Дорогой дружок!
Боюсь, что яд мне уже не лекарство... Я уважаю ваш труд в виде многострочного сообщения, но у меня нет времени на подобное, сорри.
Не со всем изложенным я согласен, но просто попробуйте сами разместить диалог на Табконтроле. Сами убедитесь - все работает, кроме упомянутых контролов.
Ваша самоуверенность мне нравится, хотя со временем это пройдет.
Ваш runner
Боюсь, что яд мне уже не лекарство... Я уважаю ваш труд в виде многострочного сообщения, но у меня нет времени на подобное, сорри.
Не со всем изложенным я согласен, но просто попробуйте сами разместить диалог на Табконтроле. Сами убедитесь - все работает, кроме упомянутых контролов.
Ваша самоуверенность мне нравится, хотя со временем это пройдет.
Ваш runner
-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
runner,
Программирование Таба - вещь обыденная. Нет, и никогда не было там подводных камней. Пытаться сделать так, как у Вас, чтоб не работало - не интересно. Вам дали совет. Ваше дело воспользоваться, или нет.Не со всем изложенным я согласен, но просто попробуйте сами разместить диалог на Табконтроле. Сами убедитесь - все работает, кроме упомянутых контролов.
- Проф. Преображенский
- Графоман
- Сообщения: 20276
- Зарегистрирован: 08 ноя 2006, 11:10
Упрямый, не считай других глупее себя. Совет мне дал Вузи, ты мне дал яду. %)vg писал(а):runner,
Программирование Таба - вещь обыденная. Нет, и никогда не было там подводных камней. Пытаться сделать так, как у Вас, чтоб не работало - не интересно. Вам дали совет. Ваше дело воспользоваться, или нет.
Естественно, я посмотрел все, что можно на эту тему. В CodeGuru нашел упоминание моей проблемы, но решения не нашел. Вот освобожусь - тисну туда мессэдж.
А проект у меня непростой - несколько уровней вложенных табов, на которые положены немодальные диалоги, в некоторых запускается видео.
Программирование Таба - простая вещь. Но в МФС много багов и триков. Неинтересно - не смотри. Но не знаешь - не говори.
-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
Между прочим, на этом форуме я задаю вопросы. Поэтому разумеется, что предполагаю большинство здешнего народа, по меньшей мере более опытным. Но уж не глупее - это точно. Разумеется, я считаю Канадских ИТ более грамотными, чем совковых. Пока считаю.Упрямый, не считай других глупее себя.
Я дал тебе совет. Ты его не увидил, т.к. первые строки моих предыдущих постов "налили" тебя гневом. Ночь не спал? О моём совете - ниже.Совет мне дал Вузи, ты мне дал яду. %)
Как говорил незабвенный здешний персонаж - отдохни от кошмаров.
Отвечай за себя сам. Без гуру и авторитетов.В CodeGuru нашел упоминание моей проблемы, но решения не нашел.
Здесь у всех, между прочим, не простые проекты.А проект у меня непростой - несколько уровней вложенных табов, на которые положены немодальные диалоги, в некоторых запускается видео.
Хоть понял, что сказал?несколько уровней вложенных табов, на которые положены немодальные диалоги
Да, много. Но не багов, а запутанных, часто - мешающих вещей. К тебе (твоей задаче) это не относится.Программирование Таба - простая вещь. Но в МФС много багов и триков.
Это никак не должно отразится на отрисовке CListCtrl и CSliderCtrl (см. свой пост выше)в некоторых запускается видео
МОЙ СОВЕТ
А мой совет был таков - посмотреть, не мешает ли отрисовке контролов сам Таб (это тоже окно), или диалоги, на которых ты расположил контролы. Для этого, для таба и диалогов я бы попробовал установить стиль (или переустановить) окна WS_CLIPCHILDREN. Я написал тебе, как это сделать при помощи SetWindowLong(m_hWnd,GWL_STYLE, wStyle). Если не помогает и это, то перед тем, как говорить глупости в отношении изделия MS (мфц), я бы ещё посмотрел, что даст обработка события WM_ERASEBKGND. Здесь ничего делать не надо, а просто вернуть 1. Тем самым сказать, что ты обработал фон.
Даже, не видя твоего приложения, могу с уверенностью сказать, что Таб здесь (в твоих проблемах) - не причём. Он "ничего не рисует", кроме самого себя.
ПС. Постарайся возражать предметно. Ты даже не сказал, с чем ты "не совсем со мной согласен". Пальцем покажи.
- папа Карло
- Шарманщик
- Сообщения: 8565
- Зарегистрирован: 17 фев 2003, 15:04
- Откуда: НН -> BC -> WA -> UT -> CA
- Проф. Преображенский
- Графоман
- Сообщения: 20276
- Зарегистрирован: 08 ноя 2006, 11:10
Из твоего поста я понял:
1. что ты не заметил смайлика.
2. не знаешь (или меня не понял), что такое CodeGuru.
3. не понял, как могут быть табы вложенными.
Естественно, что я экспериментировал со стилями окна, как родителей, так и контролов. Заметил несколько интересных эффектов. Но проблемы это не решило.
Твой совет использовать событие WM_ERASEBKGND ничем не лучше принудительной отрисовки контрола. Я его не пробовал (т.к. уже решил проблему), но попробую потом, когда время появится.
А не согласен я с тем, что почему-то ты решил, что проект неправильно построен и из-за этого все неприятности. Однако простая логика доказывает обратное - все остальные контролы ведут себя подобающим образом и только лист и слайдер не хотят появляться сразу, а прорисовываются принудительно.
1. что ты не заметил смайлика.
2. не знаешь (или меня не понял), что такое CodeGuru.
3. не понял, как могут быть табы вложенными.
Естественно, что я экспериментировал со стилями окна, как родителей, так и контролов. Заметил несколько интересных эффектов. Но проблемы это не решило.
Твой совет использовать событие WM_ERASEBKGND ничем не лучше принудительной отрисовки контрола. Я его не пробовал (т.к. уже решил проблему), но попробую потом, когда время появится.
А не согласен я с тем, что почему-то ты решил, что проект неправильно построен и из-за этого все неприятности. Однако простая логика доказывает обратное - все остальные контролы ведут себя подобающим образом и только лист и слайдер не хотят появляться сразу, а прорисовываются принудительно.
- Marmot
- Графоман
- Сообщения: 39275
- Зарегистрирован: 17 фев 2003, 17:58
- Откуда: Caulfeild
- Контактная информация: