Вход/Регистрация
C# для профессионалов. Том II
вернуться

Ватсон Карли

Шрифт:

// сообщения Empty

private Brush mainBrush = Brushes.Blue;

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

private Brush emptyDocumentBrush = Brushes.Red;

 // кисть, используемая для вывода сообщения empty document

private Point mouseDoubleClickPosition;

 // положение мыши при двойном щелчке

private OpenFileDialog fileOpenDialog = new OpenFileDialog;

 // стандартный диалог открытия файла

private bool documentHasData = false;

 // задать как true, если документ содержит данные

#endregion
 

Поле

documentLines
является
ArrayList
, который содержит прочитанный текст файла. В реальном смысле это поле содержит данные документа. Каждый элемент
DocumentLines
включает данные одной строки текста, который был считан. Этот объект
ArrayList
предпочтительнее обычного массива C#, так что можно динамически добавлять в него элементы, когда считывается файл. Можно заметить, что достаточно свободно используются директивы препроцессора
#region
для объединения в блоки частей программы, чтобы ее было легче редактировать.

Как было сказано, каждый элемент

documentLines
содержит информацию о строке текста. Эта информация является на самом деле экземпляром другого класса, который был определен —
TextLineInformation
:

class TextLineInformation {

 public string Text;

 public uint Width;

}

TextLineInformation
выглядит как классический случай обычного использования структуры, а не класса, так как требуется только сгруппировать поля. Однако его экземпляры всегда доступны в качестве элементов класса
ArrayList
, в котором они хранятся как ссылочные типы. Поэтому объявление
TextLineInformation
классом приводит к более эффективным действиям, сохраняя множество операций упаковки и распаковки.

Каждый экземпляр

TextLineInformation
хранит строку текста и выводится как один элемент. Обычно для каждого такого элемента в приложении GDI+ желательно сохранять его текст, а также мировые координаты, где он должен выводиться, и размер. Обратите внимание, что используются мировые координаты, а не координаты страницы. Координаты страницы часто изменяются, когда пользователь прокручивает текст, в то время как мировые координаты меняются лишь в случае, когда другие части документа преобразуются каким-то образом. В данном случае мы сохранили только
Width
элемента, так как высота здесь является просто высотой выбранного шрифта. Она одинакова для всех строк текста, поэтому нет смысла хранить ее отдельно для каждой строки. Вместо этого она сохраняется только однажды в поле
Form1.lineHeight
. Что касается позиции, то в данном случае координата х просто равна граничному полю, а координата у легко вычисляется как:

Margin + LineHeight*(количество строк выше текущей строки)

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

Займемся теперь основным меню. Эта часть приложения принадлежит к формам Windows — тема рассмотрения главы 9. Пункты меню были добавлены с помощью графического представления в Visual Studio.NET, но переименованы как

menuFileOpen
и
menuFileExit
. Затем код в
InitializeComponent
был изменен, чтобы добавить подходящие обработчики событий, а также выполнить некоторую инициализацию:

private void InitializeComponent {

 // добавлено мастером построения кода

 this.menuFileOpen = new System.Windows.Forms.MenuItem;

 this.menuFileExit = new System.Windows.Forms.MenuItem;

 this.mainMenu1 = new System.Windows.Forms.MainMenu;

 this.menuFile = new System.Windows.Forms.MenuItem;

 this.menuFileOpen.Index = 0;

 this.menuFileOpen.Text = "Open";

 this.menuFileExit.Index = 3;

 this.menuFileExit.Text = "Exit";

 this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {this.menuFile});

 this.menuFile.Index = 0;

 this.menuFile.MenuItems.AddRange(

new System.Windows.Forms.MenuItem[] {this.menuFileOpen, this.menuFileExit});

 this.menuFile.Text = "File";

 this.menuFileOpen.Click +=

new System.EventHandler(this, menuFileOpen_Click);

 this.menuFileExit.Click +=

new System.EventHandler(this.menuFileExit_Click);

 this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);

 this.BackColor = System.Drawing.Color.White;

 this.Size = new Size(600, 400);

 this.Menu = this.mainMenu1;

 this.Text = standardTitle;

 CreateFonts;

  • Читать дальше
  • 1
  • ...
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: