TN029 : fenêtres fractionnées
Cette remarque décrit MFC CSplitterWnd, classe, qui fournit des fractionnements de fenêtre et gère le redimensionnement d'autres fenêtres de volet.
Styles de séparateur
CSplitterWnd prend en charge deux styles différents de fractionner windows.
Dans « des séparateurs statiques, » la fenêtre fractionnée crée les volets lorsqu'il est créé.La commande et le nombre de volets ne changent jamais.Les barres de fractionnement sont utilisées pour redimensionner les volets différents.Vous pouvez utiliser ce style pour afficher une classe d'affichage différente dans chaque volet.L'éditeur graphique Visual C++ et le gestionnaire de fichiers windows sont des exemples de programmes qui utilisent ce style de séparateur.Ce style de fenêtre fractionnée n'utilise pas les zones de séparateur.
Dans les « windows » fractionné, les volets supplémentaires sont créés et détruits quand l'utilisateur fractionne et vues d'ONU-fractionnements les nouvelles.Ce séparateur commence par une vue unique et fournit des zones de séparation pour l'utilisateur à fractionner équivoque.La fenêtre fractionnée crée dynamiquement un nouvel objet de vue lorsque le mode est fractionnée dans une seule direction.Ce nouvel objet de vue représente le nouveau volet.Si la vue est fractionnée en deux directions à l'aide de l'interface de clavier, la fenêtre fractionnée crée trois objets de vue pour les trois nouveaux volets.Pendant que le fractionnement est actif, les fenêtres affiche la zone de séparateur comme une barre de fractionnement entre les volets.Les fenêtres détruit les objets de vue supplémentaires lorsque l'utilisateur supprime un fractionnement, mais la vue d'origine demeure jusqu'à ce que la fenêtre fractionnée elle-même est détruite.Microsoft Excel et Microsoft Word sont des exemples d'applications qui utilisent le style de fenêtre fractionné.
Lorsque vous créez l'un ou l'autre de type d'une fenêtre fractionnée, vous devez spécifier le nombre maximal de lignes et de colonnes que le séparateur gérera.Un séparateur statique permet de créer des volets pour remplir toutes les lignes et colonnes.Une fenêtre fractionné crée uniquement le premier volet lorsque CSplitterWnd est créé.
Le nombre maximal de volets que vous pouvez spécifier pour les séparateurs statiques est 16 lignes par 16 colonnes.Les configurations recommandées sont :
Ligne 1 X 2 colonnes : généralement avec les volets différents
2 lignes X 1 colonne : généralement avec les volets différents
2 lignes X 2 colonnes : généralement avec les volets semblables
Le nombre maximal de volets que vous pouvez spécifier pour les fenêtres fractionné est 2 lignes par 2 colonnes.Les configurations recommandées sont :
Ligne 1 X 2 colonnes : pour les données colomnaires
2 lignes X 1 colonne : pour données textuelles ou alternatives
2 lignes X 2 colonnes : pour la grille ou les données orientées par tableau
Exemples de séparateur
Plusieurs des exemples de programmes MFC utilisent des fenêtres fractionnées directement ou indirectement.L'exemple général VIEWEX MFC illustre plusieurs utilisations des séparateurs statiques, y compris comment placer un séparateur dans un séparateur.
Vous pouvez également utiliser l'assistant classe pour créer une classe enfant (MDI) de la fenêtre frame de nouvelle interface multidocument qui contient une fenêtre fractionnée.Pour plus d'informations sur les fenêtres fractionnées, consultez Plusieurs types de documents, vues, et fenêtres frame.
Terminologie utilisée par implémentation
Voici la liste des termes qui sont spécifiques à des fenêtres fractionnées :
CSplitterWnd:
Une fenêtre qui fournit volet-fractionner les contrôles et les barres de défilement partagés entre tous les volets sur une ligne ou colonne.Vous spécifiez des lignes et des colonnes avec des numérations de base (le premier volet est ligne = 0 et colonne = 0).Volet :
Une fenêtre spécifique à l'application qu' CSplitterWnd gère.Un volet est généralement un objet dérivé de CView, classe, mais peut être n'importe quel objet de CWnd qui contient un ID appropriée de fenêtre enfantPour utiliser CWndobjet dérivé, passez RUNTIME_CLASS de l'objet à la fonction d' CreateView comme si vous avez utilisé 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 y ait beaucoup de code dans CSplitterWnd spécifique à la classe d' CView , CObject::IsKindOf est toujours utilisé avant que ces actions sont exécutées.
Barre de fractionnement :
Un contrôle qui est placé entre les lignes et les colonnes des volets.Elle peut être utilisée pour ajuster les tailles des lignes ou des colonnes des volets.Zone de séparateur :
Un contrôle dans CSplitterWnd dynamique que vous pouvez utiliser pour créer de nouvelles lignes ou colonnes des volets.Il se trouve en haut vertical ou à gauche des barres de défilement horizontale.Intersection de séparateur :
L'intersection d'une barre de fractionnement verticale et d'une barre de fractionnement horizontal.Vous pouvez le faire glisser pour ajuster la taille d'une ligne et une colonne les volets simultanément.
Barres de défilement partagées
La classe d' CSplitterWnd prend également en charge des barres de défilement partagées.Ces contrôles de barre de défilement sont des enfants d' CSplitterWnd et sont partagés avec différents volets dans le séparateur.
Par exemple, dans une ligne 1 X fenêtre de 2 colonnes, vous pouvez spécifier WS_VSCROLL en créant CSplitterWnd.Les fenêtres crée un contrôle de barre de défilement spécial qui est partagé entre les deux volets.
[ ][ ][^]
[pane00][pane01][|]
[ ][ ][v]
Lorsque l'utilisateur déplace la barre de défilement, les messages d' WM_VSCROLL seront envoyés aux deux vues.Lorsque l'un ou l'autre de vue définit la position de la barre de défilement, la barre de défilement partagée sera définie.
Notez que les barres de défilement partagées sont très utiles avec les objets de vue similaires.Si vous combinez des vues de différents dans un séparateur, vous pouvez devoir écrire de code spécial pour coordonner leur position de défilement.Tout CView- la classe dérivée qui utilise les API de barre de défilement d' CWnd la délèguera à la barre de défilement partagée s'il existe.l'implémentation d' CScrollView est un exemple d'une classe d' CView qui prend en charge les barres de défilement partagées.Les classes qui ne sont pas dérivées d' CView, les classes qui dépendent de barres de défilement non-contrôle, ou les classes qui utilisent des implémentations windows standard (par exemple, CEditView) ne fonctionnent pas avec la configuration partagée de barre de défilement d' CSplitterWnd.
Tailles minimales
Pour chaque ligne il existe une hauteur de ligne minimum, et pour chaque colonne il y a une largeur de colonne minimale.Ce minimum garantit qu'un volet n'est pas trop petit pour être affiché dans le détail complet.
Pour une fenêtre fractionnée statique, la hauteur de ligne et la largeur de colonne minimale initiales est 0.Pour une fenêtre fractionnée dynamique, la hauteur de ligne et la largeur de colonne minimale initiales sont définies par le paramètre d' sizeMin de la fonction d' CSplitterWnd::Create .
Vous pouvez modifier ces dimensions minimales à l'aide de CSplitterWnd::SetRowInfo et CSplitterWnd::SetColumnInfo s'exécute.
Réel et.Tailles idéale
La disposition des volets de la fenêtre fractionnée dépend de la taille du cadre qui les contient.Lorsqu'un utilisateur redimensionne le frame qui contient, CSplitterWnd repositionne et redimensionne les volets afin qu'ils tiennent ainsi que possible.
L'utilisateur peut définir manuellement les tailles de hauteur de ligne et la largeur de colonne, ou le programme peut définir la taille idéale à l'aide de la classe d' CSplitterWnd .La grandeur réelle peut être plus petite ou supérieure à l'idéal.Les fenêtres s'ajustent grandeur réelle s'il n'y a pas assez d'espace pour afficher la taille idéale ou s'il y a trop d'espace vide sur la droite ou le bas de la fenêtre fractionnée.
Contrôles personnalisés
Vous pouvez substituer de nombreuses fonctions pour fournir un comportement personnalisé et une interface personnalisée.Vous pouvez substituer ce premier jeu pour fournir d'autres images pour les différents composants graphiques d'une fenêtre fractionnée.
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é.Vous pouvez le substituer 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 fractionnée dynamique.Vous pouvez substituer ces éléments pour fournir une logique plus avancée de séparateur.
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 classe d' CView utilise les commandes de niveau supérieur suivantes de la délégation à CSplitterWnd l'implémentation.Étant donné que ces commandes sont virtuelles, l'implémentation standard d' CView ne nécessite pas l'implémentation complète d' CSplitterWnd à lier en.Pour les applications qui utilisent CView mais pas CSplitterWnd, l'implémentation de CSplitterWnd ne sera pas lié à l'application.
virtual BOOL CanActivateNext(BOOL bPrev = FALSE);
Vérifie s'ID_NEXT_PANE ou ID_PREV_PANE est possible actuellement.virtual void ActivateNext(BOOL bPrev = FALSE);
Exécute la commande « de volet suivant » ou « de volet précédent ».virtual BOOL DoKeyboardSplit();
Exécute la commande fractionnée de clavier, généralement « fenêtre fractionnée ».