| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > CDialog - вопрос |
| Автор: maq 28.10.2005, 21:05 |
| Я начинаю изучать VC++ и мне надо диалоговое окно, которое не закрывалось бы при нажатии Enter или Escape. Возможно ли это? Если да, то как? Спасибо. |
| Автор: threef 28.10.2005, 23:12 | ||
| 1.Создай обработчики сообщений IDOK и IDCANCEL 2.Заблокируй CDialog::OnOK() и CDialog::OnCancel() если ты хочешь, чтобы диалог закрывался при нажатии мышом на кнопки OK / CANCEL, то добавь такой вариант:
|
| Автор: Coocky 29.10.2005, 15:26 | ||
Просто перегрузи витруальную фукцию OnOk(); OnCansel() И удали все внутри ее |
| Автор: Dreamer_0x01 31.10.2005, 00:26 |
| Либо можешь ознакомится вот с этой темой, тут тоже похожее обсуждалось. http://forum.vingrad.ru/index.php?showtopic=65475&hl= |
| Автор: kaa 6.11.2005, 00:20 |
| А у меня совсем другая тема... Есть кнопка. С кнопкой связана функция , соответстно, обработки. В этой функции создаётся диалоговое окно и отображается: void CBazaDlg::OnAdd() { CDEdit de; de.Create(IDD_EDIT); de.ShowWindow(SW_SHOW); } ФСЁ! Три долбанные строчки! Но дталог у меня не вылазит... Точнее он вылазит но сразуже убирается, это мелькание заметно только если по кнопке долбить постоянно (чем я собственно со злости и занялся Когда же делаю так: void CBazaDlg::OnAdd() { static CDEdit de; de.Create(IDD_EDIT); de.ShowWindow(SW_SHOW); } ...Очко вылазит. Как я могу судить, своим еще слабоватым умишком, что объект de убивается при выходе из функции. Статический же объект мне нахрен не нужен! Модальное окно в силу некоторых причин использовать тоже низзя! Типа нада как-то работать с переменными окна во время того как оно висит или окно должно работать с переменными родителя, а при модале ничерта ж не выйдет Внимание вопрос! Как сделать так, объект класса не убивался при выходе из функции И в довесок После вызова окна желательно расположить некоторые функции. Так вот, как зделать так, чтобы после создания окна эта тварь не ломилась выполнять функции, а ждала пока окно закроють... понимаю что это уже из области фантастики, но всё же |
| Автор: nikf 6.11.2005, 13:19 | ||||||
|
| Автор: Dreamer_0x01 6.11.2005, 13:48 | ||
Вообще-то, для этих целей и делают модальные окна. Но раз уж тебе не хочется их делать, возмножно вот что сделать. Если у тебя однопоточное приложение, то наверное, лучше так. Действия, которые ты выполняешь после открытия окна, лучше поместить в отдельную функцию. А в обработчике своего окна (которое у тебя CDEdit) перехватить сообщение WM_CLOSE, либо обрабатывать сообщения кнопок, по которым ты закрываешь это окно. И в этом обработчике пошли родителю свое собщение (например, назови его DCE_CLOSEWINDOW, не забыв указать соответствующий define). После этого в том классе, из которого ты открываешь окно, ты должен создать обработчик этого сообщения. И вот туда-то и вставь ту функцию, действия которой ты хочешь выполнять после закрытия окна. И все. Работы - минут на 5, включая время на компиляцию ;) |
| Автор: kaa 6.11.2005, 17:42 |
| nikf Да! Крута! Всё генитальное проста! Да я вчера ходил около этой мысли вокруг да около, а сформулировать так и несмог... Мой вам РЭСПЕКТ |
| Автор: kaa 6.11.2005, 17:56 |
| Уважаемый Dreamer_0x01... Я не волшебник, я еще только учусь и честно говоря ПОСЛАТЬ кому-то я пока неумею... Кстати, теперь функция выглядит так: void CBazaDlg::OnAdd() { pwnd=GetDlgItem(IDC_ADD); pwnd->ModifyStyle(0,WS_DISABLED);//Это чтобы злобный юзер //обработчик этот по //десять раз не вызывал de.Create(IDD_EDIT); de.ShowWindow(SW_SHOW); } Было бы чудно, если бы в диалог я мог передать указатель на родительский класс - тогда можно было бы работать с переменными родича прям из диалога, но... я незнаю как! Так что вот, сижу сейчас и пытаюсь извратиться умом... Кстати а как послать послать сообщение? |
| Автор: kaa 7.11.2005, 20:44 |
| Ладно, ставлю вопрос проще: как послать сообщение родительскому классу? |
| Автор: Dreamer_0x01 9.11.2005, 08:27 | ||||||||||
de.Create(IDD_EDIT,this);
CWnd *wnd=this->GetParent(); wnd->SendMessage(/*см. MSDN*/);
Почему не сделаешь? Еще как сделаешь. В конструктор своего класса (CDEdit) передай указатель на объект, либо структуру, которая будет содержать значения всех нужных тебе переменных. И при закрытии своего окна заполни поля этой структуры. А напоследок уведоми родителя сообщением. Вот например так. (В случе со структурой.) С объектом будет все то же самое. Вот тебе пример.
Как создавать свои сообщения...хм...ладно, напишу. 1. шаг один - уже сделали. определили #define MYMESSAGE WM_USER+1 2. В код своего класса ( CBazaDlg) добавь afx_msg LRESULT OnMyMessage(UINT,LONG); 3. В cpp-файл своего класса добавь
|
| Автор: Guest 9.11.2005, 08:57 |
| Ага... Чичас попробуем... |
| Автор: Dreamer_0x01 9.11.2005, 09:04 |
| Я исправил кое-какие ошибки в коде примера, читай внимательно и главное - старайся вникнуть. Если что - спрашивай. |
| Автор: Guest 10.11.2005, 09:39 |
| Dreamer_0x01 РЕСПЕКТ! Правда я структуру никакую создавать не стал, а прямо в обработчике сообщения перекидываю из диалога кудамне нада |
| Автор: kaa 10.11.2005, 20:17 |
| А вот еще вопрос... И в довесок как всегда: можноли Fle[Grid связать с базой данных, говорят в некоторых гридах это возможно... и ненадо ничего подгружать, тока источник указал и усё... |
| Автор: Coocky 10.11.2005, 22:12 |
| Модератор: Одна тема, один вопрос |
| Автор: Dreamer_0x01 11.11.2005, 17:04 |
| FlexGrid никогда не использовал, по этому поводу ничего не скажу. Но чует мой разум, все дело в стилях. Почитай внимательнее документацию на этот компонент, скорее всего,там все есть. А лучше и вправду отдельную тему подними. |