![]() |
|
|
![]()
|
|
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: нет Всего: 3 |
Coocky
Слушай, а за такое достоин дреамер плюса или нет. И вообще за что плюсы дают? -------------------- я не гольфист - я хоккеист |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
takedo
Главное не быть достойным минуса =) А про инфу на контроллер кинь мне в приват свой мейл, я вышлю. -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
Сейчас поставлю
За помощь, которая помошла тебе справвится с задачей, с которой ты Ну никак не смог справится -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Coocky
Задачи бываютразными, с которыми ну никак не справиться. Иногда заходят люди и пишут посты "моя программа не работает, что делать?" Но это полбеды. Человек с завидной настойчивостью продолжает поднимать этот топи наверх. Приукрашивая сообщения надписями "помогите сессия" или что-то в этом роде. В результате кидаешь ему бувально три строки из MSDN, после чего он начинает кричать, что ты ему просто несказанно помог, но тогда у него есть следующий не менее важный вопрос, который ему ну просто жить мешает сейчас. Как ты догадался, ответом на этот вопрос будет следующий абзац из той ссылки MSDN, которую минутой назад он читал. Поэтому я бы сформировал это так - помощь считается помощью, если эта помощь потребовала приложеиня определенных усилий от обоих людей - как "спрашивающего", так и "хелпера". Либо ответ является хоть и "односложным", но является "красивым" решением проблемы, решение которой с первого взгяда и пользования поиском не напрашивается, словом, ответ на такую вещь, которых нет в поиске, но "которые просто надо помнить". Кстати, репутацию менять могут люди,у которых более 100 постов. На мой взгляд, это вполне ГРАМОТНЫЙ подхо! Так как люди, написавшие подобное оличество постов, (на собственном примере), уже успевают достаточно хорошо освоиться на форуме, а на первых 30 постах получить большинство ответов вида "см.MSDN", "Это обсуждалось тут", и т.д., то есть они уже сами по себе начинают обсуждать относительно нетривиальные проблемы. Вот затаие уже и не грех плюси поставить. -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Чтобы гарантированно отшибить обработку Default Button можно перехватывать сообщение DM_GETDEFID (в диалоге). И возвращать 0.
Конечно, не очень здорово, если при этом кнопка таки будет выглядеть как Default. Можно попробовать в OnInitDialog отшибить у нее стиль DB_DEFPUSGBUTTON. Не уверена, что Windows его не восстановит, но попробовать можно. А может после этого и перехват DM_GETDEFID не понадобится. -------------------- ... |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
В том-то и дело, что восстанавливает... Но за инфу по сообщению - спасибо, я не знал, что такое есть. Это сообщение отредактировал(а) Dreamer_0x01 - 26.9.2005, 15:47 -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Всегда пожалуйста.
Просьба, если ты или takedo проверите, не поленитесь сообщить результат. А то я только теоретически предполагаю, что это должно работать, а там - кто его этот Windows знает... Кстати, можно еще попробовать возвращать FALSE из OnInitDialog. Насколько я помню, в этом случае обходится какая-то стандартная инициализация - фокус не ставиться и что-то еще. Может и DefButton не восстановится? Это сообщение отредактировал(а) Earnest - 26.9.2005, 16:17 -------------------- ... |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Продолжение...
Вот что по этому поводу рекомендует Микрософт:
Не сказать, что очень изячно, но зато дешево и сердито... -------------------- ... |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Это немножко не то по-моему.
В данной ситуации, например,в моем примере, я закрываю окно стандартной функцией OnOK(),которая в свою очередь вызовет всю цепочку функций, нужных для разрушения окна. Либо посылаю ему мессагу WM_CLOSE. Кстати, как правильнее, я так до сих пор и не понял. Но в данной задаче как я понял, по нажатию на эту кнопку нам все-таки нужно окно закрыть. Нужно защититься от "нечаянного нажатия",то бишь именно этот pushbutton убрать... Я этот пример проверил, нифига не отключается, по энтеру мы все равно попадаем в обработчик нажатия кнопки, что в принципе и так ясно. Далее...
Проверил. Не так все просто оказалось. Почитав MSDN, можно увидеть, что событие это (DM_GETDEFID)надо ловить функцией DefDlgProc. Но FMC-варанта этой функции нет! А функции WindowProc, DefWindowProc и PreTranslateMessage не ловят это сообщение, я проверял! -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| Earnest |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Любое сообщение, которое в принципе приходит окну, можно поймать.
Конечно, соответствующих MFC-аналогов может и не быть. В этом случае просто пишешь стандартный обработчик:
И добавляешь его в карту сообщений:
Можно еще использовать макрос ON_MESSAGE_VOID - если параметров и возвращаемого значения нет. Тогда обработчик должен иметь другую сигнатуру:
Добавлено @ 09:14 Еще:
Чтобы закрыть модальный диалог, нужно вызвать EndDialog(Result), где Result =IDOK или IDCANCEL, или что хочешь. Это будет именно то значение, которое вернет вызов CDialog::DoModal. Вызывать EndDialog можно из любого обработчика. Стандартный OnOk всего лишь вызывает UpdateData, а потом EndDialog. -------------------- ... |
||||||||
|
|||||||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: нет Всего: 3 |
На счет плюсов: способ, предложенный Dreamer 0x01 как раз и есть на мой взгляд достаточно нетривиальный! Я даже и подумать не мог, что можно так завернуть! А все другие, так сказать стандартные, выглядели криво и зачастую не удовлетворяли требованию: защититься от случайного, необдуманного закрытия диалога! так что могу сказать, что у Dreamera 0x01 "котелок" варит неординарно и мне он помог. Спасибо.
-------------------- я не гольфист - я хоккеист |
|||
|
||||
| Dreamer_0x01 |
|
||||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Earnest
Важно, что к кому приходит и где ловить. Про данное сообщение я что-то вообще не понимаю, кто же и кому его посылает. В данном случае эти макросы его не ловят, только что проверил. И вообще, это какое-то странное сообщение, у меня студия говорит, что это #define DM_GETDEFED WM_USER+1 нахрена они его в пользовательские дефайны отнесли?
а вот за это спасибо. А то я извращался.... Это сообщение отредактировал(а) Dreamer_0x01 - 27.9.2005, 19:25 -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
||||
|
|||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Я тоже только что проверила - приходит, как миленькое.
Значит, не так ловишь. Сообщение DM_GETDEFID среда посылает диалогу, когда пытается транслировать нажатие ENTER, из функции IsDialogMessage. Последняя вызывается, кажется, из PreTranslateMessage. Так что ловить сообщение нужно в диалоге. Еще раз:
Для рассматриваемой задачи нужно возвращать 0. -------------------- ... |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Да нет, ловлю так, и код у меня в общем-то такой же как и у вас. Но я понял, почему у меня не ловится, а у вас ловится. Я включил у себя снова у кнопки свойство "DefualtBatton", и у меня оно тоже стало ловиться. Причем в момент инициализации диалого. Но что угодно возвращай - хоть ноль, хоть не ноль - при нажатии энтера это сообщение вновь не вызывается. Поэтому его обработка в данной ситуации не момогает. При выключенном же свойстве "DefualtButton" оно даже в момент инициализации не приходит вообще. -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Странно...
У меня это сообщение приходит в любом случае, стоит DeafultButton или нет. Кроме того, приходит не один раз, а сначала при инициализации, а потом при каждом нажатии любой клавиши... Правда, возврат нуля действительно не помогает Зато помогло другое !!! Возвращаем из OnGetDefID не 0, а совершенно левый идентификатор (которого нет в вашем диалоге). Вот так:
Все! Жирной кнопки нет, по ENTER диалог не закрывается. -------------------- ... |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |