Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Default Button, Как на блоке диалога с одной кнопкой 
:(
    Опции темы
takedo
Дата 26.9.2005, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: нет
Всего: 3



Есть блок диалога с одной единственной кнопкой. Эта кнопка является DefaultButton, несмотря на то, что в свойствах соотвтествующее поле задано false. Мне надо как-то сделать так, чтобы на не нажималась по нажатию клавиши Enter или пробел.. Помогите решить эту проблемку smile


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
takedo
Дата 26.9.2005, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: нет
Всего: 3



пожалуста...


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Dreamer_0x01
Дата 26.9.2005, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Я тоже задумался над этой проблемой, раньше не замечал, но сейчас проверил, то же самое.. smile

Пока что решения этой проблемы не нашел, единственное пока что получилось, если уж так срочно надо - создать "фиктивную кнопку", Убрать ее с поля видимости (например, под какой-то элемент затащить, invisible ее делать нельзя, не получится), и назначить ее как дефоултбаттон. Работает, но сам понимаешь, решение хоть и быстрое, но с точки зрения экономии ресурсов кривое.


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
takedo
Дата 26.9.2005, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: нет
Всего: 3



Dreamer_0x01
блин, а под чё её затащить-то, под мою кнопку штоли? прийдется ручками её таскать на передний план в OnPaint? или !! можно вторую кнопку поместить в регион 0,0,0,0 - наверное прокатит. А кстати в винде и у меня в программе в частности, уж на одну то кнопку можно и раззариться, но это конечно "НЕ НАШ МЕТОД!!!" - ты прав.
А не посоветуешь, чего можно почитать для того, чтобы сесть за программирование твоего 51-го, а то у меня все есть и 51-ые и студия для них, а толку чувствую нет и образование - не копенгаген для процессоров... smile Может просто изучить архитектуру х86???
Посоветуй, пожалуйста.

Добавлено @ 13:03
Блин, кнопка вторая задисебленая ничего не дает! smile
Добавлено @ 13:06
а попробую сейчас ее не дисаблить - наверное получится.


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Dreamer_0x01
Дата 26.9.2005, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



тогда так. Тоже не лучший метод, но работает:

Код

BOOL ТВОЙ_ДИАЛОГ::PreTranslateMessage(MSG* pMsg)
{
    if(pMsg->message==WM_KEYDOWN)
    {
        if (pMsg->wParam&0x0d)return 0;
    }

    return CDialog::PreTranslateMessage(pMsg);
}




--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
takedo
Дата 26.9.2005, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: нет
Всего: 3



а чего такое 0хD? это 00001101 - чего бы это значило ? Идея то понятна вроде, думаешь, что WM_KEYDOWN = 0xD???
Добавлено @ 13:15
И тогда я только мышкой на неё нажать смогу? Тоже вроде идея. счас попробую чего - нибудь такое изображу.


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Dreamer_0x01
Дата 26.9.2005, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Цитата

А не посоветуешь, чего можно почитать для того, чтобы сесть за программирование твоего 51-го, а то у меня все есть и 51-ые и студия для них, а толку чувствую нет и образование - не копенгаген для процессоров...


1. Поставить себе конкретную задачу. То есть что собственно ты хочешь делать.
2. Взять даташит на процессор 51го симейства. Можно старый, но грамотный. Могу кинуть сhm по нашему отечественному процу КМ1815ВЕ51 - это наше исполнение "классики". Все совпадает. Инфа на русском. Базовые операции (работа с основными регистрами) ты сможешь делать.


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
takedo
Дата 26.9.2005, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: нет
Всего: 3



Чего то непойму никак, зачем pMsg->wParam&0xD и тогда return 0?
А если if(pMsg->message&WM_KEYDOWN)return 0 ???
Добавлено @ 13:21
Цитата
1. Поставить себе конкретную задачу. То есть что собственно ты хочешь делать.
2. Взять даташит на процессор 51го симейства. Можно старый, но грамотный. Могу кинуть сhm по нашему отечественному процу КМ1815ВЕ51 - это наше исполнение "классики". Все совпадает. Инфа на русском. Базовые операции (работа с основными регистрами) ты сможешь делать.

Было бы супер!
Только с кнопкой так и не пойму. smile


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Dreamer_0x01
Дата 26.9.2005, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



поправлю:
возвращай 1, потому что по нулю дебаггеру что-то не нравится. А для пробела еще 0x20 добавь.

0x0D - это распространенный символ "возврата каретки". Часто соответствует нажатию энтера.
А для пробела, щас в отладчике посмотрел, генерируется код 0х2. То есть чтобы обе клавиши блокировалось, делай
if ((pMsg->wParam&0x0d)||(pMsg->wParam&0x20))return 1;


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Coocky
Дата 26.9.2005, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



takedo
Я не понял...А что - нажимается?
Ты имеешь ввиду кнопку, которая раньше была "Ок"?


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
takedo
Дата 26.9.2005, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: нет
Всего: 3



да я переприсвоил ей идешник
Добавлено @ 13:25
Dreamer_0x01 Щас попробую, только надо поискать какие-нибудь на них defines


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Coocky
Дата 26.9.2005, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



А как насчет того, что б просто перегрузить виртуальную функцию OnOk() диалога, и просто стереть все внутри ее, т.е. оставить
Код

void CtestDlg::OnOK()

{
    // TODO: Add your specialized code here and/or call the base class
    
    //CDialog::OnOK();
}



--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Dreamer_0x01
Дата 26.9.2005, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Coocky

нет, я у себя тоже такой пример создал - пустое диалоговое окно, с которого убрал ВСЕ кнопки. Создал ЕДИНСТВЕННУЮ кнопку со СВОИМ идинтификатором, отличном от того, что был у старых кнопок.
У нее в FALSE выставил свойство DefaultButton.

И этой кнопке присвоил примитивное действие - MessageBox, например.
Так вот при запуске все равно эта кнопка оказывается "дефолтной".
А ему как японял в эдитах или прочих там штуках по нажатию Энтера не нужно, чтобы действия этой кнопки выполнялись...


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
takedo
Дата 26.9.2005, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: нет
Всего: 3



Dreamer_0x01
Сенку! Теперь по кнопкам не нажимается. Блин, только не понятно как бы с переносимостью то разобраться... Надо не 0xN делать а что-то ведь типа FROMENTER smile Ну да ладно, будет время копну. (мне просто все это на CE или Embedded переносить надо будет).
Добавлено @ 13:34

Coocky Не у меня там выполняется кое-что, да это и не даст ничего. Кнопку то мне вконце концов нажимать надо, а OnOk я вызываю из функции нажатия кнопки. Суть вот в чем: прога работает себе работает, и вот происходит "событие", она на передний план, а в ней эта кнопка. А человек в это время бывало текст набивает в ворде и во всю жмет пробелы, а на кнопку эту надо очень обдумано нажать, нажать и галочку в тетраке нарисовать обязательно (или еще чего, неважно) smile


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Coocky
Дата 26.9.2005, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Цитата(Dreamer_0x01 @ 26.9.2005, 13:09)
Тоже не лучший метод, но работает

Да нормальный метод, я думаю единственный smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
takedo
Дата 26.9.2005, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: нет
Всего: 3



Coocky
Слушай, а за такое достоин дреамер плюса или нет. И вообще за что плюсы дают?


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Dreamer_0x01
Дата 26.9.2005, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



takedo

Главное не быть достойным минуса =)

