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


Автор: NewLine 17.7.2006, 12:32
Превет.
У меня есть MDI приложение и пункт меню "New document".
Скажите пожалуйста где необходимо переопределять функцию OnCreateClient, чтобы при открытии этого документа в нем можно было просмотреть несколько View c помощью CSplitterWnd.
Спасибо. 

Автор: Earnest 17.7.2006, 12:36
В наследнике MDIChildFrame - т.е. в рамке вида.

Добавлено @ 12:37 
т.е. CMDIChildWnd  

Автор: NewLine 17.7.2006, 13:01
Теперь получается он для любого пункта меню будет открывать этот документ.   smile  

Автор: Earnest 17.7.2006, 13:29
Кто - он? 

Автор: NewLine 17.7.2006, 13:44
Получается, что для любого пункта меню открывается один и тот же документ с несколькими View. 

Документ!!! 

Автор: Earnest 17.7.2006, 13:57
Цитата(NewLine @  17.7.2006,  14:44 Найти цитируемый пост)
Получается, что для любого пункта меню открывается один и тот же документ с несколькими View. 

Да? даже для пункта "Выход"?

И какая связь? Сплиттер нужно создавать заранее, если он вообще нужен. Но кто заставляет создавать его с несколькими панелями сразу? 

Цитата(NewLine @  17.7.2006,  14:44 Найти цитируемый пост)
Документ!!! 

Нет, не документ, а ты. smile 
Ну откуда я знаю, чего ты там напрограммировал?
 

Автор: NewLine 17.7.2006, 17:26
У меня например есть два пункта меню "New Document" и "Second Document" и оба они вызывают виртуальную функцию OnCreateClient, которая определяет показ нескольких View.
Код

BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
{
 if(!m_wndSplitter.CreateStatic(this, 2, 1))
        return FALSE;

    if(!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(NewFormView_2), CSize(100, 300), pContext))
        return FALSE;

    if(!m_wndSplitter1.CreateStatic(&m_wndSplitter, 1, 2, WS_CHILD | WS_VISIBLE, m_wndSplitter.IdFromRowCol(1,0)))
        return FALSE;

    if(!m_wndSplitter1.CreateView(0, 0, RUNTIME_CLASS(NewFormView_2), CSize(300, 100), pContext))
        return FALSE;

    if(!m_wndSplitter1.CreateView(0, 1, RUNTIME_CLASS(NewFormView_2), CSize(300, 100), pContext))
        return FALSE;

    return TRUE;
}

А как мне сделать чтоб при выборе одного пункта меню открывался документ с несколькими View, а для другого с одним?
Спасибо.  

Автор: Earnest 19.7.2006, 08:16
Ну, во первых, ты каждый раз создаешь не 2 вида а больше, но неважно.
Функция OnCreateClient вызывается каждый раз, когда создается новый фрейм. По идее, задачу мог бы решить параметр, переданный в OnCreateClient, в зависимости от которого ты создаешь только одну панель или несколько. Но передать такой параметр проблематично - не предусмотрено. Можно, конечно, мудрить с внутренними переменными или статическими флагами, но это все криво. Поэтому я бы сделала так. В OnCreateClient созавать сплиттер и только одну панель. Далее, один из пунктов меню обрабатывается стандартно - OpenDocumentFile и т.д. Второй - пишешь свой обработчик, где к стандартному коду (который открывает только один вид), добавляешь свой, который создает необходимое число видов в сплиттере фрейма.
Но вообще-то более стандартный подход - когда у тебя всегда открывается один вид, а  команде меню (скажем, Split) - текущий вид расщепляется. Т.е. обработку Open оставляешь в покое, а в команде Split берешь текущий фрейм и создаешь в сплиттере необходимые панели.

Но, возможно, я тебя не поняла, и твой Second Document - это совсем другая сущность. Тогда можно просто создать 2 разных фрейма и, соответственно, 2 шаблона документа. Один пункт меню обрабатываешь с помощью одного шаблона, второй - с помощью другого.   

Автор: NewLine 20.7.2006, 09:50
Ок.
Спасибо большое за помощь.  

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