Múltiples vistas intercambiables (MFC / C ++)
-
10-07-2019 - |
Pregunta
Tengo un cuadro principal con un divisor. A la izquierda tengo mi CAppView_Lefta (con un nombre imaginativo) y a la derecha tengo CAppView_Right_1 y CAppView_Right_2. Mediante el siguiente código, inicializo las dos vistas principales correctamente:
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;
}
...
Lo que me gustaría hacer es crear una segunda vista dentro del marco derecho, sin embargo, cuando trato de agregar esto:
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 compila pero no puede ejecutar la aplicación, generando una excepción que me dice que ya he definido la vista.
¿Alguien puede sugerir cómo hago esto? Además, ¿cómo cambiar entre las vistas desde una vista o desde la clase de documento?
Solución
Hay un artículo de CodeProject que debería ayudarlo a lograr lo que desea:
http://www.codeproject.com/KB/splitter/usefulsplitter.aspx
He reemplazado vistas en un divisor antes, así que si lo anterior no ayuda, publicaré algo de mi propio código.
Otros consejos
No puede crear una segunda vista a la derecha porque su
m_wndSplitter.CreateStatic(this, 1, 2)
solo ha creado dos columnas. Puedes cambiar esto a
m_wndSplitter.CreateStatic(this, 1, 3)
y cambie su segunda vista derecha a
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;
}
Esto da como resultado tres columnas cada una con una vista separada. También puede crear una ventana divisor adicional para dividir una de las vistas existentes, p. algo como
m_wndSplitter2.CreateStatic(m_View2, 2, 1)
donde m_view2 fue su segunda vista
Para cambiar entre vistas, deberá eliminar explícitamente ViewView antes de crear otra vista en su lugar.
Si necesita preservar el estado de las vistas intercambiables, será mejor que haga que las vistas puedan inicializar su estado desde el documento. Tenga cuidado de actualizar el documento con cualquier estado que deba permanecer entre la eliminación y la recreación de una de las vistas.