среда, 7 ноября 2007 г.

Опярация ГЫ или Создание своего редакотра файлов для Visual Studio. Часть первая. Описательная.

В этом цикле статей я постараюсь описать то, что я мог понять в Visual Studio SDK)

С самого начала меня подстерегали неудачи( Сначало Установка СДК повисла в самом конце установки, но выключение её через TaskManager все поправило) Но для чего я начал изучение этого СДК? Конечно для того, что бы написать свой собственный редактор Гуи-файлов для моего браузера. Да-да. Я знаю, что есть WPF, у которой формы хранятся в Xml. Но, "нормальные герои всегда идут в обход"))) но дело не в этом. Мне начинает казаться, что MS пишет все, что бы превратить проггеров в Быдло-Кодеров( слишком упрощяют жизнь прогерам) Но это не единственная прричина. У меня всегда были проблемы с парсингом и прочей лабудой. Это будет мне хорошим опытом)

И так. Начнем!

Первое что я начал делать это открыл пример Editor with Toolbox.

Что же я в нем увидел.

Сначало я начал рассматривать файл "EditorPane.cs"
В нем, как не сложно понять, находится класс EditorPane.

Сначала я перешел к методам. По-моему, это самое логичное решение)
Методы Disposing'а я не буду здесь описывать. Они нам пока не интересны.

public int QueryStatus(ref Guid pguidCmdGroup, uint cCmds, OLECMD[] prgCmds, IntPtr pCmdText)
Этот метод возвращает определеные значения перечисления OLECMDF о доступности какой-либо функции вида: "копировать", "вставить", "вырезать", "отметнить".... и т.д.

public int Exec(ref Guid pguidCmdGroup, uint nCmdID, uint nCmdexecopt, IntPtr pvaIn, IntPtr pvaOut)
Который соответственно выполняет одну из указанных команд.

int Microsoft.VisualStudio.OLE.Interop.IPersist.GetClassID(out Guid pClassID)
int IPersistFileFormat.GetClassID(out Guid pClassID)
Я пока не разобрался, что он делает.

int IPersistFileFormat.GetCurFile(out string ppszFilename, out uint pnFormatIndex)
Возвращает имя файла, с которым сейчас работает редактор. И индекс формата файла(если один вариант формата, то пишем 0)

int IPersistFileFormat.GetFormatList(out string ppszFormatList)
Возвращает строку формата файла. Пример:
"HTML File (*.htm; *.html; *.asp)\n*.htm;*.html;*.asp\nText File (*.txt)\n*.txt\n."

int IPersistFileFormat.SaveCompleted(string pszFilename)
Определяет сохранен ли файл. Если нет, то VSConstants.S_FALSE, иначе VSConstants.S_OK.

int IPersistFileFormat.InitNew(uint nFormatIndex)
Инициализация объекта с указанием текущего индеа формата.

int IPersistFileFormat.IsDirty(out int pfIsDirty)
Изменен ли файл с момента последнего сохранения.

int IPersistFileFormat.Load(string pszFilename, uint grfMode, int fReadOnly)
Загрузка файла.

int IPersistFileFormat.Save(string pszFilename, int fRemember, uint nFormatIndex)
Сохранение файла.

int IVsPersistDocData.Close()
Видимо это метод, вызывающийся при закрытии файла или редактора.

int IVsPersistDocData.GetGuidEditorType(out Guid pClassID)
Возвращает гуид класса, который создал этот объект.

int IVsPersistDocData.IsDocDataDirty(out int pfDirty)
Проверяет изменен ли документ с момента последнего сохранения. (Опять???)

int IVsPersistDocData.IsDocDataReloadable(out int pfReloadable)
Возвращает возможность перезагрузить документ.

int IVsPersistDocData.LoadDocData(string pszMkDocument)
Загружает файл(Опять???)

int IVsPersistDocData.OnRegisterDocData(uint docCookie, IVsHierarchy pHierNew, uint itemidNew)
ХЗ ч0

int IVsPersistDocData.ReloadDocData(uint grfFlags)
Перезагрузает документ.

int IVsPersistDocData.RenameDocData(uint grfAttribs, IVsHierarchy pHierNew, uint itemidNew, string pszMkDocumentNew)
Переименовывает данные документа... в общем опять ХЗ ч0.

int IVsPersistDocData.SaveDocData(Microsoft.VisualStudio.Shell.Interop.VSSAVEFLAGS dwSave, out string pbstrMkDocumentNew, out int pfSaveCanceled)
Сохраняет данные документа... ппц просто.

int IVsPersistDocData.SetUntitledDocPath(string pszDocDataPath)
Используется для инициализации донных документа, который только что создан и не сохранен.

int IVsToolboxUser.IsSupported(IOleDataObject pDO)
Поддерживает ли панель редактора объект.

int IVsToolboxUser.ItemPicked(IOleDataObject pDO)
Вызывается при активации объекта в тулбоксе.

Дальше идет список событий от RitchTextBox'a, который является контроллом нашего редактора. Мы их пропустим.

Дельше следуют еще две функции CanEditFile() и NotifyDocChanged().

NotifyDocChanged()
Оч. полезная функция, в которой показано, как указать пользователю, что файл изменен.
CanEditFile()
Определяет можно ли редактировать файл.

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

Дальше я посмотрел файл EditorControl.cs. В нем находится контрол редактора, а именно RitchTextBox... и больше ничего(

Идем дальше.EditFactory.cs. Как видно из названия здесь реализована фабрика редактора. Попробуем разобраться.

public int SetSite(IOleServiceProvider psp)
Служит для установки провайдера сервисов, с помощью которого вы сможете создавать объекты по гуиду.

public int MapLogicalView(ref Guid rguidLogicalView, out string pbstrPhysicalView)
Вроде служит для проверки возможности вида редактора(во время дебага, нормальный режим)...

public int Close()
Закрытие фабрики.

public int CreateEditorInstance(
uint grfCreateDoc,
string pszMkDocument,
string pszPhysicalView,
IVsHierarchy pvHier,
uint itemid,
System.IntPtr punkDocDataExisting,
out System.IntPtr ppunkDocView,
out System.IntPtr ppunkDocData,
out string pbstrEditorCaption,
out Guid pguidCmdUI,
out int pgrfCDW)

Создает сам редактор.

public object GetService(Type serviceType)
Вспомагательный метод для создания объекта из его типа.

Вот и все на сегодня) мне пора спать)
Удачи!

понедельник, 5 ноября 2007 г.

SCCSBrowser codename Malta. Версия от 06.11.2007

Представляю вашему вниманию мою разработку, а именно трехмерный браузер!
Прошу любить и жаловать!

Вот текущая версия браузера

А вот ссылка с тестовой страницей:
http://3d.rawa.ru/TestPages/06.11.2007/TestPage

Вводить именно так!

Интересные ссылочки, программы и вообще то, что может быть необходимо в программировании

Описание работы с компилятором Visual Studio 2005-2008 и форматом файлов проектов
Описания, позволяющие сделать очень точную настройку проекта C# или VB.NET

Нововведения в C# 3.0
Очень полезная статья об особенностях C#. Лучше её прочитать всем, кто занимается языком C#.

Описание использования тестов в Visual Studio 2003/2005/2008(Англ.)
Полезная статья для тех, кто пишет сложные алгоритмические программы.

Трехмерный сканер объектов из Веб-Камеры и Лазерой указки

Интересная прогрмма для моздания 3д-моелей с помощью сканирования.