Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CDialog - вопрос, не должно закрываться при Enter/Escape 
V
    Опции темы
maq
  Дата 28.10.2005, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я начинаю изучать VC++ и мне надо диалоговое окно, которое не закрывалось бы при нажатии Enter или Escape.
Возможно ли это? Если да, то как?

Спасибо.
PM MAIL   Вверх
threef
Дата 28.10.2005, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 1
Всего: 10



1.Создай обработчики сообщений IDOK и IDCANCEL
2.Заблокируй CDialog::OnOK() и CDialog::OnCancel()
если ты хочешь, чтобы диалог закрывался при нажатии мышом на
кнопки OK / CANCEL, то добавь такой вариант:

Код

if ( GetFocus() == GetDlgItem(IDOK) )
{
   CDialog::OnOK();
}   

PM MAIL   Вверх
Coocky
Дата 29.10.2005, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


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

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



Цитата(threef @ 28.10.2005, 23:12)
1.Создай обработчики сообщений IDOK и IDCANCEL

Просто перегрузи витруальную фукцию OnOk(); OnCansel()
И удали все внутри ее


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


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


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

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



Либо можешь ознакомится вот с этой темой, тут тоже похожее обсуждалось.
http://forum.vingrad.ru/index.php?showtopic=65475&hl=


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


Опытный
**


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

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



А у меня совсем другая тема... Есть кнопка. С кнопкой связана функция , соответстно, обработки. В этой функции создаётся диалоговое окно и отображается:


void CBazaDlg::OnAdd()
{
CDEdit de;
de.Create(IDD_EDIT);
de.ShowWindow(SW_SHOW);
}

ФСЁ! Три долбанные строчки! Но дталог у меня не вылазит... Точнее он вылазит но сразуже убирается, это мелькание заметно только если по кнопке долбить постоянно (чем я собственно со злости и занялся smile )

Когда же делаю так:

void CBazaDlg::OnAdd()
{
static CDEdit de;
de.Create(IDD_EDIT);
de.ShowWindow(SW_SHOW);
}

...Очко вылазит. Как я могу судить, своим еще слабоватым умишком, что объект de убивается при выходе из функции. Статический же объект мне нахрен не нужен!
Модальное окно в силу некоторых причин использовать тоже низзя! Типа нада как-то работать с переменными окна во время того как оно висит или окно должно работать с переменными родителя, а при модале ничерта ж не выйдет smile( А ведь с ним так всё красива...

Внимание вопрос!
Как сделать так, объект класса не убивался при выходе из функции

И в довесок
После вызова окна желательно расположить некоторые функции. Так вот, как зделать так, чтобы после создания окна эта тварь не ломилась выполнять функции, а ждала пока окно закроють... понимаю что это уже из области фантастики, но всё же smile
PM MAIL   Вверх
nikf
Дата 6.11.2005, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(kaa @ 6.11.2005, 00:20)
void CBazaDlg::OnAdd()
{
CDEdit de;
de.Create(IDD_EDIT);
de.ShowWindow(SW_SHOW);
}
чего тут удивительного? твое "де" удаляется по выходу из функции
Цитата(kaa @ 6.11.2005, 00:20)
Когда же делаю так:

void CBazaDlg::OnAdd()
{
static CDEdit de;
de.Create(IDD_EDIT);
de.ShowWindow(SW_SHOW);
}
уже лучше, но если
Цитата(kaa @ 6.11.2005, 00:20)
Статический же объект мне нахрен не нужен!
- сделай его членом класса и он будет нестатическим.

Это сообщение отредактировал(а) nikf - 6.11.2005, 13:20
PM MAIL   Вверх
Dreamer_0x01
Дата 6.11.2005, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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




Цитата(kaa @ 6.11.2005, 00:20)
И в довесок
После вызова окна желательно расположить некоторые функции. Так вот, как зделать так, чтобы после создания окна эта тварь не ломилась выполнять функции, а ждала пока окно закроють... понимаю что это уже из области фантастики, но всё же


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

Если у тебя однопоточное приложение, то наверное, лучше так.
Действия, которые ты выполняешь после открытия окна, лучше поместить в отдельную функцию. А в обработчике своего окна (которое у тебя CDEdit) перехватить сообщение WM_CLOSE, либо обрабатывать сообщения кнопок, по которым ты закрываешь это окно. И в этом обработчике пошли родителю свое собщение (например, назови его DCE_CLOSEWINDOW, не забыв указать соответствующий define).
После этого в том классе, из которого ты открываешь окно, ты должен создать обработчик этого сообщения. И вот туда-то и вставь ту функцию, действия которой ты хочешь выполнять после закрытия окна.
И все. Работы - минут на 5, включая время на компиляцию ;)


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