А про инфу на контроллер кинь мне в приват свой мейл, я вышлю.


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Coocky
Дата 26.9.2005, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Сейчас поставлю smile
Цитата(takedo @ 26.9.2005, 13:51)
И вообще за что плюсы дают?

За помощь, которая помошла тебе справвится с задачей, с которой ты Ну никак не смог справится smile



--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Dreamer_0x01
Дата 26.9.2005, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Coocky

Задачи бываютразными, с которыми ну никак не справиться.
Иногда заходят люди и пишут посты "моя программа не работает, что делать?"
Но это полбеды. Человек с завидной настойчивостью продолжает поднимать этот топи наверх. Приукрашивая сообщения надписями "помогите сессия" или что-то в этом роде.
В результате кидаешь ему бувально три строки из MSDN, после чего он начинает кричать, что ты ему просто несказанно помог, но тогда у него есть следующий не менее важный вопрос, который ему ну просто жить мешает сейчас. Как ты догадался, ответом на этот вопрос будет следующий абзац из той ссылки MSDN, которую минутой назад он читал.

Поэтому я бы сформировал это так - помощь считается помощью, если эта помощь потребовала приложеиня определенных усилий от обоих людей - как "спрашивающего", так и "хелпера".
Либо ответ является хоть и "односложным", но является "красивым" решением проблемы, решение которой с первого взгяда и пользования поиском не напрашивается, словом, ответ на такую вещь, которых нет в поиске, но "которые просто надо помнить".

