Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Minimize Box сворачивает всё 
:(
    Опции темы
mrgloom
Дата 2.9.2013, 16:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть главное окно, потом открывается еще 1 окно в котором есть кнопка свёртывания, проставленная в свойствах Minimize Box.
вызывается как 
Цитата

CMyDlg dlg;
dlg.DoModal();

только при нажатии кнопки сворачивания почему то сворачивается вся программа, а хотелось бы чтобы сворачивался только открытый диалог.


PM MAIL   Вверх
Albor
Дата 2.9.2013, 17:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Зачем сворачивать модальный диалог? Всё равно, пока он не закрыт, с основным окном ни чего не сделать. Используйте не модальный режим.
PM MAIL ICQ   Вверх
akizelokro
Дата 4.9.2013, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



Оба утверждения спорны.

Если запустить такую кострукцию как 

Код

AfxThread(ля-ля-тополя);
SomeDialog.DoModal();

// и тут для весёлой ознакомительности можно ещё нахально написать код остановки потока



а с модального окна убрать все элементы управления, кнопки, по которому оно закрывается и перекрыть закрытие модального окна по Escape, то сделать всё-таки что-то можно. Поведение программы в такой ситуации различается в XP и Windows7, но обработку поток делает спокойно. Единственное, что модальное окно, если на него повесить прогрессбар, в XP не будет отображать прогресс (Возможно, можно сделать это неким другим потоком). Но,предположу, чтов другие окна даже под XP Добраться можно из запущенного потока.

Как сделать,чтобы основное окно не минимизировалось? Есдинственное, что могу предположить, - не отрисовывать для модального окна ничего на панели задач, а попутно, для пущей уверенности и в главном окне пробовать запретить (перехватить) минимизацию. Но это всё весёлые изыски.. потому я сеодня два хороших куса кода ночью забубенил. А потом ещё и PHP-скрипт начал писать на языке JavaScript и долго удивлялся, почему оно там не работает.  smile 


Это сообщение отредактировал(а) akizelokro - 4.9.2013, 15:46


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
Albor
Дата 4.9.2013, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(akizelokro @  4.9.2013,  14:28 Найти цитируемый пост)
Оба утверждения спорны.

Оспорить можно что угодно. Модальный диалог нужен для обязательного общения с пользователем. Так зачем же давать возможность этому пользователю себя сворачивать и давать доступ к основному окну без получения нужной реакции/информации для основной задачи? 
PM MAIL ICQ   Вверх
akizelokro
Дата 4.9.2013, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



С этим вот как раз согласен.
А попробовать тоже, возможно, стоит. Просто для ознакомления с "начинкой".

Это сообщение отредактировал(а) akizelokro - 4.9.2013, 20:14


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
mrgloom
Дата 5.9.2013, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



попробовал не модальный диалог создать так.
Код

CMyDlg& CMyDlg::GetInstance()
{
    static CMyDlg myDlg;
    return myDlg;
}
CMain::OnSomeButtonPress()
{
CMyDlg::GetInstance().Create( CMyDlg::IDD);
}


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


Крокодил
**


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

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



Тебе написали в другой теме почему, это уже не проблема API. Ты пытаешься создать static-объект второй раз.
А не позволяет тебе это делать сам язык программирования.
Во второй раз не создавай его, а вызывай уже созданный до этого (тут надо обсмотреть ещё, что ты не "чикаешь" сам диалог при закрытии в первый раз до такой степени, что его уже не вызвать повторно, возможно ли такое, - надо смотреть и разбираться).

Со static-диалогом работай лучше по-другому. Создавай при старте программы, когда тебе нужно его вызвать, делай активным (показывай), при закрытии (кнопка "ок", "отмена, Alt+F4 - убирай с глаз долой.

Добавлено @ 13:38
Да и вообще посмотри создание немодальных диалоговых окон.


Это сообщение отредактировал(а) akizelokro - 5.9.2013, 13:38


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
mrgloom
Дата 5.9.2013, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

Ты пытаешься создать static-объект второй раз.

так  ошибка происходит не когда подходит к определению static объекта второй раз, а на Create.
я не понимаю что происходит там более подробно.
Цитата

Во второй раз не создавай его, а вызывай уже созданный до этого (тут надо обсмотреть ещё, что ты не "чикаешь" сам диалог при закрытии в первый раз до такой степени, что его уже не вызвать повторно, возможно ли такое, - надо смотреть и разбираться).


я просто закрываю диалог на Ok или Cancel и потом пытаюсь вызвать еще раз.


смысл варианта с singleton(если он будет работать), что в главном диалоге не надо определять переменную для дочернего диалога.

Это сообщение отредактировал(а) mrgloom - 5.9.2013, 15:41
PM MAIL   Вверх
akizelokro
Дата 5.9.2013, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



Цитата(mrgloom @  5.9.2013,  15:33 Найти цитируемый пост)
я просто закрываю диалог на Ok или Cancel и потом пытаюсь вызвать еще раз.


Тебе же написали, что это синглетон. поверим добрым людям, что его больше одного раза в программе создавать нельзя.
А ты пытаешься его создавать ещё в CMain::OnSomeButtonPress().
вызови Create в другом месте программы, гед, например идёт инициализация и этот кусок кода вызвается всего один раз. Притом, создай его с Visible = false.
В CMain::OnSomeButtonPress() просто пиши Visisbie=true, а в обработчикахнажатия кнопок Ок и Отмена пиши снова Visible=false.



--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
mrgloom
Дата 6.9.2013, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всё таки дело в Create
такой код тоже падает.
Код

    CMyDlg* pDlg= new CMyDlg();
    pDlg->Create(CImageComparisionDlg::IDD);
    pDlg->Create(CImageComparisionDlg::IDD);


вообще сделал так

Код

CMyDlg* m_pDlg= NULL;

CMyDlg* CMyDlg::GetInstance()
{
    m_pDlg= new CMyDlg;
    m_pDlg->Create(CMyDlg::IDD);
    return m_pDlg;
}


Код

CMain::OnSomeButtonPress()
{
CMyDlg::GetInstance();
}


Код

void CMyDlg::OnBnClickedCancel()
{
    
    if(m_pDlg!= NULL)
        delete m_pDlg;
}

PM MAIL   Вверх
mrgloom
Дата 17.9.2013, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

CDialog dlg;
dlg.DoModal();

создаю так диалог, но как то получается так что окна которые были созданы до остаются доступными, т.е. можно на них перейти и например закрыть, а надо чтобы было доступен только текущий диалог. 

В чем может быть причина?

может быть в моём случае какие то проблемы с выставленными стилями окна?
PM MAIL   Вверх
mrgloom
Дата 18.9.2013, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



похоже проблема в том, что до открытия основного диалога я вызываю еще 1 модальный диалог в CMyDlg::OnInitDialog() и после открытия мой диалог почему то теряет модальность, если же открытие побочного диалога закомментить, то всё норм. 
PM MAIL   Вверх
mrgloom
Дата 19.9.2013, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



было
Код

void CMyView::OnSomeButtonPress() 
{
    CMyDlg dlg;
    dlg.DoModal();
}

BOOL CMyDlg::OnInitDialog() 
{
    CDialog::OnInitDialog();

    //some init here...


    //new modal dialog here (if comment this CMyDlg works as modal)
    CSettingsDlg dlg;
    dlg.DoModal();

    //...
 }


вообщем проблема решилась надо было так.

Код

void CMyView::OnSomeButtonPress() 
{
    CMyDlg dlg;
    dlg.DoModal();
}

BOOL CMyDlg::OnInitDialog() 
{
    CDialog::OnInitDialog();

    //some init here...


    //new modal dialog here (if comment this CMyDlg works as modal)
    CSettingsDlg dlg(this);
    dlg.DoModal();

    //...
 }


Это сообщение отредактировал(а) mrgloom - 19.9.2013, 09:24
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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