새로 추가 되거나 변경 된 동작 편집기 어댑터 사용
이전 버전의 Visual Studio 코어 편집기에 대해 작성 된 코드를 업데이트 하는 경우 편집기 어댑터 (또는 shim)이 새로운 API를 사용 하는 대신 사용 하려는 편집기 어댑터 이전 코어 편집기에는 다음과 같은 차이점을 알고 있어야 합니다.
기능
Setsite()를 사용 하 여
호출 해야 SetSite 랑 버퍼가 텍스트, 텍스트 보기와는 다른 작업을 수행 하기 전에 windows 코드입니다. 그러나이 사용 하는 경우 필요 하지 않습니다을 IVsEditorAdaptersFactoryService 이 서비스의 Create() 메서드 자체를 호출 하므로 만들고 SetSite.
콘텐츠를 자신의 IVsCodeWindow 및 IVsTextView 호스팅
모두 호스팅할 수 있습니다 IVsCodeWindow 및 IVsTextView Win32 모드 또는 WPF 모드를 사용 하 여 사용자 고유의 콘텐츠를 합니다. 그러나, 두 가지 모드에서 약간의 차이 점을 유지 해야 합니다.
버전 IVsCodeWindow w i n 32와 WPF를 사용 하 여
코드 편집기 창에서 파생 된 WindowPane, 오래 된 w i n 32를 구현 하는 IVsWindowPane 과 새 WPF 인터페이스 IVsUIElementPane 인터페이스입니다. 사용할 수는 Microsoft#VisualStudio#Shell#Interop#IVsWindowPane#CreatePaneWindow 메서드는 HWND 기반 호스팅 환경을 만들 수 나는 Microsoft#VisualStudio#Shell#Interop#IVsUIElementPane#CreateUIElementPane WPF 호스팅 환경을 만드는 방법입니다. 원본 편집기는 항상 WPF를 사용 하지만이 창을 직접 콘텐츠를 직접 포함 하는 경우는 호스팅 요구 사항에 적합 한 창 종류를 만들 수 있습니다.
버전 IVsTextView w i n 32와 WPF를 사용 하 여
설정할 수 있는 IVsTextView Win32 모드 또는 WPF에.
HWND 내부에 호스팅되는 기본적으로 텍스트 뷰 편집기 팩터리를 만들 때 및 GetWindowHandle HWND를 반환 합니다. WPF 컨트롤에 있는 편집기를 포함 합니다이 모드를 사용 하지.
텍스트 뷰에서 WPF 모드로 설정 하 여 호출 해야 Initialize 에 전달 하 고 VIF_NO_HWND_SUPPORT 플래그를 초기화 중 하나에 따라는 InitView 매개 변수. 가져올 수 있는 FrameworkElement 를 호출 하 여 CreateUIElementPane.
Win32 모드에서 두 가지 방법으로 WPF 모드와 다릅니다. 첫째, 텍스트 뷰는 WPF 컨텍스트에서 호스팅할 수 있습니다. 캐스팅 하 여 WPF 창에 액세스할 수는 IVsTextView 에 IVsUIElementPane 를 호출 하 고 GetUIObject. 두 번째, GetWindowHandle 스틸 HWND, 하지만이 HWND 사용할 수만 위치를 확인 하 고 포커스를 반환 합니다. 편집기 창 페인트 하는 방법에 영향을 줍니다 때문에이 HWND WM_PAINT 메시지에 응답 하도록 사용 하면 안됩니다. 이 HWND만 새 편집기 코드 전환 방법으로 어댑터를 용이 하 게 하는. 없습니다 사용 해야이 좋습니다 VIF_NO_HWND_SUPPORT 구성 요소에서 반환 된 HWND의 제한으로 인해 작업을 HWND가 필요 하면 GetWindowHandle 이 모드에서는 while.
네이티브 코드에서 매개 변수로 배열 전달
배열이 고 해당 개수를 포함 하는 매개 변수를 사용 하는 많은 방법 레거시 API 편집기에서입니다. 예제는 다음과 같습니다.
네이티브 코드에서 이러한 메서드를 호출 하는 경우 한 번에 하나의 요소를 전달 해야 합니다. 하나 이상의 요소에 전달 하는 경우 전화를 주 interop 구현 문제 때문에 거부 됩니다.
문제 같은 방법으로 복잡 한입니다 SetIgnoreMarkerTypes. 이 메서드가 호출 될 때마다 단순히 세 가지 서로 다른 표식 종류와 3 번이이 메서드를 호출 하는 것이 불가능 하므로 무시 표식 유형 이전 목록을 지웁니다. 유일한 해결 방법은 관리 되는 코드 에서만이 메서드를 호출할 수 있습니다.
스레딩
항상 버퍼 어댑터 UI 스레드에서만 호출 해야 합니다. 버퍼 어댑터 즉, 관리 코드에서를 호출 하 여 COM 마샬링을 무시 하 고 UI 스레드로 호출 자동으로 마샬링될 수 있는 관리 되는 개체입니다. 백그라운드 스레드에서 버퍼 어댑터를 호출 하는 경우 사용 해야 Invoke 또는 유사한 방법.
LockBuffer 메서드
모든 LockBuffer() 메서드는 사용 되지 않습니다. 예제는 다음과 같습니다.
이벤트 커밋
커밋할 이벤트는 지원 되지 않습니다. 이러한 이벤트에 대 한 조언 하는 메서드 호출에서 오류 코드를 반환 하는 메서드를 발생 합니다.
IVsPreliminaryTextChangeCommitEvents
IVsFinalTextChangeCommitEvents
IVsUndoRedoClusterWithCommitEvents
TextEditorEvents
TextEditorEvents Commit()에서 더 이상 발생 합니다. 대신, 모든 텍스트 변경을 발사 하십시오.
텍스트 마커
호출 해야 Invalidate 에서 IVsTextMarker 개체를 제거 하면 됩니다. 이전 버전에만 마커를 릴리스 했습니다.
줄 번호
다양 한 방법에 대 한 IVsTextView 및 IVsTextViewEx, 줄 번호를 내부 버퍼 줄 번호에 해당, 없는 줄 번호 개요 및 줄 바꿈 Visual Studio 2008에 그 영향을 주는 요소입니다.
영향을 받는 방법 (목록은 철저 하 게) 다음을 포함 합니다.
개요
클라이언트의 IVsHiddenTextSession 를 사용 하 여 추가 된 이러한 개요 영역 에서만 볼 수 AddHiddenRegions또는 AddHiddenRegionsEx. 편집기 어댑터를 통해 추가 되지 않았기 때문에 임시 영역이 표시 됩니다. 마찬가지로, 이러한 클라이언트 편집기 어댑터 대신 새 코드 편집기를 사용 하는 (c + +, C# 등) 언어에서 추가 영역 개요 표시 되지 않습니다.
줄 높이
새 편집기에서 다른 줄을 기준으로 선의 이동 될 수 있습니다 가능한 줄 변형 글꼴 크기에 따라 높이가 서로 다른 텍스트 줄 있을 수 있습니다. 같은 방법을 사용 하 여 반환 되는 줄 높이 GetLineHeight 줄 변환을 적용으로 기본 글꼴 크기를 사용 하 여 한 줄의 높이입니다. 이 높이 있고 보기에서 줄의 실제 높이 반영할 수 있습니다.
이벤트 기록 및 실행 취소
새 편집기에서 보기 렌더링 및 실행 취소 클러스터 열려 있는 경우에 이벤트를 계속 발생 하는 것과 같은 작업을 수행 하려면 계속 됩니다. 이 동작의 실행 취소 클러스터의 뒤에 닫는 때까지 작업을 수행 하지 않은 기존 보기를 다릅니다.
IntelliSense
- UpdateTipWindow 메서드 중 하나를 구현 하지 않는 클래스에 전달 하는 경우 실패 IVsTextTipWindow2 또는 IVsMethodTipWindow3. 사용자 지정 Win32 팝업이 소유자가 그린 더 이상 지원 되지 않습니다.
스마트 태그
를 사용 하 여 만든 스마트 태그에 대 한 어댑터 지원 하지 않습니다 IVsSmartTagData, IVsSmartTagTipWindow, 및 IVsSmartTagTipWindow2 인터페이스입니다.
DTE
IncrementalSearch은 구현되지 않았습니다.
구현 되지 않은 메서드
텍스트 버퍼 어댑터, 텍스트 뷰 어댑터 및 텍스트 레이어 어댑터에서 일부 메서드가 구현 되지 않은.
Interface |
구현 되지 않음 |
---|---|
Reload(false)은 구현되지 않았습니다. |
|
SetSubjectFromPrimaryBuffer어댑터 개요 UI에서 무시 되지만 구현 됩니다. |
|
GetBannerAttr어댑터 개요 UI에서 무시 되지만 구현 됩니다. |