Кстати, репутацию менять могут люди,у которых более 100 постов. На мой взгляд, это вполне ГРАМОТНЫЙ подхо! Так как люди, написавшие подобное оличество постов, (на собственном примере), уже успевают достаточно хорошо освоиться на форуме, а на первых 30 постах получить большинство ответов вида "см.MSDN", "Это обсуждалось тут", и т.д., то есть они уже сами по себе начинают обсуждать относительно нетривиальные проблемы. Вот затаие уже и не грех плюси поставить.


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Earnest
Дата 26.9.2005, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Чтобы гарантированно отшибить обработку Default Button можно перехватывать сообщение DM_GETDEFID (в диалоге). И возвращать 0.

Цитата
DM_GETDEFID
An application sends a DM_GETDEFID message to retrieve the identifier of the default push button control for a dialog box.

To send this message, call the SendMessage function with the following parameters.

SendMessage(
  (HWND) hWnd,              // handle to destination window
  DM_GETDEFID,              // message to send
  (WPARAM) wParam,          // not used; must be zero
  (LPARAM) lParam          // not used; must be zero
);
Parameters
This message has no parameters.

Return Values
If a default push button exists, the high-order word of the return value contains the value DC_HASDEFID and the low-order word contains the control identifier. Otherwise, the return value is zero.


Конечно, не очень здорово, если при этом кнопка таки будет выглядеть как Default. Можно попробовать в OnInitDialog отшибить у нее стиль DB_DEFPUSGBUTTON. Не уверена, что Windows его не восстановит, но попробовать можно. А может после этого и перехват DM_GETDEFID не понадобится.



--------------------
...
PM   Вверх
Dreamer_0x01
Дата 26.9.2005, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Цитата

Можно попробовать в OnInitDialog отшибить у нее стиль DB_DEFPUSGBUTTON. Не уверена, что Windows его не восстановит


В том-то и дело, что восстанавливает...

Но за инфу по сообщению - спасибо, я не знал, что такое есть.

Это сообщение отредактировал(а) Dreamer_0x01 - 26.9.2005, 15:47


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Earnest
Дата 26.9.2005, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Всегда пожалуйста.
Просьба, если ты или takedo проверите, не поленитесь сообщить результат. А то я только теоретически предполагаю, что это должно работать, а там - кто его этот Windows знает...
Кстати, можно еще попробовать возвращать FALSE из OnInitDialog. Насколько я помню, в этом случае обходится какая-то стандартная инициализация - фокус не ставиться и что-то еще. Может и DefButton не восстановится?

Это сообщение отредактировал(а) Earnest - 26.9.2005, 16:17


--------------------
...
PM   Вверх
Earnest
Дата 26.9.2005, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Продолжение...
Вот что по этому поводу рекомендует Микрософт:

Цитата
How to Disable Default Pushbutton Handling for MFC Dialog

Q122489

--------------------------------------------------------------------------------
The information in this article applies to:

The Microsoft Foundation Classes (MFC), included with:
Microsoft Visual C++ for Windows, 16-bit edition, versions 1.0, 1.5
Microsoft Visual C++, 32-bit Editions, versions 1.0, 2.0, 4.0

--------------------------------------------------------------------------------

SUMMARY
Windows dialog boxes support the use of a default button (pushbutton) that is automatically activated when the ENTER key is pressed while focus is not on a command button. The MFC class library will automatically call the CDialog::OnOK() virtual function for a dialog whenever the default button (pushbutton) is activated by pressing the ENTER key.

This behavior conforms to the guidelines set forth by "The Windows Interface: An Application Design Guide." This manual is included with the Windows version 3.1 SDK documentation. It is also available from Microsoft Press.

MORE INFORMATION
Although default button (pushbutton) support is recommended, you might want to disable or modify the standard implementation in certain situations. You can do this in an MFC application by following these steps:


  • Load the dialog into App Studio and change the OK button identifier from IDOK to something else such as IDC_MYOK. Also, clear the check from Default Button property.

  • Use ClassWizard to create a message handling function for this button named OnClickedMyOK. This function will be executed when a BN_CLICKED message is received from this button.

  • In the code for OnClickedMyOK, call the base class version of the OnOK function. Here is an example:

      void CMyDialog::OnClickedMyOK()
      {
          CDialog::OnOK();
      }

  • Override OnOK for your dialog, and do nothing inside the function. Here is an example:

      void CMyDialog::OnOK()
      {
      }

  • Run the program and bring up the dialog. Give focus to a control other than the OK button. Press the RETURN key. Notice that CDialog::OnOK() is never executed.


