Несколько взаимозаменяемых видов (MFC/C++)

У меня есть основной кадр с разветвителем. Слева у меня есть мой (образно названный) CAppView_Leftand, а справа у меня есть CAppView_Right_1 и CAppView_Right_2. С помощью следующего кода я правильно инициализирую два основных представления:

if (!m_wndSplitter.CreateStatic(this, 1, 2))
{
    TRACE0("Failed to CreateStaticSplitter\n");
    return FALSE;
}
else 
if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CAppView_Left), CSize(300, 200), pContext))
{
    TRACE0("Failed to create left pane\n");
    return FALSE;
}
else 
if (!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CAppView_Right_1), CSize(375, 200), pContext))
{
    TRACE0("Failed to create first right pane\n");
    return FALSE;
}

...

То, что я хотел бы сделать, это создать второй вид внутри правой рамки, однако, когда я пытаюсь добавить это:

if (!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CAppView_Right_2), CSize(375, 200), pContext))
{
    TRACE0("Failed to create first right pane\n");
    return FALSE;
}

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

Может кто-нибудь подсказать, как мне это сделать? Кроме того, как переключаться между представлениями из вида или класса документа?

3 ответа

Решение

Есть статья CodeProject, которая должна помочь вам достичь того, чего вы хотите:

http://www.codeproject.com/KB/splitter/usefulsplitter.aspx

Раньше я заменял представления в разделителе, поэтому, если приведенное выше не поможет, я опубликую часть своего собственного кода.

Вы не можете создать второй вид справа, потому что ваш

m_wndSplitter.CreateStatic(this, 1, 2) 

создал только два столбца. Вы можете изменить это на

m_wndSplitter.CreateStatic(this, 1, 3)

и измените свой второй правильный вид на

if (!m_wndSplitter.CreateView(0, 2, RUNTIME_CLASS(CAppView_Right_2), CSize(375, 200), pContext))
{    
TRACE0("Failed to create first right pane\n");   
 return FALSE;
}

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

m_wndSplitter2.CreateStatic(m_View2, 2, 1)

где m_view2 был вашим вторым видом

Для переключения между представлениями вам нужно явно удалить DeleteView перед созданием другого представления на его месте.

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

Другие вопросы по тегам