Le premier site francophone dédié au développement Pocket PC


Mise en oeuvre de la classe CSplitter
 
   


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.

 
       
   
 
   
Copyright 2001-2004 - Tous droits réservés
 
   

iPAQ est un produit de COMPAQ.
Visual Tools est un produit de Microsoft Corporation.
Toutes les autres marques et produits présents dans ces pages sont la propriété exclusive de leurs sociétés respectives.