|
|
|
GetNextDlgTabItem вешает Win98
|
|||
|---|---|---|---|
|
#18+
Имеется немодальный диалог WTL. В нем композитный контрол. Для обеспечения "диалоговости": Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Нажимаю TAB и когда дело доходит до функции АПИ GetNextDlgTabItem в методе: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Win98 вешается. Кто-нибудь знает почему и как с этим бороться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2004, 22:35 |
|
||
|
GetNextDlgTabItem вешает Win98
|
|||
|---|---|---|---|
|
#18+
А в не 98 вешается? GetNextDlgTabItem работает рекурсивно(может тут вся фигня и кроется?). Попробуй для проверки сделать диалог без композитных контролов. И ещё в дебаге, перед тем, как делать шаг на GetNextDlgTabItem, попробуй повешать брекпоинт на обработчик сообщений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2004, 07:46 |
|
||
|
GetNextDlgTabItem вешает Win98
|
|||
|---|---|---|---|
|
#18+
Совершенно верно - в 2000/XP все работает. Еще одно наблюдение: если в диалоговом ресурсе композитный контрол занимает 1-ое место (Ctrl-D) в TAB order'е - Win98 вешается. Если любой другой контрол (например невидимый статик без таб-стопа) - не вешается. Т.е. в принципе релиз мы сделаем :-), но ведь хочется понять почему... Ставлю брекпойнты в цикл выборки сообщений и в оконную процедуру самого композита - не срабатывает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2004, 14:40 |
|
||
|
GetNextDlgTabItem вешает Win98
|
|||
|---|---|---|---|
|
#18+
Да, интересно... Может виндовский баг. А и правда. Точнее не совсем баг. Нашёл я похожую ситуацию. Надо поставить в OnInitDialog() для диалога флаг WS_EX_CONTROLPARENT композитному контролу. Проблема в том, что по табу образуется цикл поиска контрола. Код находит композитный контрол и пытается залесть внутрь дабы искать дальше. Внутрь он зайти не может, так как соответствующего стиля у копм.контрола нету. Вот якобы поэтому и не может завершится цикл (висюк). Не ясно только почему, если первый не композитный, потом на композитном не виснет?... Кстати, как оно себя ведёт? Идёт табом по детям композитного контрола или по детям диалога? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2004, 15:02 |
|
||
|
GetNextDlgTabItem вешает Win98
|
|||
|---|---|---|---|
|
#18+
CEMb Да, интересно... Может виндовский баг. Запросто. Их много. Меня смущает что я не могу найти описания этой ситуации в MSDN Knowledge base. CEMb Надо поставить в OnInitDialog() для диалога флаг WS_EX_CONTROLPARENT композитному контролу. Проблема в том, что по табу образуется цикл поиска контрола. Код находит композитный контрол и пытается залесть внутрь дабы искать дальше. Внутрь он зайти не может, так как соответствующего стиля у копм.контрола нету. Вот якобы поэтому и не может завершится цикл (висюк). Стиль WS_EX_CONTROLPARENT композитному контролу ставится. Иначе не работало бы везде. Т.е. по теории системная функция сможет залезть внутрь композита и найти следующий Tab-stop контрол. Что собственно и происходит на 2000/XP всегда и на 98 когда композит не первый. CEMb Не ясно только почему, если первый не композитный, потом на композитном не виснет?... Кстати, как оно себя ведёт? Идёт табом по детям композитного контрола или по детям диалога? Если композит первый - все виснет. Если нет - идет по детям композита, т.е. делает то что нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2004, 16:13 |
|
||
|
GetNextDlgTabItem вешает Win98
|
|||
|---|---|---|---|
|
#18+
andreyk@Еще одно наблюдение: если в диалоговом ресурсе композитный контрол занимает 1-ое место (Ctrl-D) в TAB order'е - Win98 вешается. Если любой другой контрол (например невидимый статик без таб-стопа) - не вешается. Т.е. в принципе релиз мы сделаем :-), но ведь хочется понять почему... Прошу прощения - не четко выразился: в диалоговом ресурсе композитного контрола другой, вложенный композитный контрол занимает 1-ое место. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2004, 19:36 |
|
||
|
GetNextDlgTabItem вешает Win98
|
|||
|---|---|---|---|
|
#18+
Такая ситуация встречается постоянно там, где в композитном контроле есть кнопки (они же чек-боксы или радио-боксы), причем, во всех виндах, не только в 98-х или 95-х. Еще такая же ситуевина бывает при использовании вложенных PropertySheet. Думаю, винды здесь не при чем, т.к. при создании подобных "матрешек" из окон методами голого API ничего подобного не происходит, а вот ежели MFC или ATL запускают свои волшебные PretranslateMessage или PreTranslateAccelerator ... А на самом деле проблема в IsDialogMessage , который опрашивает все child-контролы у требуемого путем посылки сообщения WM_GETDLGCODE (блин, на вскидку не помню точное название, поправьте), а приход каждого сообщения в некоторое окно оборачивается запуском PretranslateMessage в каждом из его парентов, и т.д. до бесконечности... Здесь и виснем, т.е. не виснем, а даем бесконечный вызов взаимных виндовых сообщений м/у окошками - можно в Spy++ посмотреть. В общем, я с такими (довольно частыми проблемами) боролся с помощью игр со стилями окон, или даже принудительным перехватом IsDialogMessage для некоторых контролов и выдачи некоторого непосредственного результата для них. В одном из довольно сложных проектов до того заколебался решать подобные неурядицы "по-месту", что написал свою ф-ию аналог IsDialogMessage, правда, пришлось нехило разворотить большинство базовых классов MFC и насоздавать свои промежуточные базовые классы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2004, 02:27 |
|
||
|
GetNextDlgTabItem вешает Win98
|
|||
|---|---|---|---|
|
#18+
авторпри использовании вложенных PropertySheet. - как раз пример бага для пропертишита нашёл... авторВ одном из довольно сложных проектов до того заколебался решать подобные неурядицы "по-месту", что написал свою ф-ию аналог IsDialogMessage, правда, пришлось нехило разворотить большинство базовых классов MFC и насоздавать свои промежуточные базовые классы. Крут! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2004, 08:11 |
|
||
|
GetNextDlgTabItem вешает Win98
|
|||
|---|---|---|---|
|
#18+
vdimas Такая ситуация встречается постоянно там, где в композитном контроле есть кнопки (они же чек-боксы или радио-боксы), причем, во всех виндах, не только в 98-х или 95-х. Еще такая же ситуевина бывает при использовании вложенных PropertySheet. нет наличие/отсутствие кнопок не влияет. vdimas Думаю, винды здесь не при чем, т.к. при создании подобных "матрешек" из окон методами голого API ничего подобного не происходит, а вот ежели MFC или ATL запускают свои волшебные PretranslateMessage или PreTranslateAccelerator... винды причем, потому что на 2000 работает, а на 98 нет. Но проблема действительно в PreTranslateMessage. vdimas А на самом деле проблема в IsDialogMessage, который опрашивает все child-контролы у требуемого путем посылки сообщения WM_GETDLGCODE (блин, на вскидку не помню точное название, поправьте), а приход каждого сообщения в некоторое окно оборачивается запуском PretranslateMessage в каждом из его парентов, и т.д. до бесконечности... Здесь и виснем, т.е. не виснем, а даем бесконечный вызов взаимных виндовых сообщений м/у окошками - можно в Spy++ посмотреть. WM_GETDLGCODE send'ится, а не post'ится. Так что никакого рекурсивного вызова PreTranslateMessage не будет. Опять же, бесконечная рекурсия штука одинаково вредная для любых виндов. В нашем случае проблема имеет место быть только для Win98. vdimas В общем, я с такими (довольно частыми проблемами) боролся с помощью игр со стилями окон, или даже принудительным перехватом IsDialogMessage для некоторых контролов и выдачи некоторого непосредственного результата для них. В одном из довольно сложных проектов до того заколебался решать подобные неурядицы "по-месту", что написал свою ф-ию аналог IsDialogMessage, правда, пришлось нехило разворотить большинство базовых классов MFC и насоздавать свои промежуточные базовые классы. Нет Дима, руководство такие маневры не одобрит :-) Заходи в гости, посмотришь своими глазами, может чего и получится. Пива по любому попьем, в старкрафт поиграем... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2004, 20:50 |
|
||
|
GetNextDlgTabItem вешает Win98
|
|||
|---|---|---|---|
|
#18+
нет наличие/отсутствие кнопок не влияет. хм, в моих случаях кнопки были определяющими :) стоило из задизейблить - все работало :) винды причем, потому что на 2000 работает, а на 98 нет. Но проблема действительно в PreTranslateMessage. Это конкретный случай причем, а так - постоянно сталкивался на вообще всех виндах вплоть до XP WM_GETDLGCODE send'ится, а не post'ится. Точно... А если не секрет - Spy++ что показывает? Заходи в гости, посмотришь своими глазами, может чего и получится. Пива по любому попьем, в старкрафт поиграем... Угу, в пятницу так и сделаю, а пока давай лог SPY на сообщения виндов на этот тред... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2004, 03:50 |
|
||
|
GetNextDlgTabItem вешает Win98
|
|||
|---|---|---|---|
|
#18+
Зависание происходит в функции GetNextDlgTabItem. На ХР в этой функции никаких сообщений Spy не регистрирует. До нее и после нее WM_GETDLGCODE. На Win98 увидеть лог Spy'а не представляется возможным, т.к. при отладке система зависает летально :-) Похоже что просто в 98 цикл поиска следующего контрола в таб порядке написан криво и происходит зацикливание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2004, 12:45 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=32373830&tid=2035534]: |
0ms |
get settings: |
6ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
65ms |
get topic data: |
13ms |
get forum data: |
4ms |
get page messages: |
69ms |
get tp. blocked users: |
2ms |
| others: | 237ms |
| total: | 422ms |

| 0 / 0 |
