Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с немодальными диалогами 
V
    Опции темы
MoreHate
Дата 19.6.2006, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Возникло несколько вопросов по немодальным диалогам

1.
Главное окно создает модальный диалог(1).
Этот модальный диалог, в свою очередь, создает немодальный диалог(2).
При закрытии немодального диалога, диалог модальный диалог (1) становится немодальным.

Как этого избежать?

2.
Тоже самое главное окно создает тот же модальный диалог, который создает немодальный.

Из немодального диалога пытаюсь послать сообщение модальному, но ничего не получается.
GetParent() выдает NULL. Поэтому GetParent()->SendMessage не работает.
Или GetParent() только для модальных диалогов?

Как в таком случае поступить?

P.S. Немод. диалог создаю так:
Код

MyDialog *MyDlg;

...
    MyDlg = new MyDialog;
    MyDlg->Create(IDD_MY_DLG);
    MyDlg->ShowWindow(SW_SHOW);


 
PM MAIL   Вверх
Earnest
Дата 19.6.2006, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Идея создать внутри кода модального диалога - неудачная: модальный диалог запускает свой собственный цикл обработки сообщений.
GetParent - для всех, но ты создаешь диалог с parent = NULL, чего ж ты хочешь? 

Не делай так: т.е. немодальные диалоги лучше создавать в главном окне.  


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


Новичок



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

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



Хм...

В таком случае еще один вопрос.

Модальный диалог (1) создает еще один модальный диалог(2). Можно ли в таком случае как-то воздействовать из второго диалога на первый (мне нужно попросту обновлять окно).

Или нужно перестраивать струткуру программы? 
PM MAIL   Вверх
DeadSoul
Дата 19.6.2006, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(MoreHate @  19.6.2006,  20:49 Найти цитируемый пост)
Можно ли в таком случае как-то воздействовать из второго диалога на первый (мне нужно попросту обновлять окно).

Не рекомендуется. Обычно родитель влияет на потомка, а не наоборот 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Earnest
Дата 20.6.2006, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Можно, при создании второго диалога сделай его родителем первый. 
Но как-то криво все выглядит. Ты бы объяснил, какая задача.

Цитата(DeadSoul @  19.6.2006,  23:19 Найти цитируемый пост)
Не рекомендуется. Обычно родитель влияет на потомка, а не наоборот  

В данном случае это не очень реально: HWND дочернего модального диалога родитель стандартно не получит (оно живет только внутри модального цикла). Можно, конечно, извращаться. Вот наоборот как раз можно.
 


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


Новичок



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

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



Цитата

Ты бы объяснил, какая задача.

Если совсем упростить, то все выглядит так:
Есть модальный диалог со списком товаров (корзина). Есть еще один диалог, который добавляет товары в эту самую корзину. Но нужно после каждого добавления обновить данные в корзине, чтобы было видно, что уже добавили, а что еще нет. 
PM MAIL   Вверх
DeadSoul
Дата 20.6.2006, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(MoreHate @  20.6.2006,  17:39 Найти цитируемый пост)
Есть модальный диалог со списком товаров (корзина). Есть еще один диалог, который добавляет товары в эту самую корзину. Но нужно после каждого добавления обновить данные в корзине, чтобы было видно, что уже добавили, а что еще нет.  


Примерно так:
Код

void CNoneModalDlg::OnButtonAddNewItem()
{
  CSelectGoodDlg dlg;
  if ( IDOK != dlg.DoModal() )return;

  // Получаем новый товар
  CGood newGood=dlg.GetNewGood();

 // некоторые действия по добавлению нового товара
 //..............
}
 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
MoreHate
Дата 21.6.2006, 02:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нет, не то...

Второй диалог никто не закрывает. Т.е. обновить нужно до закрытия.  

Это сообщение отредактировал(а) MoreHate - 21.6.2006, 02:58
PM MAIL   Вверх
Earnest
Дата 21.6.2006, 06:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну попробуй при объявляении второго модального диалога дать задать ему родителя - первый диалог (второй параметр в конструкторе). А потом посылать сообщения. 
Но я бы все же сделала 2 немодальные формы... Причем данные хранила бы в отдельном классе, не интерфейсном, а обновления делала, например, на idle, по изменению данных.
 


