Partager via


TN029 : fenêtres fractionnées

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 fractionnement

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

Dans « séparateurs statiques », la fenêtre de fractionnement 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 fractionnement pour que l’utilisateur lance le fractionnement. 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 crée uniquement le premier volet lors de la CSplitterWnd création.

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 ligne x 2 colonnes : généralement avec des volets dissimilar

  • 2 lignes x 1 colonne : généralement avec des volets dissimilar

  • 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 fractionnement

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 classe de fenêtre d’image enfant MDI (Multi Document Interface) qui contient une fenêtre de fractionnement. Pour plus d’informations sur les fenêtres de fractionnement, consultez Plusieurs types de documents, vues et fenêtres frame.

Terminologie utilisée par l’implémentation

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

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 CSplitterWnd gérée. 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 CWndobjet dérivé, passez la RUNTIME_CLASS de l’objet à la CreateView fonction comme vous le feriez si vous utilisiez une CViewclasse dérivée de -. 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 existe un grand nombre de code dans CSplitterWnd cette CView classe, CObject ::IsKindOf est toujours utilisé avant que ces actions ne soient effectuées.

Barre de fractionnement : 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.

Splitter Box : contrôle dans une dynamique CSplitterWnd 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 du séparateur : intersection d’une barre de fractionnement vertical et d’une barre de fractionnement horizontal. 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 et CSplitterWnd 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, WM_VSCROLL messages 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 CViewclasse dérivée qui utilise les CWnd API de barre de défilement délègue à la barre de défilement partagée s’il 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 repositionnement et le redimensionnement des volets afin qu’ils s’adaptent aussi bien que possible.

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 remplacer ce premier jeu pour fournir une autre image pour les différents composants graphiques d’une fenêtre de fractionnement.

  • 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