Опытный
**


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

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



nikf

Да! Крута! Всё генитальное проста! Да я вчера ходил около этой мысли вокруг да около, а сформулировать так и несмог...

Мой вам РЭСПЕКТsmile


PM MAIL   Вверх
kaa
Дата 6.11.2005, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Уважаемый Dreamer_0x01... Я не волшебник, я еще только учусь и честно говоря ПОСЛАТЬ кому-то я пока неумею...smile Воот... А все эти пляски с бубном я произвожу для того чтобы достать из диалога значение текстовых полей до того как они уничтожатся при закрытии. Конечно понятно, что в приведенной выше функции этогог не сделаешь, так как если начать считывать их сразу после создания окна там будет пусто, а как считать другим способом я незнаю smile

Кстати, теперь функция выглядит так:

void CBazaDlg::OnAdd()
{
pwnd=GetDlgItem(IDC_ADD);
pwnd->ModifyStyle(0,WS_DISABLED);//Это чтобы злобный юзер
//обработчик этот по
//десять раз не вызывал
de.Create(IDD_EDIT);
de.ShowWindow(SW_SHOW);

}

Было бы чудно, если бы в диалог я мог передать указатель на родительский класс - тогда можно было бы работать с переменными родича прям из диалога, но... я незнаю как! smile Нет! Конечно я могу получить указатель типа CWnd* на родителя, но я думаю ты лучше меня знаешь что там не отразятся переменные моего класса...

Так что вот, сижу сейчас и пытаюсь извратиться умом...

Кстати а как послать послать сообщение? smile smile
PM MAIL   Вверх
kaa
Дата 7.11.2005, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ладно, ставлю вопрос проще: как послать сообщение родительскому классу? smile smile
PM MAIL   Вверх
Dreamer_0x01
Дата 9.11.2005, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(kaa @ 6.11.2005, 17:56)
Было бы чудно, если бы в диалог я мог передать указатель на родительский класс - тогда можно было бы работать с переменными родича прям из диалога, но... я незнаю как!


de.Create(IDD_EDIT,this);


Цитата(kaa @ 7.11.2005, 20:44)
Ладно, ставлю вопрос проще: как послать сообщение родительскому классу?


CWnd *wnd=this->GetParent();
wnd->SendMessage(/*см. MSDN*/);



Цитата(kaa @ 6.11.2005, 17:56)
А все эти пляски с бубном я произвожу для того чтобы достать из диалога значение текстовых полей до того как они уничтожатся при закрытии. Конечно понятно, что в приведенной выше функции этогог не сделаешь


Почему не сделаешь? Еще как сделаешь. В конструктор своего класса (CDEdit) передай указатель на объект, либо структуру, которая будет содержать значения всех нужных тебе переменных. И при закрытии своего окна заполни поля этой структуры. А напоследок уведоми родителя сообщением. Вот например так. (В случе со структурой.) С объектом будет все то же самое.

Вот тебе пример.

Код

typedef struct {
int param1;
char param2;
CString param3;
//ну и так далее....
}MyParams;


#define MYMESSAGE WM_USER+1 //твое сообщение, которое будешь слать родителю.

//описание твоего класса
class CDEdit:public /*уж не знаю, что там у тебя...*/
{
/*твои методы и параметры*/

//измени конструтор 
public:
CDEdit(MyParams *mp/*,остальные твои параметры, которые были*/)

//и объяви вот это
MyParams * mp;
}

