Несколько взаимозаменяемых видов (MFC / C ++) - PullRequest
1 голос
/ 13 октября 2008

У меня основная рама с разветвителем. Слева у меня есть (образно названный) 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 ]

1 голос
/ 13 октября 2008

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

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

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

0 голосов
/ 13 октября 2008

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

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

0 голосов
/ 13 октября 2008

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

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 был вашим вторым видом

...