This technique effectively disables the standard default button (pushbutton) support in an MFC program. The OK button will continue to behave as before when activated by the mouse or through a mnemonic keystroke, but the ENTER key will not trigger OnOK handling.

This same technique can be used to disable or modify default OnCancel processing. The escape key generates a call to CDialog::OnCancel just as the enter key generates an OnOK function call.


Не сказать, что очень изячно, но зато дешево и сердито...


--------------------
...
PM   Вверх
Dreamer_0x01
Дата 26.9.2005, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Это немножко не то по-моему.
В данной ситуации, например,в моем примере, я закрываю окно стандартной функцией OnOK(),которая в свою очередь вызовет всю цепочку функций, нужных для разрушения окна. Либо посылаю ему мессагу WM_CLOSE. Кстати, как правильнее, я так до сих пор и не понял.
Но в данной задаче как я понял, по нажатию на эту кнопку нам все-таки нужно окно закрыть. Нужно защититься от "нечаянного нажатия",то бишь именно этот pushbutton убрать...
Я этот пример проверил, нифига не отключается, по энтеру мы все равно попадаем в обработчик нажатия кнопки, что в принципе и так ясно.

Далее...

Цитата
Просьба, если ты или takedo проверите, не поленитесь сообщить результат


Проверил. Не так все просто оказалось. Почитав MSDN, можно увидеть, что событие это (DM_GETDEFID)надо ловить функцией DefDlgProc. Но FMC-варанта этой функции нет!
А функции WindowProc, DefWindowProc и PreTranslateMessage не ловят это сообщение, я проверял!


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Earnest
Дата 27.9.2005, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Любое сообщение, которое в принципе приходит окну, можно поймать.

Конечно, соответствующих MFC-аналогов может и не быть. В этом случае просто пишешь стандартный обработчик:
Код

LONG OnXXXMessage(WPARAM,LPARAM); 

И добавляешь его в карту сообщений:
Код

ON_MESSAGE(WM_XXX,OnXXXMessage)

Можно еще использовать макрос ON_MESSAGE_VOID - если параметров и возвращаемого значения нет. Тогда обработчик должен иметь другую сигнатуру:
Код

void OnXXXMessage();

Добавлено @ 09:14
Еще:
Цитата(Dreamer_0x01 @ 26.9.2005, 17:43)
Либо посылаю ему мессагу WM_CLOSE. Кстати, как правильнее, я так до сих пор и не понял.

Чтобы закрыть модальный диалог, нужно вызвать EndDialog(Result), где Result =IDOK или IDCANCEL, или что хочешь. Это будет именно то значение, которое вернет вызов CDialog::DoModal. Вызывать EndDialog можно из любого обработчика. Стандартный OnOk всего лишь вызывает UpdateData, а потом EndDialog.


--------------------
...
PM   Вверх
takedo
Дата 27.9.2005, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: нет
Всего: 3



На счет плюсов: способ, предложенный Dreamer 0x01 как раз и есть на мой взгляд достаточно нетривиальный! Я даже и подумать не мог, что можно так завернуть! А все другие, так сказать стандартные, выглядели криво и зачастую не удовлетворяли требованию: защититься от случайного, необдуманного закрытия диалога! так что могу сказать, что у Dreamera 0x01 "котелок" варит неординарно и мне он помог. Спасибо. smile


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Dreamer_0x01
Дата 27.9.2005, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Earnest
Цитата(Earnest @ 27.9.2005, 09:09)
Любое сообщение, которое в принципе приходит окну, можно поймать.


Важно, что к кому приходит и где ловить. Про данное сообщение я что-то вообще не понимаю, кто же и кому его посылает.
В данном случае эти макросы его не ловят, только что проверил.

И вообще, это какое-то странное сообщение, у меня студия говорит, что это
#define DM_GETDEFED WM_USER+1

нахрена они его в пользовательские дефайны отнесли?

Цитата(Earnest @ 27.9.2005, 09:09)
Чтобы закрыть модальный диалог, нужно вызвать EndDialog(Result)