//конструктор твоего класса:
CDEdit::CDEdit(MyParams *mp/*,остальные твои параметры, которые были*/)
{
this->mp=mp;
}



/*добавь обработчик события WM_CLOSE в классе CDEdit, либо напиши этот код вфункции DestroyWindow, короче, мест много, выбирай сам ;) */
{
this->mp->param1 = твоя_переменная1;
this->mp->param2 = твоя_переменная2;
this->mp->param3 = твоя_переменная3;
//И уведоми родителя о том, что ты закрылся:
GetParent()->SendMessage(MYMESSAGE,0,0);
}



//в хедере твоего главного класса (CBazaDlg) объявляем
MyParam mparam;

//а при создании твоего окна его объявляем так:
CDEdit de(&pmaram,/*остальные параметры*/);


//и не забудь добавить обработчик твоего сообщения MYMESSAGE
//в котором сможешь из mparam забрать измененные значения



Как создавать свои сообщения...хм...ладно, напишу.

1. шаг один - уже сделали. определили
#define MYMESSAGE WM_USER+1

2. В код своего класса ( CBazaDlg) добавь
afx_msg LRESULT OnMyMessage(UINT,LONG);
3. В cpp-файл своего класса добавь

Код

//ищи вот это в спп-файле CBazaDlg
BEGIN_MESSAGE_MAP(CBazaDlg, CDialog/*здесь твой базовый класс, от которого ты унаследовал CDEdit*/)
//........какие-то строки
//добавь свою строку
    ON_MESSAGE(MYMESAGE,OnMyMessage)
//........

и собственно, обработчик твоего сообщения:
LRESULT CBazaDlg::OnMyMessage(UINT wParam,LONG lParam)
{
//и вот тут-то и берешь новые значения из своей структуры.

/*
кстати. есть и другой способ. Можешь не добавлять в свой класс CDEdit переменную
mparam, и объявить ее лишь перед отдачей родителю данного сообщения, а в качестве одного из параметров передать указатель на эту структуру. 
то есть там сделаешь так:
MyParam mp;
mp.param1=....;
mp.param2=....;
SendMessage(MYMESSAGE,(UINT)&mp,0);
использую обязательно SendMessage, а не PostMessage, чтобы твое окно дождалось обработки собщения и не разрушило mp.

А здесь делаешь такое преобразование:
MyParam * mp=(MyParam*)wParam;
и пошло-поехало....

Какой метод больше понравится - решай сам. Но описанный мною - более уневерсальный и глобальный, а следовательно, более функциональный.
*/
return 0;
}


Это сообщение отредактировал(а) Dreamer_0x01 - 9.11.2005, 09:10


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


Unregistered











Ага... Чичас попробуем... smile
  Вверх
Dreamer_0x01
Дата 9.11.2005, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Я исправил кое-какие ошибки в коде примера, читай внимательно и главное - старайся вникнуть.
Если что - спрашивай.


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


Unregistered











Dreamer_0x01
РЕСПЕКТ! smile Усё вышло! Я еще в первом примере мысль твою ухватил, по книжечкам полази - образования не хватало и всё заработало! smile
Правда я структуру никакую создавать не стал, а прямо в обработчике сообщения перекидываю из диалога кудамне нада smile
  Вверх
kaa
Дата 10.11.2005, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А вот еще вопрос... smile Маю FlexGrid, всем он вроде мяня оплодотворяет, но при реализации как всегда выползли вопросы: как програмно установить ширину столбца там? А то у меня все столбцы создаются по умолчанию одинаковой ширины, так мало того что в них текст не убирается ( в заголовке) так еще справа остаётся серое поле Grid-а- некрасиво+приходится в ручную менять ширину столбцов, хорошо что у меня их только шесть, а если будет двадцатьшесть?

И в довесок как всегда: можноли Fle[Grid связать с базой данных, говорят в некоторых гридах это возможно... и ненадо ничего подгружать, тока источник указал и усё... smile
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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