Поделиться через


Представления с одной и несколькими вкладками

Редактор может создавать различные типы представлений. Один из примеров — окно редактора кода, другое — конструктор форм.

Представление с несколькими вкладками — это представление с несколькими вкладками. Например, в редакторе HTML есть две вкладки внизу: конструктор и источник, каждое логическое представление. В представлении конструктора отображается отрисованная веб-страница, а другая отображает HTML-код, который состоит из веб-страницы.

Доступ к физическим представлениям

Физические представления размещают объекты представления документов, каждый из которых представляет представление данных в буфере, например код или форму. Соответственно, каждый объект представления документов имеет физическое представление (идентифицируется как строка физического представления) и обычно одно логическое представление.

В некоторых случаях физическое представление может иметь два или более логических представлений. Ниже приведены примеры редактора с разделенным окном с параллельными представлениями или конструктором форм с графическим интерфейсом или конструктором, а также представлением кода за формой.

Чтобы редактор мог получить доступ ко всем доступным физическим представлениям, необходимо создать уникальную строку физического представления для каждого типа объекта представления документов, который может создать фабрика редакторов. Например, фабрика редактора Visual Basic может создавать объекты представления документов для окна кода и окна конструктора форм.

Создание много табуляции представлений

Хотя объект представления документов должен быть связан с физическим представлением с помощью уникальной строки физического представления, можно поместить несколько вкладок в физическое представление, чтобы обеспечить просмотр данных разными способами. В этой конфигурации с несколькими вкладками все вкладки связаны с одной строкой физического представления, но каждая вкладка имеет другой GUID логического представления.

Чтобы создать представление с несколькими вкладками для редактора, реализуйте интерфейс и свяжите IVsMultiViewDocumentView другой GUID логического представления (LogicalViewID) с каждой создаваемой вкладкой.

Редактор HTML Visual Studio — это пример редактора с несколькими вкладками. На ней есть вкладки конструктора и источника . Чтобы включить эту функцию, с каждой вкладкой связана другая логическая вкладка, вкладка "Конструктор" и LOGICALVIEWID_Code вкладка "Источник". LOGICALVIEWID_TextView

Указав соответствующее логическое представление, VSPackage может получить доступ к представлению, соответствующем определенной цели, например проектированию формы, редактированию кода или коду отладки. Однако одно из окон должно быть определено строкой NULL, и это должно соответствовать основному логическому представлению (LOGVIEWID_Primary).

В следующей таблице перечислены доступные значения логического представления и их использование.

LOGVIEWID GUID Рекомендуемое использование
LOGVIEWID_Primary Представление по умолчанию или основное представление фабрики редактора.

Все фабрики редакторов должны поддерживать это значение. Это представление должно использовать строку NULL в качестве строки физического представления. Для этого значения должно быть задано по крайней мере одно логическое представление.
LOGVIEWID_Debugging Представление отладки. Как правило, сопоставляется с тем же представлением, LOGVIEWID_Debugging что LOGVIEWID_Codeи .
LOGVIEWID_Code Просмотр, запущенный командой View Code .
LOGVIEWID_Designer Просмотр, запущенный командой view Form .
LOGVIEWID_TextView Представление текстового редактора. Это представление, возвращаемое IVsCodeWindow, из которого можно получить доступ IVsTextView.
LOGVIEWID_UserChooseView Предложит пользователю выбрать используемое представление.
LOGVIEWID_ProjectSpecificEditor Передано диалоговое окно "Открыть с помощью"

OpenItem

если пользователь выбирает запись "(Редактор проекта по умолчанию)".

Хотя графические идентификаторы логического представления являются расширяемыми, вы можете использовать только графические идентификаторы логического представления, определенные в VSPackage.

При завершении работы Visual Studio сохраняет GUID фабрики редактора и строки физического представления, связанные с окном документа, чтобы его можно было использовать для повторного открытия окон документов при повторном открытии решения. Только окна, открытые при закрытии решения, сохраняются в файле решения (SUO). Эти значения соответствуют значениям VSFPROPID_guidEditorType , VSFPROPID_pszPhysicalView переданным в propid параметре в методе GetProperty .

Пример

В этом фрагменте показано, как TextView объект используется для доступа к представлению, реализуемого IVsCodeWindow. В этом случае SVsUIShellOpenDocument служба используется для вызова OpenDocumentViaProject и запроса LOGVIEWID_TextView, который получает указатель на рамку окна. Указатель на объект представления документов получается путем вызова GetProperty и указания значения VSFPROPID_DocView. Из объекта QueryInterface представления документа вызывается .IVsCodeWindow В этом случае ожидается, что возвращается текстовый редактор, поэтому объект представления документов, возвращаемый в GetProperty методе, является окном кода.

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;
}