Тупой вопрос по MFC

Все, что вы хотели знать о программизме, но боялись спросить.
Аватара пользователя
Проф. Преображенский
Графоман
Сообщения: 20276
Зарегистрирован: 08 ноя 2006, 11:10

Тупой вопрос по MFC

Сообщение Проф. Преображенский »

Обнаружил, что CTabCtrl не дружит с CListCtrl и CSliderCtrl. Дочерний диалог открытый на странице не прорисовывает вначале Лист и Слайдер. Потом прорисовывает - после перенесения фокуса или заслонения окна другим окном. Похоже, что надо их как-то дополнительно прорисовать. Но не могу найти как %(.
Woozy
Завсегдатай
Сообщения: 278
Зарегистрирован: 03 мар 2003, 08:55
Откуда: RU->BC->ON->FI -> Chicago, IL -> Seattle, WA

Re: Тупой вопрос по MFC

Сообщение Woozy »

Я бы попробовал перекрыть событие переключения таба в таб-контроле и выдал бы ->Show() для обоих внутренних контролов.
Аватара пользователя
Проф. Преображенский
Графоман
Сообщения: 20276
Зарегистрирован: 08 ноя 2006, 11:10

Re: Тупой вопрос по MFC

Сообщение Проф. Преображенский »

Woozy писал(а):Я бы попробовал перекрыть событие переключения таба в таб-контроле и выдал бы ->Show() для обоих внутренних контролов.
Thanks a lot!
Решение лежало близко. Помогло ->Invalidate() т.к. Show() для CWnd нету. Интересно, а почему оно их не рисует? А может рисует и перекрывает? На досуге разберусь.
Woozy
Завсегдатай
Сообщения: 278
Зарегистрирован: 03 мар 2003, 08:55
Откуда: RU->BC->ON->FI -> Chicago, IL -> Seattle, WA

Re: Тупой вопрос по MFC

Сообщение Woozy »

А, точно, в MFC вроде ShowWindow ещё есть. Не местные мы, ATL-ные...

Отчего-то мне сдаётся, что MFC "любит" работать с диалогами размещёнными на страницах табов. А в случае диалога - само диалоговое окно и ответственно за отрисовку внутренних контролов. Когда ты кладёшь на таб-страницу просто контролы - то у них вроде как нет чуткого "родителя", что их будет обязательно отрисовывать.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

Мой яд вам, товарищи (это в хорошем смысле, ибо яд, как известно, лекарство).

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 "любит" работать с диалогами размещёнными на страницах табов.
Только так грамотные программисты и делают (работают с диалогами). Ты не сможешь мне привести пример профессионального кода, где б сделано было по другому(при условии большого числа контролов).
Когда ты кладёшь на таб-страницу просто контролы - то у них вроде как нет чуткого "родителя", что их будет обязательно отрисовывать.
Вузи, ещё раз говорю тебе, что непосредственно укладывают контролы «на Таб» – только настоящие профи, которые пишут всё руками, в том числе файлы ресурсов (ну, где про контролы всякая всячина). Да и то – извращенцы, да и то при очень небольшом числе контролов, да и то при незатейлевой обработке сообщений приложения.

Напоследок ещё раз укушу тебя, Вузи. Родитель всё равно будет (если программировать не как серая масса, как все, а тем извратом, что ты предлагаешь). И имя тому родителю будет – табконтрол. И родитель этот, как тебе не покажется странным – ничуть не хуже окна диалога.


ПС.
Горько мне и обидно. А я ведь верил тебе, Вузи.
Woozy
Завсегдатай
Сообщения: 278
Зарегистрирован: 03 мар 2003, 08:55
Откуда: RU->BC->ON->FI -> Chicago, IL -> Seattle, WA

Сообщение Woozy »

vg писал(а):Мой яд вам, товарищи (это в хорошем смысле, ибо яд, как известно, лекарство).
Спасибо, доброхот ты, товарищ vg! :D
Горько мне и обидно. А я ведь верил тебе, Вузи.
:oops: :D Если надо чтоб работало, так оно ж работает, чо критиканствуешь? Да, именно диалоги на страницы табов и кладут, спасибо за подтверждение. Я уже четыре года как не использую MFC, ATL + ещё много всего. Вот приедешь, так и будешь свои порядки тут наводить, самородок ты сибирский. :D
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

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

2) По поводу моего "критиканства" - в некоторой части ты прав.

