Partager via


TN029 : Fenêtres de séparation

Cette note décrit la classe CSplitterWnd MFC, qui fournit des fractionnements de fenêtres et gère le redimensionnement d’autres fenêtres de volet.

Styles de séparateur

Un CSplitterWnd prend en charge deux styles différents de fractionnement des fenêtres.

Dans les « séparateurs statiques », la fenêtre de séparateur crée les volets lors de sa création. L’ordre et le nombre de volets ne changent jamais. Les barres de fractionnement sont utilisées pour redimensionner les différents volets. Vous pouvez utiliser ce style pour afficher une classe d’affichage différente dans chaque volet. L’éditeur de graphiques Visual C++ et le Gestionnaire de fichiers Windows sont des exemples de programmes qui utilisent ce style de fractionnement. Ce style de fenêtre de fractionnement n’utilise pas de boîtes de fractionnement.

Dans « fractionnements dynamiques », des volets supplémentaires sont créés et détruits lorsque l’utilisateur fractionne et dissocie les nouvelles vues. Ce séparateur démarre avec une vue unique et fournit des zones de séparateur pour que l’utilisateur lance la séparation. La fenêtre de fractionnement crée dynamiquement un objet d’affichage lorsque la vue est fractionnée dans une direction. Ce nouvel objet d’affichage représente le nouveau volet. Si la vue est divisée en deux directions à l’aide de l’interface clavier, la fenêtre de fractionnement crée trois objets d’affichage pour les trois nouveaux volets. Pendant que le fractionnement est actif, Windows affiche la zone de fractionnement sous la forme d’une barre de fractionnement entre les volets. Windows détruit des objets d’affichage supplémentaires lorsque l’utilisateur supprime un fractionnement, mais l’affichage d’origine reste jusqu’à ce que la fenêtre de fractionnement elle-même soit détruite. Microsoft Excel et Microsoft Word sont des exemples d’applications qui utilisent le style de séparateur dynamique.

Lorsque vous créez un type de fenêtre de fractionnement, vous devez spécifier le nombre maximal de lignes et de colonnes que le fractionnement gérera. Un séparateur statique crée des volets pour remplir toutes les lignes et colonnes. Un séparateur dynamique ne crée que le premier volet lors de la création du CSplitterWnd.

Le nombre maximal de volets que vous pouvez spécifier pour les séparateurs statiques est de 16 lignes par 16 colonnes. Les configurations recommandées sont les suivantes :

  • 1 rangée x 2 colonnes : généralement avec des volets différents

  • 2 rangées x 1 colonne : généralement avec des volets différents

  • 2 lignes x 2 colonnes : généralement avec des volets similaires

Le nombre maximal de volets que vous pouvez spécifier pour les séparateurs dynamiques est de 2 lignes par 2 colonnes. Les configurations recommandées sont les suivantes :

  • 1 ligne x 2 colonnes : pour les données en colonnes

  • 2 lignes x 1 colonne : pour les données textuelles ou autres

  • 2 lignes x 2 colonnes : pour les données orientées grille ou table

Exemples de diviseurs

De nombreux exemples de programmes MFC utilisent des fenêtres de fractionnement directement ou indirectement. L’exemple général MFC VIEWEX illustre plusieurs utilisations de séparateurs statiques, notamment comment placer un séparateur dans un séparateur.

Vous pouvez également utiliser ClassWizard pour créer une nouvelle classe de fenêtre frame enfant MDI (multiple document interface) qui contient une fenêtre de séparateur. Pour plus d’informations sur les fenêtres de fractionnement, consultez Plusieurs types de documents, vues et fenêtres de cadre.

Terminologie utilisée par l’implémentation

Voici une liste de termes spécifiques aux fenêtres de séparateur :

CSplitterWnd: fenêtre qui fournit des contrôles de fractionnement de volet et des barres de défilement partagées entre tous les volets d’une ligne ou d’une colonne. Vous spécifiez des lignes et des colonnes avec des nombres de base zéro (le premier volet est la ligne = 0 et la colonne = 0).

Volet : fenêtre spécifique à l’application gérée par CSplitterWnd. Un volet est généralement un objet dérivé de la classe CView, mais il peut s’agir d’un objet CWnd qui a l’ID de fenêtre enfant approprié.

Pour utiliser un objet dérivé de CWnd, passez la RUNTIME_CLASS de l’objet à la fonction CreateView comme vous le feriez si vous utilisiez une classe dérivée de CView. Votre classe doit utiliser DECLARE_DYNCREATE et IMPLEMENT_DYNCREATE, car l’infrastructure utilise la création dynamique au moment de l’exécution. Bien qu'il y ait beaucoup de code spécifique à la classe CSplitterWnd dans CView, CObject::IsKindOf est toujours utilisé avant que ces actions ne soient effectuées.

Barre de séparateur : contrôle placé entre les lignes et les colonnes des volets. Il peut être utilisé pour ajuster les tailles des lignes ou des colonnes de volets.

Zone de séparateur : contrôle dans un CSplitterWnd dynamique que vous pouvez utiliser pour créer de nouvelles lignes ou colonnes de volets. Il se trouve en haut des barres de défilement verticales ou à gauche des barres de défilement horizontales.