--------------------
...
PM   Вверх
MoreHate
Дата 21.6.2006, 07:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Earnest
Данные хранятся в БД. Хотя это, конечно, не очень правильно. В будущем подумаю, как сделать нормально.

А сейчас попробую сделать то, что ты посоветовала. 
PM MAIL   Вверх
Earnest
Дата 21.6.2006, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(MoreHate @  21.6.2006,  08:34 Найти цитируемый пост)
Данные хранятся в БД. 

Да какая разница. Тем более, если собираешься в будущем переделывать, сделай промежуточный класс - прокладку между БД и UI, так чтобы UI про базу данных вообще не знал. Самый простой метод синхронизации - с помощью тайм-стэмпов, если нужно, покажу примерный код.  


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


Новичок



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

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



Да, если можно. Это будет очень полезно. 
PM MAIL   Вверх
MoreHate
Дата 21.6.2006, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Делаю так:
Код

    MyDlg = new CMyDialog(this);    
    MyDlg->DoModal();

Но в открывшемся диалоге GetParent() выдает NULL.

Пробовал так:
Код

WareChooseDlg1 = new WareChooseDlg(this);
WareChooseDlg1->Create(IDD_WARE_CHOOSE, this);
WareChooseDlg1->ShowWindow(SW_SHOW);

То же самое.


 
PM MAIL   Вверх
Earnest
Дата 21.6.2006, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Покажи конструктор CMyDialog. Ты базовому-то классу родителя передаешь?

Вот примерный код синхронизиции по тайм-стампам:

Код

// class CStampHolder - наблюдаемый объект. Запоминает некоторое состояние, которое
//  изменяется при вызове Modified(). Предназначен для наследования от него.
class CStampHolder
{
   friend class CStampTracker;

public:
   CStampHolder(): m_nStamp(1) {}
   
   void Modified() { ++m_nStamp; }
   
private:
   UINT m_nStamp;
};

// class CStampTracker - класс наблюдателя за объектом, производным от CStampHolder, причем
//    за одним объектом CStampHolder могут наблюдать любое количество CStampTracker'ов.
//
//    Возможно как наследование от него, так и встраивание перемнной типа CStampTracker куда 
//    угодно. Один единственный метод обеспечивает сравнение своего состояния и состояния 
//    CStampHolder с последующей их синхронизацией. Возвращает true, если состояния 
//    различны.
//
//       Пример использования:
//          . . .
//          private:
//             CStampTracker m_SubjState;
//          . . .
//          if (m_SubjState.EnsureSync (TheSubj()))
//             DoSomething();
class CStampTracker
{
public:
   CStampTracker(): m_nStamp(0) {}
   
   // возвращает true, если Subj изменился
   bool EnsureSync (const CStampHolder& Subj) const;
   
private:
   mutable UINT m_nStamp;
};

inline bool CStampTracker::EnsureSync (const CStampHolder& Subj) const
{
   UINT nSubjStamp = Subj.m_nStamp;
   if (m_nStamp == nSubjStamp)
      return false;
      
   m_nStamp = nSubjStamp; 
   return true;
}


Объект данных наследуешь от CStampHolder, в каждом методе setXXX() вызываешь Modified(). В окно добавляешь объект CStamTracker. На Idle проверяешь EnsureSync. Немодальному окну приходит сообщение WM_IDLEUPDATECMDUI, модальному - WM_KICKIDLE. Правда, работает ли это в дилоговом приложении - без понятия. 


--------------------
...
PM   Вверх
MoreHate
Дата 21.6.2006, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Наверное я что-то делаю не так smile
Коструктор у меня дефолтовый
Код

WareChooseDlg::WareChooseDlg(CWnd* pParent /*=NULL*/)
    : CDialog(WareChooseDlg::IDD, pParent)
{
    // Но если вот здесь сделать pParent->SendMessage, то все нормально работает.
}


Здесь что-то разве должно быть?

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


 




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


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

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