![]() |
|
|
![]()
|
|
| maq |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 28.10.2005 Репутация: нет Всего: нет |
Я начинаю изучать VC++ и мне надо диалоговое окно, которое не закрывалось бы при нажатии Enter или Escape.
Возможно ли это? Если да, то как? Спасибо. |
|||
|
||||
| threef |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 27.10.2005 Где: Запорожье Репутация: 1 Всего: 10 |
1.Создай обработчики сообщений IDOK и IDCANCEL
2.Заблокируй CDialog::OnOK() и CDialog::OnCancel() если ты хочешь, чтобы диалог закрывался при нажатии мышом на кнопки OK / CANCEL, то добавь такой вариант:
|
|||
|
||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
Просто перегрузи витруальную фукцию OnOk(); OnCansel() И удали все внутри ее -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Либо можешь ознакомится вот с этой темой, тут тоже похожее обсуждалось.
http://forum.vingrad.ru/index.php?showtopic=65475&hl= -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| kaa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 817 Регистрация: 5.11.2005 Репутация: нет Всего: 2 |
А у меня совсем другая тема... Есть кнопка. С кнопкой связана функция , соответстно, обработки. В этой функции создаётся диалоговое окно и отображается:
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 |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 6.6.2005 Где: город-герой Жирно вск Репутация: 1 Всего: 1 |
Это сообщение отредактировал(а) nikf - 6.11.2005, 13:20 |
||||||
|
|||||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Вообще-то, для этих целей и делают модальные окна. Но раз уж тебе не хочется их делать, возмножно вот что сделать. Если у тебя однопоточное приложение, то наверное, лучше так. Действия, которые ты выполняешь после открытия окна, лучше поместить в отдельную функцию. А в обработчике своего окна (которое у тебя CDEdit) перехватить сообщение WM_CLOSE, либо обрабатывать сообщения кнопок, по которым ты закрываешь это окно. И в этом обработчике пошли родителю свое собщение (например, назови его DCE_CLOSEWINDOW, не забыв указать соответствующий define). После этого в том классе, из которого ты открываешь окно, ты должен создать обработчик этого сообщения. И вот туда-то и вставь ту функцию, действия которой ты хочешь выполнять после закрытия окна. И все. Работы - минут на 5, включая время на компиляцию ;) -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| kaa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 817 Регистрация: 5.11.2005 Репутация: нет Всего: 2 |
nikf
Да! Крута! Всё генитальное проста! Да я вчера ходил около этой мысли вокруг да около, а сформулировать так и несмог... Мой вам РЭСПЕКТ |
|||
|
||||
| kaa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 817 Регистрация: 5.11.2005 Репутация: нет Всего: 2 |
Уважаемый Dreamer_0x01... Я не волшебник, я еще только учусь и честно говоря ПОСЛАТЬ кому-то я пока неумею...
Кстати, теперь функция выглядит так: void CBazaDlg::OnAdd() { pwnd=GetDlgItem(IDC_ADD); pwnd->ModifyStyle(0,WS_DISABLED);//Это чтобы злобный юзер //обработчик этот по //десять раз не вызывал de.Create(IDD_EDIT); de.ShowWindow(SW_SHOW); } Было бы чудно, если бы в диалог я мог передать указатель на родительский класс - тогда можно было бы работать с переменными родича прям из диалога, но... я незнаю как! Так что вот, сижу сейчас и пытаюсь извратиться умом... Кстати а как послать послать сообщение? |
|||
|
||||
| kaa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 817 Регистрация: 5.11.2005 Репутация: нет Всего: 2 |
Ладно, ставлю вопрос проще: как послать сообщение родительскому классу?
|
|||
|
||||
| Dreamer_0x01 |
|
||||||||||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
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-файл своего класса добавь
Это сообщение отредактировал(а) Dreamer_0x01 - 9.11.2005, 09:10 -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
||||||||||
|
|||||||||||
| Guest |
|
|||
|
Unregistered |
Ага... Чичас попробуем...
|
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Я исправил кое-какие ошибки в коде примера, читай внимательно и главное - старайся вникнуть.
Если что - спрашивай. -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
Dreamer_0x01
РЕСПЕКТ! Правда я структуру никакую создавать не стал, а прямо в обработчике сообщения перекидываю из диалога кудамне нада |
|||
|
||||
| kaa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 817 Регистрация: 5.11.2005 Репутация: нет Всего: 2 |
А вот еще вопрос...
И в довесок как всегда: можноли Fle[Grid связать с базой данных, говорят в некоторых гридах это возможно... и ненадо ничего подгружать, тока источник указал и усё... |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |