Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Minimize Box сворачивает всё


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

CMyDlg dlg;
dlg.DoModal();

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


Автор: Albor 2.9.2013, 17:06
Зачем сворачивать модальный диалог? Всё равно, пока он не закрыт, с основным окном ни чего не сделать. Используйте не модальный режим.

Автор: akizelokro 4.9.2013, 15:28
Оба утверждения спорны.

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

Код

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

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



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

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

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

Оспорить можно что угодно. Модальный диалог нужен для обязательного общения с пользователем. Так зачем же давать возможность этому пользователю себя сворачивать и давать доступ к основному окну без получения нужной реакции/информации для основной задачи? 

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

Автор: mrgloom 5.9.2013, 10:20
попробовал не модальный диалог создать так.
Код

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


работает нормально и минимизация тоже, только почему то при повторном запуске падает.

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

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

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

Автор: mrgloom 5.9.2013, 15:33
Код

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

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

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


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


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

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


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

Автор: mrgloom 6.9.2013, 10:21
Всё таки дело в 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;
}

Автор: mrgloom 17.9.2013, 16:58
Цитата

CDialog dlg;
dlg.DoModal();

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

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

может быть в моём случае какие то проблемы с выставленными стилями окна?

Автор: mrgloom 18.9.2013, 11:48
похоже проблема в том, что до открытия основного диалога я вызываю еще 1 модальный диалог в CMyDlg::OnInitDialog() и после открытия мой диалог почему то теряет модальность, если же открытие побочного диалога закомментить, то всё норм. 

Автор: mrgloom 19.9.2013, 09:24
было
Код

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();

    //...
 }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)