![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Brodyaga |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 599 Регистрация: 19.1.2008 Репутация: нет Всего: 2 |
Всем доброго времени суток!
Есть два диалога: CMyDialog(на котормо лежит дерево) и CMyDialog2(который нужно показывать). Хочу создать и отобразить диалог по щелчку на определённом Item'е дерева. Делаю так:
При этом диалог появляется, но только ПОД диалогом на котором располагается дерево. Почему так? Подозреваю, что это изза того, что на форме с деревом происхзодят какието телодвижения, возможно перерисовка выделенноо Item'а или ещё что и поэтому она снова показывается на экране.. Как мне обойти это и нормально отобразить по щелчку на Item'е дерева другой диалог? |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
А тебе действительно нужно немодальный диалог показывать? За ним следить надо... (т.е. за его жизнью)... А если пользователь еще раз кликнет по дереву? В общем, если можно обойтись модальным, то будет проще - никуда он не спрячется. Если нет... можно попробовать проследить, когда он вниз прячется... или добавить ему стиль "всегда сверху".
-------------------- ... |
|||
|
||||
| Brodyaga |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 599 Регистрация: 19.1.2008 Репутация: нет Всего: 2 |
А как проследить?
Это какой стиль? WS_EX_TOPMOST? WS_EX_TOPMOST не помогло, SetWindowPos относительно pMyDialog тоже :(... Это сообщение отредактировал(а) Brodyaga - 20.4.2010, 17:05 |
||||
|
|||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
SetWindowPos не помогло, скорее всего, потому, что, как ты вначале и предположил, что-то происходит после выхода из обработчика сообщения, а SetWindwoPos ты делаешь в нем, что излишне, т.к. диалог наверняка именно так и создается...
Как проследить - да просто: написать обработчик OnWindowPosChanged и поставить там точку прерывания, лучше в условии, проверяющем изменение Z-order). А потом посмотреть, кто этот гад. В каком диалоге это делать - сложно сказать, я бы начала с главного: похоже его что-то наверх вытаскивает. EX_TOPMOST - это просто создание на самом верху, насколько я помню, но ничего не гарантируется насчет последующей жизни. Кажется, был какой-то стиль, который "всегда сверху", но точно не помню. Перенесу-ка я твою тему в ВинАПИ, там народу больше, а вопрос оcобой связи с MFC не имеет, мне кажется... -------------------- ... |
|||
|
||||
| Brodyaga |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 599 Регистрация: 19.1.2008 Репутация: нет Всего: 2 |
Параметр структуры WINDOWPOS hwndInsertAfter обработчика OnWindowPosChanged первого диалога всегда равен NULL, но этот обработчик после отображения второго диалога вызывается. Как посмотреть то, кто меняет расположение? |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
c Z-order'ом лучше не брейкпойнтами работать, а сообщениями MessageBox,
иначе этим гадом может оказаться сама vs Добавлено через 1 минуту и 14 секунд а еще лучше репортами _RPTx -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Brodyaga |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 599 Регистрация: 19.1.2008 Репутация: нет Всего: 2 |
Это как? никогда не пользовался этим..
|
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
эта консоль по умолчанию открывается при запуске программы из vs, так что можно ее просто на задний план программы переместить и спокойно наблюдать за происходящим -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Brodyaga |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 599 Регистрация: 19.1.2008 Репутация: нет Всего: 2 |
мм... забыл сказать. WinMobile6
|
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
ну тогда влоб: диалогу, который нужно при нажатии на итем показать, надо выставить стиль WS_POPUP, при этом, надо ему указать родителя(владельца) первый диалог, на котором эти итемы и расположены Добавлено через 3 минуты и 51 секунду на простых окнах это было бы так:
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Brodyaga |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 599 Регистрация: 19.1.2008 Репутация: нет Всего: 2 |
Вот какие стили стоят у этого диалога в ресурсном файле:
STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU Родителем был другой диалог, поставил тот на котором Item'ы по которым производится щелчок. Не помогло :( |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
GremlinProg, я советовала брейк-пойнты, чтобы стек вызовов посмотреть. Отладочная печать тут нифига не поможет.
Brodyaga, флаги надо проверять (что нет NoZORDER или как-то так). Но насчет WinMobil я пас - ничего не могу сказать, не сталкивалась. Ну разве что посоветовать применить грубую силу, т.е. не разбираться в причинах, а просто, скажем, на Idle вытаскивать диалог наверх. Конечно, могут быть моргания, и вообще это "последнее" средство. Ну, на крайний случай. -------------------- ... |
|||
|
||||
| Brodyaga |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 599 Регистрация: 19.1.2008 Репутация: нет Всего: 2 |
Проверять в какой момент? Может окно снова отображается потому что TVN_SELCHANGED является уведомляющим, отражающим сообщением, которое затем снова возвращается дереву, а то его обрабатывает? |
|||
|
||||
| Earnest |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Проверять вместо этого, чтобы точку прерывания поставить. Как GremlinProg написал:
Но, как я уже говорила, отладочная печать ничего не даст (в смысле поиска причины). Попробуй туда бейк-пойнт поставить и посмотреть стек. Нет, ничего никуда не возвращается. Если ты имеешь в виду Message Reflection, так у тебя не тот случай - уведомление обрабатывает диалог, который его и получает. Да и reflection никак на отображение не влияет. Окно всплывает, если оно само или какой-то его элемент получают фокус. Тут может быть, например, такая история. Скажем, selChanged является следствием LBUTTONDOWN, а потом приходит еще и UP, на который тоже что-то делается.... типа того. -------------------- ... |
||||
|
|||||
| Brodyaga |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 599 Регистрация: 19.1.2008 Репутация: нет Всего: 2 |
Сделал так.
В событии OnTvnSelchangedTree1 перед показом оконной процедуры подменил оконную процедуру дерева и стал уже смотреть чтоже туда приходит. А приходит туда много сообщений. Определил что окно всплывает изза сообщения WM_KILLFOCUS. Стал его отбивать:
И всё стало ок, на экран показывается второй диалог, а первый не всплывает. Но вот кто посылает это сообщение (или зачем) не понятно, по стеку не разобрать, по полученному из WPARAM HWND тоже не могу понять что за окно получает фокус (hwnd из WPARAM не равен hwnd диалога на котором лежит дерево). Может кто знает? |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |