Симон Робинсон - C# для профессионалов. Том II

Тут можно читать онлайн Симон Робинсон - C# для профессионалов. Том II - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming, издательство Лори, год 2003. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    C# для профессионалов. Том II
  • Автор:
  • Жанр:
  • Издательство:
    Лори
  • Год:
    2003
  • Город:
    Москва
  • ISBN:
    5-85582-187-0
  • Рейтинг:
    4.88/5. Голосов: 81
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 100
    • 1
    • 2
    • 3
    • 4
    • 5

Симон Робинсон - C# для профессионалов. Том II краткое содержание

C# для профессионалов. Том II - описание и краткое содержание, автор Симон Робинсон, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru
C# для профессионалов

Платформа .NET предлагает новую среду, в которой можно разрабатывать практически любое приложение, действующее под управлением Windows, а язык C# — новый язык программирования, созданный специально для работы с .NET.

В этой книге представлены все основные концепции языка C# и платформы .NET. Полностью описывается синтаксис C#, приводятся примеры построения различных типов приложений с использованием C# — создание приложений и служб Windows, приложений и служб WWW при помощи ASP.NET, а также элементов управления Windows и WWW Рассматриваются общие библиотеки классов .NET, в частности, доступ к данным с помощью ADO.NET и доступ к службе Active Directory с применением классов DirectoryServices.

Для кого предназначена эта книга

Эта книга предназначена для опытных разработчиков, возможно, имеющих опыт программирования на VB, C++ или Java, но не использовавших ранее в своей работе язык C# и платформу .NET. Программистам, применяющим современные технологии, книга даст полное представление о том, как писать программы на C# для платформы .NET.

Основные темы книги

• Все особенности языка C#

• C# и объектно-ориентированное программирование

• Приложения и службы Windows

• Создание web-страниц и web-служб с помощью ASP NET

• Сборки .NET

• Доступ к данным при помощи ADO NET

• Создание распределённых приложений с помощью NET Remoting

• Интеграция с COM, COM+ и службой Active Directory

C# для профессионалов. Том II - читать онлайн бесплатно полную версию (весь текст целиком)

C# для профессионалов. Том II - читать книгу онлайн бесплатно, автор Симон Робинсон
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

if (!documentHasData) {

documentSize = new Size(100, 200);

} else {

documentSize.Height = (int)(nLines*lineHeight) + 2*(int)margin;

uint maxLineLength = 0;

foreach (TextLineInformation nextWord in documentLines) {

uint tempLineLength = nextWord.Width + 2*margin;

if (tempLineLength > maxLineLength) maxLineLength = tempLineLength;

}

documentSize.Width = (int)maxLineLength;

}

this.AutoScrollMinSize = documentSize;

}

Этот метод сначала проверяет, есть ли данные для вывода. Если данных нет, мы слегка схитрим и зададим жестко кодированный размер документа такой величины, чтобы хватило места для выведения большими красными буквами предупреждения . В противном случае необходимо воспользоваться методом MeasureString()для определения реального размера документа.

После этого размер документа сообщается экземпляру класса Form, задавая свойство Form.AutoScrollMinSize. Когда это сделано, за сценой происходит кое-что интересное. В процессе задания этого свойства клиентская область становится недействительной и инициируется событие Paintв связи с тем, что изменение размера документа означает необходимость добавить или изменить панели прокрутки, а также, что вся клиентская область почти наверняка будет перерисована. Это в полной мере иллюстрирует то, что было сказано ранее об использовании метода Form.Invalidate(). Если вернуться назад к коду LoadFile(), то станет понятно, что вызов метода Invalidate()в этом методе является на самом деле излишним. Клиентская область будет объявлена недействительной в любом случае, когда задается размер документа. Явный вызов метода Invalidate()в реализации метода LoadFile()оставлен для иллюстрации. Фактически в этом случае все, что будет делать вызванный метод Invalidate(), является ненужным запросом повторного события Paint. Однако это в свою очередь подтверждает, что Invalidate()дает Windows возможность оптимизировать производительность. Второе событие Paint не будет фактически инициировано: Windows увидит, что в очереди уже находится событие Paint, и сравнит запрошенные недействительные области, чтобы попробовать объединить их. В этом случае оба события Paint будут определять всю клиентскую область, поэтому ничего не нужно делать, и Windows спокойно удалит второй запрос Paint. Конечно, это действие займет какое-то процессорное время, но оно будет ничтожным по сравнению с тем, сколько времени потребуется для реального выполнения рисования.

OnPaint()

Итак, мы увидели, как CapsEditorзагружает файл. Теперь пришло время посмотреть, как выполняется рисование:

