Vues uniques et multiples d’ongletSingle and Multi-tab Views

Un éditeur peut créer différents types de vues.An editor can create different types of views. Par exemple, une fenêtre d’éditeur de code, un autre est un concepteur de formulaires.One example is a code editor window, another is a forms designer.

Une vue dotée de plusieurs onglets est une vue qui comporte plusieurs onglets.A multi-tabbed view is a view that has multiple tabs. Par exemple, l’éditeur HTML comporte deux onglets en bas : conception et Source, chaque une vue logique.For example, the HTML editor has two tabs at the bottom: Design and Source, each a logical view. La vue de conception affiche une page web affichée, tandis que l’autre affiche le code HTML qui comprend la page web.The design view displays a rendered web page, while the other displays the HTML that comprises the web page.

L’accès aux affichages physiquesAccessing Physical Views

Les affichages physiques hébergent des objets de vue de document, représentant chacune une vue de données dans la mémoire tampon, tels que le code ou d’un formulaire.Physical views host document view objects, each representing a view of data in the buffer, such as code or a form. En conséquence, chaque objet de vue de document a un affichage physique (identifiées par un processus appelé une chaîne d’affichage physique) et, en général une vue logique unique.Accordingly, each document view object has a physical view (identified by something known as a physical view string), and generally a single logical view.

Cependant, dans certains cas, une vue physique peut avoir deux ou plusieurs affichages logiques.In some cases, though, a physical view can have two or more logical views. Un éditeur qui a une fenêtre fractionnée avec des vues côte à côte ou un concepteur de formulaires qui a une vue de conception / l’interface utilisateur graphique et une vue de code-behind-du-formulaire sont des exemples.Some examples are an editor that has a split window with side-by-side views, or a forms designer that has a GUI/design view and a code-behind-the-form view.

Pour activer votre éditeur afin d’accéder à tous les affichages physiques disponibles, vous devez créer une chaîne d’affichage physique unique pour chaque type d’objet de vue de document que votre fabrique d’éditeur peut créer.To enable your editor to access all of the available physical views, you must create a unique physical view string for each type of document view object that your editor factory can create. Par exemple, le Visual BasicVisual Basic fabrique d’éditeur peut créer le document pour une fenêtre de code et une fenêtre de Concepteur de formulaires, les objets de vue.For example, the Visual BasicVisual Basic editor factory can create document view objects for a code window and a forms designer window.

Création de vues d’à plusieurs ongletsCreating Multi-Tabbed Views

Alors qu’un objet de vue de document doit être associé à une vue physique dans une chaîne d’affichage physique unique, vous pouvez placer plusieurs onglets dans la vue physique pour permettre la consultation des données de différentes façons.Though a document view object must be associated with a physical view through a unique physical view string, you can place multiple tabs within the physical view to enable the viewing of data in different ways. Dans cette configuration à plusieurs onglets, tous les onglets sont associés à la même chaîne d’affichage physique, mais chaque onglet est donné à un autre affichage logique GUID.In this multi-tabbed configuration, all tabs are associated with the same physical view string, but each tab is given a different logical view GUID.

Pour créer une vue à plusieurs onglets pour un éditeur, vous devez implémenter la IVsMultiViewDocumentView de l’interface, puis associer un autre affichage logique GUID (LogicalViewID) avec chaque onglet que vous créez.To create a multi-tabbed view for an editor, implement the IVsMultiViewDocumentView interface and then associate a different logical view GUID (LogicalViewID) with each tab you create.

L’éditeur HTML de Visual Studio est un exemple d’un éditeur avec une vue de l’onglet multiples.The Visual Studio HTML editor is an example of an editor with a multi-tab view. Il a conception et Source onglets.It has Design and Source tabs. Pour ce faire, un autre affichage logique est associé à chaque onglet, LOGICALVIEWID_TextView pour le conception onglet et LOGICALVIEWID_Code pour le Source onglet.To enable this, a different logical view is associated with each tab, LOGICALVIEWID_TextView for the Design tab and LOGICALVIEWID_Code for the Source tab.