а вот за это спасибо. А то я извращался....

Это сообщение отредактировал(а) Dreamer_0x01 - 27.9.2005, 19:25


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Earnest
Дата 28.9.2005, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Я тоже только что проверила - приходит, как миленькое.
Значит, не так ловишь.

Сообщение DM_GETDEFID среда посылает диалогу, когда пытается транслировать нажатие ENTER, из функции IsDialogMessage. Последняя вызывается, кажется, из PreTranslateMessage. Так что ловить сообщение нужно в диалоге.
Еще раз:

Код

class CMyDialog: public CDialog
{
   DECLARE_MESSAGE_MAP()
   ...
private:
   afx_msg LONG OnGetDefID(WPARAM,LPARAM);
};

BEGIN_MESSAGE_MAP(CMyDialog,CDialog)
   ...
   ON_MESSAGE(DM_GETDEFID,OnGetDefID)
END_MESSAGE_MAP()


LONG CMyDialog::OnGetDefID(WPARAM,LPARAM)
{
   return CWnd::Default();
}


Для рассматриваемой задачи нужно возвращать 0.




--------------------
...
PM   Вверх
Dreamer_0x01
Дата 28.9.2005, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Цитата(Earnest @ 28.9.2005, 17:44)
Я тоже только что проверила - приходит, как миленькое.
Значит, не так ловишь.


Да нет, ловлю так, и код у меня в общем-то такой же как и у вас.

Но я понял, почему у меня не ловится, а у вас ловится.

Я включил у себя снова у кнопки свойство "DefualtBatton", и у меня оно тоже стало ловиться. Причем в момент инициализации диалого. Но что угодно возвращай - хоть ноль, хоть не ноль - при нажатии энтера это сообщение вновь не вызывается. Поэтому его обработка в данной ситуации не момогает.
При выключенном же свойстве "DefualtButton" оно даже в момент инициализации не приходит вообще.


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Earnest
Дата 28.9.2005, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Странно...
У меня это сообщение приходит в любом случае, стоит DeafultButton или нет. Кроме того, приходит не один раз, а сначала при инициализации, а потом при каждом нажатии любой клавиши... Правда, возврат нуля действительно не помогает smile

Зато помогло другое !!! smile
Возвращаем из OnGetDefID не 0, а совершенно левый идентификатор (которого нет в вашем диалоге). Вот так:

Код

LONG CMyDialog::OnGetDefID(WPARAM,LPARAM)
{
   return MAKELONG(999,DC_HASDEFID);
}


Все! Жирной кнопки нет, по ENTER диалог не закрывается.



--------------------
...
PM   Вверх
Dreamer_0x01
Дата 28.9.2005, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



могу выслать проект, если не веришь.
Кстати - в какой студии работаешь? 7 ? или 6 ?


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Earnest
Дата 28.9.2005, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Почему же не верю?
Просто у меня все получилось, как я написала.
Встроила этот код в один из диалогов рабочего приложения... у меня там 2 кнопки и еще несколько полей...
Сейчас сижу в 7-й студии, но и с 6-й по-моему должно быть все тоже самое.
Кстати, ты PreTranslateMessage случайно не переопределяешь?
Добавлено @ 19:30
С одной кнопкой тоже работает. Только надо, чтобы фокус на ней не стоял изначально. Когда фокус переходит на эту кнопку (по TAB, например), то по ENTER она, конечно, срабатывает...


--------------------
...
PM   Вверх
Earnest
Дата 28.9.2005, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Выкинула все активные поля из диалога, оставила только рамку и статик + 1 кнопка. Все равно работает... в смысле по ENTER не закрывается и жирноты нет smile


--------------------
...
PM   Вверх
Dreamer_0x01
Дата 28.9.2005, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Цитата(Earnest @ 28.9.2005, 19:23)
Кстати, ты PreTranslateMessage случайно не переопределяешь?

переопределяю, но для данного теста я в нем весь свой код комментирую.


Цитата(Earnest @ 28.9.2005, 19:23)
Сейчас сижу в 7-й студии

и я.



Цитата(Earnest @ 28.9.2005, 19:23)
у меня там 2 кнопки и еще несколько полей...


у меня единственный элемент в окне - только одна кнопка. И все, больше ничего. Специально для чистоты эксперимента создал отдельный тестовый проектик.



