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


Автор: ano360 4.5.2009, 09:29
Есть  MDI MDF Application можно ли сделать чтобы Child MDIокна были DialogBox ами?
Или сделать чтобы DialogBox вел себя как Child MDI окно:
 - двигался только в пределе "рабочей области"
 - при активации DialogBox основное окно оставалось активным, как это происходит при активации child MDI окна
может можно при создании указать некий стиль? типа WS_CHILD

Автор: Earnest 4.5.2009, 09:33
Цитата(ano360 @  4.5.2009,  10:29 Найти цитируемый пост)
Есть  MDI MDF Application можно ли сделать чтобы Child MDIокна были DialogBox ами?

нет

Цитата(ano360 @  4.5.2009,  10:29 Найти цитируемый пост)
Или сделать чтобы DialogBox вел себя как Child MDI окно:

можно, но тяжело (много кода).

Возникает вопрос - зачем? Если тебя интересует создание окна со многими контролами из ресурсов, то может, обойдешься видом - формой? Т.е. как-бы диалогом можно сделать вид внутри чайлд-фрейма. Смотри CFormView.

Автор: ano360 4.5.2009, 11:23
Код

 Если тебя интересует создание окна со многими контролами из ресурсов, то может, обойдешься видом - формой? Т.е. как-бы диалогом можно сделать вид внутри чайлд-фрейма. Смотри CFormView.

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

Добавлено через 5 минут и 50 секунд
нашел такой материал. как я понимаю это то на эту тему разговор?
http://74.125.77.132/search?q=cache:kkGfk66E2q4J:forum.sources.ru/index.php%3Fact%3DPrint%26client%3Dwordr%26f%3D4%26t%3D49952+CFormView&cd=2&hl=ru&ct=clnk&lr=lang_ru&client=opera

Автор: ano360 4.5.2009, 12:10
только тут все как то очень сумбурно. сходу не поймешь
я правильно понял?
нужно создать класс унаследованный от CFormView
написать конструктор в котором как то указазать из какого ресурса брать шаблон для создания вида.
создать объект вида и укзатать его как текущий для Child формы.

Автор: Earnest 4.5.2009, 14:32
Ну, в принципе, да.
Попробуй для разминки сгенерировать новый MFC-проект визардом и укажи ему, что базовым классом вида будет CFromView. Тогда он тебе все заготовки нагенерирует. Там еще важно ресурс диалога с правильными свойствами создать. А вообще все довольно просто - не сложнее, чем с диалогом или обычным видом. 

Автор: ano360 4.5.2009, 18:29
да не спорю, только вот по крохам собирать по интернету информацию и складывать из нее как из мозайки целостную картину довольно утомительно, хотя с другой стороны довольно интересно

может подкинете ссылочку на место где рассказывается про работу с CFormView, а то мне какие то бессвязные обрывки все попадаются?

Автор: ano360 4.5.2009, 19:17
Сделал как вы сказали
Да. надо свойство Style в PopUp.

Нашел что при нажатии File->New вызывается CWinApp::OnFileNew и видимо она и создает новое Сhild окно
Допустим. 
Но где в данном проекте код создающий child окно появляющается сразу при старте приложения....Я уже голову сломал...

Автор: ano360 4.5.2009, 20:18
Сгорем пополам заработало...
Материал брал отсюда:http://forum.sources.ru/index.php?act=ST&f=4&t=49952
Хотя понимания производимых действий как не было так и нет...

Да и результат ожидался немного другой. Можно например сделать чтобы не было бордюра(ступеньки такой) по краям Child ?

И по прежнему стоит открытым вопрос где же всетаки код создающий новое Child окно

Автор: Earnest 5.5.2009, 08:35
Цитата(ano360 @  4.5.2009,  21:18 Найти цитируемый пост)
И по прежнему стоит открытым вопрос где же всетаки код создающий новое Child окно

Проще всего изучать код с помощью дебагера. Окна стандартно создаются в шаблоне документа - что-то вроде CreateNewFrame. Ставишь туда точку прерывания и смотришь по стеку, откуда вызов пришел.

Автор: ano360 5.5.2009, 12:48
Нашел. спасибо за подсказку. брейкпоинтами я уже давно пользуюсь а вот про стек ничего не знал.
выяснилось что создание первого Child окна происходит при работе кода:
Код

CComandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
if(!ProcessShellCommand(cmdInfo));
return false;

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

Автор: Earnest 5.5.2009, 16:04
Этот код обрабатывает аргументы командной строки и может тебе понадобиться.
Вроде там по умолчанию есть код, который, если не просят открыть документ, создает новый.

Вроде здесь (конструктор CCommandLineInfo). Видишь, инициализируется командой FileNew.
Код

CCommandLineInfo::CCommandLineInfo()
{
    m_bShowSplash = TRUE;
    m_bRunEmbedded = FALSE;
    m_bRunAutomated = FALSE;
    m_nShellCommand = FileNew;
}

Достаточно убрать (заменить FileNothing) и не будет ничего создаваться.

Автор: ano360 7.5.2009, 21:11
сделал так и теперь все как нужно:

Код

CCommandLineInfo cmdInfo;
cmdInfo.m_nShellCommand=CCommandLineInfo::FileNothing ;
ParseCommandLine(cmdInfo);

if (!ProcessShellCommand(cmdInfo))
        return FALSE;

я уж не стал вмешиваться в исходники....

P.S. Большое вам спасибо за помощ

Автор: Earnest 8.5.2009, 08:19
Я это и имела в виду, а не вмешательство в исходники. Можно еще ParseCommandLine переопределить, чтобы не засорять код деталями.

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