Il n'est pas toujours évident d'effectuer le design d'une application,
surtout lorsque l'on ne connaît pas toutes les possibilités
des MFC. Lors de projets de type autre que DialogBox, il est possible
d'effectuer un certain nombre de divisions de l'écran grâce
à la classe CSplitter. A chaque partie divisée, nous allons
attribuer des classes dérivant toutes de la classe CView. ( CView,
CFormView ,
).
Exemple d'un visuel réalisé avec cette méthode
:

Principe
de fonctionnement
Le splitter va permettre de diviser l'écran en plusieurs parties.
Chaque part correspond à un pane auquel une vue sera associée.
La division s'effectue sous forme de colonne et de ligne telle un tableau.
Chaque part peut être de nouveau subdivisée mais cela est
un peu plus complexe. Dans cet article, nous allons simplement voir
comment il est possible de diviser l'écran en deux vues distinctes.
Première
Phase de l'opération
Dans un premier temps, Il faut implémenter une seconde classe
héritant des fonctionnalité de la classe de base CView.
Pour cela, il suffit d'utiliser Class Wizard qui vous permettra de générer
correctement votre nouvelle classe.
Seconde
phase de l'opération
Il faut rajouter une instance de type CSplitter dans la classe CMainFrame
de votre application
class CMainFrame : public CFrameWnd { protected: // create from serialization only CMainFrame(); DECLARE_DYNCREATE(CMainFrame) // Attributes public: CSplitterWnd m_splitterWnd; // Operations public: // Overrides // ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMainFrame)
}
|
Troisième
phase de l'opération
Dans la classe CMainFrame, il faut rajouter la gestion d'un événement
supplémentaire :
| BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext*
pContext) |
Pour mener à bien ce genre d'action, il est toujours plus simple
d'utiliser Class Wizard.

Quatrième
phase de l'opération
Une fois toutes les étapes précédentes achevées,
il ne reste plus qu'à implémenter le code permettant de
créer les différents panes et d'y lier une classe de type
CView.
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
// Création du splitter
if (m_splitterWnd.CreateStatic(this,2,1))
{
CRect rect;
// recuperation de la taille de la zone
// d'affichage de la frame de l'application
GetClientRect(&rect);
CSize size = rect.Size();
size.cy-=150;
// creation du premier pane
if (m_splitterWnd.CreateView(0,0,RUNTIME_CLASS(CSplitterProgView),size,pContext))
{
// creation du second pane
if (m_splitterWnd.CreateView(1,0,RUNTIME_CLASS(CSplitterProgHtml),CSize(0,0),pContext))
{
// Rend actif par défaut cette vue de l'application au démarrage.
SetActiveView((CView*)m_splitterWnd.GetPane(0,0));
return TRUE;
}
}
}
return CFrameWnd::OnCreateClient(lpcs, pContext);
}
|
Détail des fonctions :
m_splitterWnd.CreateStatic(this // indique la fenêtre parent, ici la mainframe
,2 // indique le nombre de ligne
,1) // indique le nombre de colonne
|
m_splitterWnd.CreateView( 0 // le numéro de la ligne (le compte commence à zéro)
,0 // le numéro de la colonne
,RUNTIME_CLASS(CSplitterProgView) // la classe que l'on veux associer au pane
,size // taille que l'on veut allouer à la view dès son initialisation
,pContext) // le pointeur de context
|
Remarque : ne pas oublier de mettre les "includes" nécessaires
à la bonne compilation du code.