Цитата(Earnest @ 28.9.2005, 19:23)
С одной кнопкой тоже работает. Только надо, чтобы фокус на ней не стоял изначально. Когда фокус переходит на эту кнопку (по TAB, например), то по ENTER она, конечно, срабатывает...


это не выход. Если в проекте только одна кнопка,как у меня - то можно убрать с нее фокус, свойство DefualtButton и взвать SetDefID() c совсем левым номером, тогда действительно при запуске фокуса на кнопке не будет.
Но если сделать ALT+TAB, переклюившись на другое приложение, а потом снова венуться - винда уже и фокус на нее поставит, и рамочку DefaultButton сделает ей.

Добавлено @ 19:50
Цитата(Earnest @ 28.9.2005, 19:42)
оставила только рамку и статик + 1 кнопка

а если без статика?




--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Earnest
Дата 28.9.2005, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



smile
А у меня и после переключения все остается в силе... Т.е. фокус ставится, но не Default, и по ENTER не закрывается. В диалоге 1 кнопка + 1 статик. Должно же там что-то быть написано для пользователя?

Цитата(Dreamer_0x01 @ 28.9.2005, 19:43)
и взвать SetDefID() c совсем левым номером,

Я не зову SetDefID. Все, что делается - это перехват DM_GETDEFID и возврат в нем 999+DC_HASDEFAULT.

Добавлено @ 19:56
И без статика тоже, одна голая кнопка OK. Фокус есть, дефолта нет.



--------------------
...
PM   Вверх
Dreamer_0x01
Дата 28.9.2005, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



ну вообще странно. Не знаю,почем у меня не ловится это сообщение...


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Earnest
Дата 30.9.2005, 07:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(Dreamer_0x01 @ 28.9.2005, 19:43)
Цитата (Earnest @ 28.9.2005, 19:23)
Кстати, ты PreTranslateMessage случайно не переопределяешь?
переопределяю, но для данного теста я в нем весь свой код комментирую.


A "return FALSE" есть? Код - фигня, главное, чтобы FALSE возвращался.
Добавлено @ 07:37
Если не это, тогда есть другое предположение - может, твой диалог - единственное окно в диалоговом приложении? Это я не проверяла, т.к. вполне бессмысленная задача.
Если нет, шли проект, мне тоже интересно.


--------------------
...
PM   Вверх
Dreamer_0x01
Дата 30.9.2005, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Цитата(Earnest @ 30.9.2005, 07:33)
твой диалог - единственное окно в диалоговом приложении?


Да!!!!
Я же писал - специаьлно создал минимальный проект для чистоты эксперимента!


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Earnest
Дата 30.9.2005, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Все, все, уел smile
Действительно, если диалог - единственное окно, то после переключения на другое приложение и возвращения, дефолт нагло появляется, никого не спрашивая. Видимо, с этим можно побороться, помудрив с WM_ACTIVATE.
Но, в общем, не очень хочется: согласись, задача-то стояла показать сообщение в каком-то приложении. Кому может понадобится приложение, состоящее из одного message-box'а?


--------------------
...
PM   Вверх
Dreamer_0x01
Дата 30.9.2005, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Earnest

Цитата(Earnest @ 30.9.2005, 16:06)
задача-то стояла показать сообщение в каком-то приложении

Задача изначально вобще была просто избавиться от случайного нажатия кнопки, ее уже давно решили =)
Здесь же просто из-за любознательности обсуждение пошло. Но это никогда не вредно.
Так что исходя из этого проверь еще одну вещь - включи у кнопки DefaultButton и увидишь, что это сообщение приходит только один раз, при инициализации.
А отключишь - вообще не прийдет!



--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Earnest
Дата 30.9.2005, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Хм..., действительно, если отключить Default у кнопки, то сообщение не приходит.
А вот при включенном приходит как при инициализации, так и при нажатии на клавиши - правда только до перехода в другое приложение и возвращения, после этого - как не твое окно. Похоже, в этом случае Windows где-то химичит и вызывает DefDlgProc в обход оконной процедуры...

Странно также, что если переключение происходит в отладчик (в OnGetDefID точка прерывания стоит), то это вроде не считается... после F5 опять нет Default'а.
Все чудесатее и чудесатее smile


--------------------
...
PM   Вверх
Dreamer_0x01
Дата 30.9.2005, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Ага,наглючили товарищи в Microsoft, видимо...


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0933 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.