Visualizzazioni con schede singole e multiple
Un editor può creare diversi tipi di visualizzazioni. Un esempio è una finestra dell'editor di codice, un'altra è una finestra di progettazione dei moduli.
Una visualizzazione a più schede è una visualizzazione con più schede. Ad esempio, l'editor HTML ha due schede nella parte inferiore: Progettazione e Origine, ognuna una visualizzazione logica. La visualizzazione progettazione visualizza una pagina Web sottoposta a rendering, mentre l'altra visualizza il codice HTML che comprende la pagina Web.
Accesso alle visualizzazioni fisiche
Le visualizzazioni fisiche ospitano oggetti visualizzazione documento, ognuno dei quali rappresenta una visualizzazione dei dati nel buffer, ad esempio il codice o un modulo. Di conseguenza, ogni oggetto visualizzazione documento ha una visualizzazione fisica (identificata da un elemento noto come stringa di visualizzazione fisica) e in genere una singola visualizzazione logica.
In alcuni casi, tuttavia, una visualizzazione fisica può avere due o più visualizzazioni logiche. Alcuni esempi sono un editor con una finestra divisa con visualizzazioni affiancate o una finestra di progettazione dei moduli con una visualizzazione GUI/progettazione e una visualizzazione code-behind-the-form.
Per consentire all'editor di accedere a tutte le visualizzazioni fisiche disponibili, è necessario creare una stringa di visualizzazione fisica univoca per ogni tipo di oggetto visualizzazione documento che la factory dell'editor può creare. Ad esempio, la factory dell'editor di Visual Basic può creare oggetti visualizzazione documento per una finestra di codice e una finestra di progettazione dei moduli.
Creazione di visualizzazioni a schede diverse
Anche se un oggetto visualizzazione documento deve essere associato a una visualizzazione fisica tramite una stringa di visualizzazione fisica univoca, è possibile inserire più schede nella visualizzazione fisica per consentire la visualizzazione dei dati in modi diversi. In questa configurazione a più schede tutte le schede sono associate alla stessa stringa di visualizzazione fisica, ma a ogni scheda viene assegnato un GUID di visualizzazione logica diverso.
Per creare una visualizzazione a schede multipla per un editor, implementare l'interfaccia IVsMultiViewDocumentView e quindi associare un GUID di visualizzazione logica diverso (LogicalViewID) a ogni scheda creata.
L'editor HTML di Visual Studio è un esempio di editor con una visualizzazione a più schede. Include schede Progettazione e Origine . Per abilitare questa operazione, a ogni scheda è associata una visualizzazione logica diversa, LOGICALVIEWID_TextView
per la scheda Progettazione e LOGICALVIEWID_Code
per la scheda Origine .
Specificando la visualizzazione logica appropriata, un VSPackage può accedere alla visualizzazione corrispondente a uno scopo specifico, ad esempio la progettazione di una maschera, la modifica di codice o il debug del codice. Tuttavia, una delle finestre deve essere identificata dalla stringa NULL e deve corrispondere alla vista logica primaria (LOGVIEWID_Primary
).
Nella tabella seguente sono elencati i valori di visualizzazione logica disponibili e il relativo uso.
LOGVIEWID GUID | Uso consigliato |
---|---|
LOGVIEWID_Primary |
Visualizzazione predefinita/primaria della factory dell'editor. Tutte le factory dell'editor devono supportare questo valore. Questa vista deve usare la stringa NULL come stringa di visualizzazione fisica. Almeno una visualizzazione logica deve essere impostata su questo valore. |
LOGVIEWID_Debugging |
Visualizzazione di debug. In genere, LOGVIEWID_Debugging esegue il mapping alla stessa visualizzazione di LOGVIEWID_Code . |
LOGVIEWID_Code |
Visualizzazione avviata dal comando Visualizza codice . |
LOGVIEWID_Designer |
Visualizzazione avviata dal comando Visualizza modulo . |
LOGVIEWID_TextView |
Visualizzazione editor di testo. Si tratta della visualizzazione che restituisce IVsCodeWindow, da cui è possibile accedere a IVsTextView. |
LOGVIEWID_UserChooseView |
Chiede all'utente di scegliere la visualizzazione da usare. |
LOGVIEWID_ProjectSpecificEditor |
Passato dalla finestra di dialogo Apri con a OpenItem quando l'utente sceglie la voce "(Editor predefinito progetto)". |
Anche se i GUID di visualizzazione logica sono estendibili, è possibile usare solo i GUID di visualizzazione logica definiti nel pacchetto VSPackage.
All'arresto, Visual Studio mantiene il GUID della factory dell'editor e le stringhe di visualizzazione fisica associate alla finestra del documento in modo che possa essere usato per riaprire le finestre dei documenti quando la soluzione viene riaperta. Solo le finestre aperte quando una soluzione viene chiusa vengono mantenute nel file della soluzione (con estensione suo). Questi valori corrispondono ai VSFPROPID_guidEditorType
valori e VSFPROPID_pszPhysicalView
passati nel propid
parametro nel GetProperty metodo .
Esempio
Questo frammento di codice illustra come viene usato l'oggetto TextView per accedere a una visualizzazione che implementa IVsCodeWindow
. In questo caso, il SVsUIShellOpenDocument servizio viene usato per chiamare OpenDocumentViaProject e richiedere LOGVIEWID_TextView
, che ottiene un puntatore a un frame di finestra. Un puntatore all'oggetto visualizzazione documento viene ottenuto chiamando GetProperty e specificando un valore di VSFPROPID_DocView
. Dall'oggetto visualizzazione documento viene QueryInterface
chiamato per IVsCodeWindow
. L'aspettativa in questo caso è che viene restituito un editor di testo e quindi l'oggetto visualizzazione documento restituito nel metodo è una finestra di GetProperty codice.
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;
}