En spécifiant la vue logique appropriée, un VSPackage peut accéder à la vue qui correspond à un usage particulier, telles que la création d’un formulaire, de modification de code ou de débogage du code.By specifying the appropriate logical view, a VSPackage can access the view that corresponds to a particular purpose, such as designing a form, editing code, or debugging code. Toutefois, une fenêtre du doit être identifiée par la chaîne de valeur NULL et que cet attribut doit correspondre à la vue logique principale (LOGVIEWID_Primary).However, one of the windows must be identified by the NULL string and this must correspond to the primary logical view (LOGVIEWID_Primary).

Le tableau suivant répertorie les valeurs d’affichage logique disponibles et leur utilisation.The following table lists the available logical view values and their use.

GUID DE LOGVIEWIDLOGVIEWID GUID Utilisation recommandéeRecommended Use
LOGVIEWID_Primary Vue principal par défaut de la fabrique d’éditeur.Default/primary view of the editor factory.

Toutes les fabriques d’éditeur doivent prendre en charge cette valeur.All editor factories must support this value. Cette vue doit utiliser la chaîne de valeur NULL en tant que sa chaîne d’affichage physique.This view must use the NULL string as its physical view string. Au moins une vue logique doit être définie à cette valeur.At least one logical view must be set to this value.
LOGVIEWID_Debugging Affichage de débogage.Debugging view. En règle générale, LOGVIEWID_Debugging est mappé à la même vue comme LOGVIEWID_Code.Typically, LOGVIEWID_Debugging maps to the same view as LOGVIEWID_Code.
LOGVIEWID_Code Vue lancé par le afficher le Code commande.View launched by the View Code command.
LOGVIEWID_Designer Vue lancé par le afficher le formulaire commande.View launched by the View Form command.
LOGVIEWID_TextView Affichage de l’éditeur de texte.Text editor view. C’est la vue retourne IVsCodeWindow, à partir de laquelle vous pouvez accéder à IVsTextView.This is the view that returns IVsCodeWindow, from which you can access IVsTextView.
LOGVIEWID_UserChooseView Invite l’utilisateur à choisir la vue à utiliser.Prompts the user to choose which view to use.
LOGVIEWID_ProjectSpecificEditor Passé par le ouvrir avec la boîte de dialoguePassed by the Open With dialog box to

OpenItem

Quand l’utilisateur choisit l’entrée « (éditeur par défaut projet) ».when the user chooses the "(Project default editor)" entry.

Bien que la vue logique GUID sont extensibles, vous pouvez utiliser uniquement les GUID de vue logique définies dans votre VSPackage.Although logical view GUIDs are extensible, you can use only the logical view GUIDs defined in your VSPackage.

Lors de l’arrêt, Visual Studio conserve le GUID de la fabrique d’éditeur et les chaînes d’affichage physique associées à la fenêtre de document afin qu’il peut être utilisé pour ouvrir les fenêtres de document lors de la solution est à nouveau ouvert.On shutdown, Visual Studio retains the GUID of the editor factory and the physical view strings associated with the document window so that it can be used to re-open document windows when the solution is re-opened. Seules les fenêtres qui sont ouverts lors de la fermeture d’une solution sont conservées dans le fichier solution (.suo).Only windows that are open when a solution is closed are persisted in the solution (.suo) file. Ces valeurs correspondent à la VSFPROPID_guidEditorType et VSFPROPID_pszPhysicalView les valeurs passées dans les propid paramètre dans le GetProperty (méthode).These values correspond to the VSFPROPID_guidEditorType and VSFPROPID_pszPhysicalView values passed in the propid parameter in the GetProperty method.

ExempleExample