Intersection de séparateur : intersection d'une barre de séparateur verticale et d'une barre de séparateur horizontale. Vous pouvez le faire glisser pour ajuster simultanément la taille d’une ligne et d’une colonne de volets.

Barres de défilement partagées

La CSplitterWnd classe prend également en charge les barres de défilement partagées. Ces contrôles de barre de défilement sont des enfants de CSplitterWnd et sont partagés avec les différents volets du séparateur.

Par exemple, dans une fenêtre de colonne de 1 ligne x 2, vous pouvez spécifier WS_VSCROLL lors de la création du CSplitterWnd. Windows crée un contrôle de barre de défilement spécial partagé entre les deux volets.

[      ][      ][^]
[pane00][pane01][|]
[      ][      ][v]

Lorsque l'utilisateur déplace la barre de défilement, des messages WM_VSCROLL sont envoyés aux deux vues. Lorsque l’une ou l’autre vue définit la position de la barre de défilement, la barre de défilement partagée est définie.

Notez que les barres de défilement partagées sont les plus utiles avec des objets d’affichage similaires. Si vous mélangez des vues de différents types dans un séparateur, vous devrez peut-être écrire du code spécial pour coordonner leurs positions de défilement. Toute classe CView dérivée qui utilise les API de barre de défilement CWnd délègue à la barre de défilement partagée si elle existe. L’implémentation CScrollView est un CView exemple de classe qui prend en charge les barres de défilement partagées. Les classes qui ne sont pas dérivées des CViewclasses qui s’appuient sur des barres de défilement non-contrôle ou des classes qui utilisent des implémentations Windows standard (par exemple) CEditViewne fonctionnent pas avec la fonctionnalité de barre de défilement partagée de CSplitterWnd.

Tailles minimales

Pour chaque ligne, il existe une hauteur de ligne minimale et, pour chaque colonne, il existe une largeur de colonne minimale. Ce minimum garantit qu’un volet n’est pas trop petit pour être affiché en détail.

Pour une fenêtre de fractionnement statique, la hauteur minimale initiale de ligne et la largeur de colonne est 0. Pour une fenêtre de fractionnement dynamique, la hauteur minimale initiale de ligne et la largeur de colonne sont définies par le paramètre sizeMin de la CSplitterWnd::Create fonction.

Vous pouvez modifier ces tailles minimales à l’aide des fonctions CSplitterWnd ::SetRowInfo et CSplitterWnd ::SetColumnInfo .

Tailles réelles et idéales

La disposition des volets de la fenêtre de fractionnement dépend de la taille du cadre qui les contient. Lorsqu’un utilisateur redimensionne le cadre contenant, le CSplitterWnd repositionne et redimensionne les volets pour qu'ils s'adaptent au mieux.

L’utilisateur peut définir manuellement la hauteur de ligne et les tailles de largeur de colonne, ou le programme peut définir la taille idéale à l’aide de la CSplitterWnd classe. La taille réelle peut être plus petite ou supérieure à l’idéal. Windows ajuste la taille réelle s’il n’y a pas suffisamment de place pour afficher la taille idéale ou s’il y a trop d’espace vide à droite ou en bas de la fenêtre de fractionnement.

Contrôles personnalisés

Vous pouvez remplacer de nombreuses fonctions pour fournir un comportement personnalisé et une interface personnalisée. Vous pouvez modifier ce premier ensemble pour fournir des images alternatives pour les différents éléments graphiques d'une fenêtre de séparation.

  • virtual void OnDrawSpltter(CDC* pDC, ESplitType nType, const CRect& rect);

  • virtual void OnInvertTracker(const CRect& rect);

Vous appelez cette fonction pour créer un contrôle de barre de défilement partagée. Vous pouvez le remplacer pour créer des contrôles supplémentaires en regard de la barre de défilement.

  • virtual BOOL CreateScrollBarCtrl(DWORD dwStyle, UINT nID);

Ces fonctions implémentent la logique de la fenêtre de fractionnement dynamique. Vous pouvez les remplacer pour fournir une logique de fractionnement plus avancée.

  • virtual void DeleteView(int row, int col);

  • virtual BOOL SplitRow(int cyBefore);

  • virtual BOOL SplitColumn(int cxBefore);

  • virtual void DeleteRow(int rowDelete);

  • virtual void DeleteColumn(int colDelete);

Fonctionnalité CView

La CView classe utilise les commandes de haut niveau suivantes pour déléguer à l’implémentation CSplitterWnd . Étant donné que ces commandes sont virtuelles, l’implémentation standard CView ne nécessite pas que l’implémentation entière CSplitterWnd soit liée. Pour les applications qui utilisent CView , mais pas CSplitterWnd, l’implémentation CSplitterWnd ne sera pas liée à l’application.

  • virtual BOOL CanActivateNext(BOOL bPrev = FALSE);

    Vérifie si ID_NEXT_PANE ou ID_PREV_PANE est actuellement possible.

  • virtual void ActivateNext(BOOL bPrev = FALSE);

    Exécute la commande « Volet suivant » ou « Volet précédent ».

  • virtual BOOL DoKeyboardSplit();

    Exécute la commande de fractionnement du clavier, généralement « Fractionnement de fenêtre ».

Voir aussi

Notes techniques par numéro
Notes techniques par catégorie