protected override void OnPaint(PaintEventArgs e) {

Graphics dc = e.Graphics;

int scrollPositionX = this.AutoScrollPosition.X;

int scrollPositionY = this.AutoScrollPosition.Y;

dc.TranslateTransform(scrollPositionX, scrollPositionY);

if (!documentHasData) {

dc.DrawString("", emptyDocumentFont,

emptyDocumentBrush, new Point(20, 20));

base.OnPaint(e);

return;

}

// определить, какие строки находятся в вырезанном прямоугольнике

int minLineInClipRegion =

WorldYCoordinateToLineIndex(е.ClipRectangle.Top - scrollPositionY);

if (minLineInClipRegion == -1) minLineInClipRegion = 0;

int maxLineInClipRegion =

WorldYCoordinateToLineIndex(e.ClipRectangle.Bottom - scrollPositionY);

if (maxLineInClipRegion >= this.documentLines.Count || maxLineInClipRegion == -1)

maxLineInClipRegion = this.documentLines.Count - 1;

TextLineInformation nextLine;

for (int i = minLineInClipRegion; i <= maxLineInClipRegion; i++) {

nextLine = (TextLineInformation)documentLines[i];

dc.DrawString(nextLine.Text, mainFont, mainBrush, this.LineIndexToWorldCoordinates(i));

}

base.OnPaint(e);

}

В середине этой перезагружаемой версии OnPaint()находится цикл, который перебирает все строки документа, вызывая метод Graphics.DrawString()для рисования каждой из них. Остальная часть этого кода связана в основном с оптимизацией рисования — обычный материал для определения, что действительно необходимо нарисовать вместо необдуманного приказания экземпляру Graphics перерисовать все.

Мы начинаем с проверки, имеются ли в документе какие-либо данные. Если данных нет, мы выводим краткое сообщение, говорящее об этом вызываем реализацию OnPaint()из базового класса и выходим. Если имеются данные, то мы начинаем проверять прямоугольник вырезания. Способ, которым это делается, состоит в вызове другого написанного нами метода WorldYCoordinateToLineIndex(). Мы рассмотрим этот метод позже, но по сути он получает заданную у-позицию относительно верха документа и определяет, какая строка документа будет выводиться в этой точке.

При первом вызове метода WorldYCoordinateToLineIndex()ему передается значение координаты е.ClipRectangle.Top - scrollPositionY. Это верх области вырезания, преобразованный в мировые координаты. Если возвращаемое значение будет -1, мы предположим, что нам нужно начать с начала документа (если верх области вырезания находится наверху граничного поля).

После того, как все это будет сделано, мы практически повторяем тот же процесс для низа прямоугольника вырезания, чтобы определить последнюю строку документа, которая находится внутри области вырезания. Индексы первой и последней строки хранятся соответственно в minLineInClipRegionи maxLineInClipRegion, поэтому мы можем просто выполнить цикл forмежду этими значениями, чтобы реализовать рисование. Внутри цикла рисования мы должны сделать приблизительно обратное преобразование для преобразования, выполненного методом WorldYCoordinateToLineIndex(). Задан индекс строки текста и нужно проверить, где она должна быть нарисована. Это вычисление является вполне простым, но мы поместили его в другой метод LineIndexToWorldCoordinates(), который возвращает требуемые координаты верхнего левого угла элемента. Возвращаемые координаты являются мировыми координатами, и это хорошо, так как мы уже вызвали метод TranslateTransform()на объекте Graphics, поэтому нам нужно передать ему при запросе вывода элемента мировые координаты, а не координаты страницы.

Преобразования координат

В этом разделе мы рассматриваем реализацию вспомогательных методов, которые были использованы в примере CapsEditor, чтобы выполнить преобразование координат. Это методы WorldYCoordinateToLineIndex()и LineIndexToWorldCoordinates(), на которые мы ссылались в предыдущем разделе, а также некоторые другие методы.

Первое. LineIndexToWorldCoordinates()получает заданный индекс строки и определяет мировые координаты верхнего левого угла строки с помощью известных ширины поля и высоты строки:

private Point LineIndexToWorldCoordinates(int index) {

Point TopLeftCorner =

new Point((int)margin, (int)(lineHeight*index + margin));

return TopLeftCorner;

}

Мы также используем метод, который делает приблизительно обратное преобразование в OnPaint(). WorldYCoordinateToLineIndex()определяет индекс строки, но он принимает в расчет только вертикальную мировую координату. Это связано с тем, что метод используется для определения индекса строки, соответствующего верху и низу области вырезания:

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Симон Робинсон читать все книги автора по порядку

Симон Робинсон - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




C# для профессионалов. Том II отзывы


Отзывы читателей о книге C# для профессионалов. Том II, автор: Симон Робинсон. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x