Cet extrait de code illustre comment la TextView objet est utilisé pour accéder à une vue qui implémente IVsCodeWindow.This snippet illustrates how the TextView object is used to access a view that implements IVsCodeWindow. Dans ce cas, le SVsUIShellOpenDocument service est utilisé pour appeler OpenDocumentViaProject et demande LOGVIEWID_TextView, qui obtient un pointeur vers un frame de fenêtre.In this case, the SVsUIShellOpenDocument service is used to call OpenDocumentViaProject and request LOGVIEWID_TextView, which obtains a pointer to a window frame. Un pointeur vers l’objet de vue de document est obtenu en appelant GetProperty et en spécifiant une valeur de VSFPROPID_DocView.A pointer to the document view object is obtained by calling GetProperty and specifying a value of VSFPROPID_DocView. À partir de l’objet de vue de document, QueryInterface est appelée pour IVsCodeWindow.From the document view object, QueryInterface is called for IVsCodeWindow. L’attente est dans ce cas qu’un éditeur de texte est retourné et par conséquent, l’objet de vue de document est retourné dans le GetProperty méthode est une fenêtre de code.The expectation in this case is that a text editor is returned, and so the document view object returned in the GetProperty method is a code window.

HRESULT CFindTool::GotoFileLocation(const WCHAR * szFile, long iLine, long iStart, long iLen)  
{  
  HRESULT hr;  
  if (NULL == szFile || !*szFile)  
    return E_INVALIDARG;  

  if (iLine == -1L)  
    return S_FALSE;  

  VSITEMID                  itemid;  
  VARIANT                   var;  
  RECT                      rc;  
  IVsUIShellOpenDocument *  pOpenDoc    = NULL;  
  IVsCodeWindow *           pCodeWin    = NULL;  
  IVsTextView *             pTextView   = NULL;  
  IVsUIHierarchy *          pHierarchy  = NULL;  
  IVsWindowFrame *          pFrame      = NULL;  
  IUnknown *                pUnk        = NULL;  
  IVsHighlight *            pHighlight  = NULL;  

  IfFailGo(CGlobalServiceProvider::HrQueryService(SID_SVsUIShellOpenDocument, IID_IVsUIShellOpenDocument, (void **)&pOpenDoc));  
  IfFailGo(pOpenDoc->OpenDocumentViaProject(szFile, LOGVIEWID_TextView, NULL, &pHierarchy, &itemid, &pFrame));  
  pFrame->Show();  
  VariantInit(&var);  
  IfFailGo(pFrame->GetProperty(VSFPROPID_DocView, &var));  
  if (VT_UNKNOWN != var.vt) { hr = E_FAIL; goto Error; }  
  pUnk = V_UNKNOWN(&var);  
  if (NULL != pUnk)  
  {  
    IfFailGo(pUnk->QueryInterface(IID_IVsCodeWindow, (void **)&pCodeWin));  
    if (SUCCEEDED(hr = pCodeWin->GetLastActiveView(&pTextView)) ||  
        SUCCEEDED(hr = pCodeWin->GetPrimaryView(&pTextView)) )  
    {  
      pTextView->SetSelection(iLine, iStart, iLine, iStart + iLen);  
      // uncover selection  
      IfFailGo(pTextView->QueryInterface(IID_IVsHighlight, (void**)&pHighlight));  
      IfFailGo(SUCCEEDED(pHighlight->GetHighlightRect(&rc)));  
      UncoverSelectionRect(&rc);  
    }  
  }  

Error:  
  CLEARINTERFACE(pHighlight);  
  CLEARINTERFACE(pTextView);  
  CLEARINTERFACE(pCodeWin);  
  CLEARINTERFACE(pUnk);  
  CLEARINTERFACE(pFrame);  
  CLEARINTERFACE(pOpenDoc);  
  CLEARINTERFACE(pHierarchy);  
  RedrawWindow(m_hwndResults, NULL, NULL, RDW_ERASE|RDW_FRAME|RDW_INVALIDATE|RDW_ALLCHILDREN);  
  return hr;  
}  

Voir aussiSee Also

Prend en charge plusieurs vues de Document Supporting Multiple Document Views
Comment : joindre des vues de données de document How to: Attach Views to Document Data
Création d’éditeurs et de concepteurs personnalisésCreating Custom Editors and Designers