Вот приедешь, так и будешь свои порядки тут наводить, самородок ты сибирский.
1) Кусаться буду здесь. Я еду из совка, где все, кому не лень по 10 раз на день устанавливают и переустанавливаю "свои порядки", как ты говоришь. Так, что на новые порядки даже не надейся - не будет тебе такого счастья. :twisted:

2) Во-первых "самородок ты сибирский" - ты чего обзываешься? :twisted: Во-вторых, не сибирский, а Магаданский. Слыхал про такой мегаполис?
А вобще...., как ты догадался, что я и есть самородистый самородок? Кстати, надоб об этом промолчать. А то у нас здесь очередная борьба намечается - то ли с утечками мозгов, то ли с протечками мозгов. Вдруг не дадут мне "утечь" . :lol:
Woozy
Завсегдатай
Сообщения: 278
Зарегистрирован: 03 мар 2003, 08:55
Откуда: RU->BC->ON->FI -> Chicago, IL -> Seattle, WA

Сообщение Woozy »

Never mind, vg. :)
Аватара пользователя
Проф. Преображенский
Графоман
Сообщения: 20276
Зарегистрирован: 08 ноя 2006, 11:10

Сообщение Проф. Преображенский »

Дорогой дружок!
Боюсь, что яд мне уже не лекарство... Я уважаю ваш труд в виде многострочного сообщения, но у меня нет времени на подобное, сорри.
Не со всем изложенным я согласен, но просто попробуйте сами разместить диалог на Табконтроле. Сами убедитесь - все работает, кроме упомянутых контролов.
Ваша самоуверенность мне нравится, хотя со временем это пройдет.
Ваш runner
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

runner,
Не со всем изложенным я согласен, но просто попробуйте сами разместить диалог на Табконтроле. Сами убедитесь - все работает, кроме упомянутых контролов.
Программирование Таба - вещь обыденная. Нет, и никогда не было там подводных камней. Пытаться сделать так, как у Вас, чтоб не работало - не интересно. Вам дали совет. Ваше дело воспользоваться, или нет.
Аватара пользователя
Проф. Преображенский
Графоман
Сообщения: 20276
Зарегистрирован: 08 ноя 2006, 11:10

Сообщение Проф. Преображенский »

vg писал(а):runner,
Программирование Таба - вещь обыденная. Нет, и никогда не было там подводных камней. Пытаться сделать так, как у Вас, чтоб не работало - не интересно. Вам дали совет. Ваше дело воспользоваться, или нет.
Упрямый, не считай других глупее себя. Совет мне дал Вузи, ты мне дал яду. %)
Естественно, я посмотрел все, что можно на эту тему. В CodeGuru нашел упоминание моей проблемы, но решения не нашел. Вот освобожусь - тисну туда мессэдж.
А проект у меня непростой - несколько уровней вложенных табов, на которые положены немодальные диалоги, в некоторых запускается видео.
Программирование Таба - простая вещь. Но в МФС много багов и триков. Неинтересно - не смотри. Но не знаешь - не говори.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

Упрямый, не считай других глупее себя.
Между прочим, на этом форуме я задаю вопросы. Поэтому разумеется, что предполагаю большинство здешнего народа, по меньшей мере более опытным. Но уж не глупее - это точно. Разумеется, я считаю Канадских ИТ более грамотными, чем совковых. Пока считаю.
Совет мне дал Вузи, ты мне дал яду. %)
Я дал тебе совет. Ты его не увидил, т.к. первые строки моих предыдущих постов "налили" тебя гневом. Ночь не спал? О моём совете - ниже.
Как говорил незабвенный здешний персонаж - отдохни от кошмаров.
В 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 ничем не лучше принудительной отрисовки контрола. Я его не пробовал (т.к. уже решил проблему), но попробую потом, когда время появится.

А не согласен я с тем, что почему-то ты решил, что проект неправильно построен и из-за этого все неприятности. Однако простая логика доказывает обратное - все остальные контролы ведут себя подобающим образом и только лист и слайдер не хотят появляться сразу, а прорисовываются принудительно.
Аватара пользователя
Marmot
Графоман
Сообщения: 39275
Зарегистрирован: 17 фев 2003, 17:58
Откуда: Caulfeild
Контактная информация:

Сообщение Marmot »

папа Карло писал(а):начинает быть похожим на какието тухлые персональные наезды. завязывайте.
Да ладно, тебе, папа, тухлые наезды придают жизни такой забавный аромат :lol:

ЗЫ
Ты ж таки Карло, а не Иоан-Павел II :-)
Ответить