2008-10-13 21 views
1

J'ai un cadre principal avec un séparateur. Sur la gauche, j'ai mon (imaginativement nommé) CAppView_Leftand sur la droite j'ai CAppView_Right_1 et CAppView_Right_2. A travers le code suivant je les deux vues INITIALISER primaires correctement:Vues interchangeables multiples (MFC/C++)

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; 
} 

...

Ce que je voudrais faire est de créer une seconde vue à l'intérieur du cadre de droite, mais lorsque je tente d'ajouter ceci:

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 compile mais ne parvient pas à exécuter l'application, ce qui soulève une exception me disant que je l'ai déjà défini la vue.

Quelqu'un peut-il suggérer comment je fais cela? Aussi, comment changer entre les vues d'une vue ou de la classe de document?

Merci beaucoup.

Répondre

1

Il y a un article CodeProject qui devrait vous aider à réaliser ce que vous voulez:

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

J'ai remplacé vues dans un séparateur avant , donc si ce qui précède ne m'aide pas, je vais poster un peu de mon propre code.

+0

Merci! J'avais trouvé d'autres exemples sur codeproject, mais aucun n'était aussi efficace que ça. Merci beaucoup! :) – Konrad

0

Vous ne pouvez pas créer un second point de vue de la main droite parce que votre

m_wndSplitter.CreateStatic(this, 1, 2) 

a seulement créé deux colonnes. Vous pouvez changer cela

m_wndSplitter.CreateStatic(this, 1, 3) 

et changer votre second point de vue droit à

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; 
} 

Il en résulte trois colonnes chacune avec une vue séparée. Vous pouvez également créer une fenêtre de séparation supplémentaire pour diviser l'une des vues existantes, par ex. quelque chose comme

m_wndSplitter2.CreateStatic(m_View2, 2, 1) 

où m_view2 était votre deuxième vue

+0

Merci pour l'entrée - Je ne veux pas créer trois volets. Je suis heureux avec les deux volets que j'ai, je veux juste être en mesure d'utiliser deux vues différentes (de façon interchangeable) dans le volet de la main droite. – Konrad

0

Pour basculer entre les vues, vous devez explicitement DeleteView avant de créer une autre vue à sa place.

Si vous devez conserver l'état des vues interchangeables, il est préférable que les vues puissent initialiser leur état à partir du document. Veillez à mettre à jour le document avec tout état qui doit rester entre la suppression et la recréation de l'une des vues.