однажды в поле 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();

 FileOpenDialog.FileOk +=

  new System.ComponentModel.CancelEventHandler(this.OpenFileDialog_FileOk);

}

Мы добавили обработчики событий для пунктов меню File и Exit, а также для диалога FileOpen, который выводится, когда пользователь выбирает Open. CreateFonts() является вспомогательным методом, выбирающим шрифты:

private void CreateFonts() {

 mainFont = new Font('Arial', 10);

 lineHeight = (uint)mainFont.Height;

 emptyDocumentFont = new Font('Verdana', 13, FontStyle.Bold);

}

Реальное определение обработчиков является достаточно стандартным материалом:

protected void OpenFileDialog_FileOk(object Sender, CancelEventArgs e) {

 this.LoadFile(fileOpenDialog.FileName);

}

protected void menuFileOpen_Click(object sender, EventArgs e) {

 fileOpenDialog.ShowDialog();

}

protected void menuFileExit_Click(object sender, EventArgs e) {

 this.Close();

}

Исследуем метод LoadFile(). Он занимается открытием и считыванием файла (а также обеспечивает инициирование события Paint, чтобы была выполнена перерисовка с новым файлом).

private void LoadFile(string FileName) {

 StreamReader sr = new StreamReader(FileName);

 string nextLine;

 documentLines.Clear();

 nLines = 0;

 TextLineInformation nextLineInfo;

 while ((nextLine = sr.ReadLine()) != null) {

  nextLineInfo = new TextLineInformation();

  nextLineInfо.Text = nextLine;

  documentLines.Add(nextLineInfo); ++nLines;

 }

 sr.Close();

 documentHasData = (nLines > 0) ? true : false;

 CalculateLineWidths();

 CalculateDocumentSize();

 this.Text = standardTitle + ' ' + FileName;

 this.Invalidate();

}

Большая часть этой функции является просто стандартным кодом чтения файла (см. главу 14). Обратите внимание, что по мере чтения файла мы последовательно добавляем строки в documentLines ArrayList, поэтому массив в конце содержит информацию для каждой строки по порядку. После считывания файла устанавливается флаг documentHasData для указания, что действительно что-то есть для вывода на экран. Далее определяется содержание и место, а затем клиентская область, т.е. размер документа влияющий на задание панелей прокрутки. В конце добавляется текст строки заголовка и вызывается метод Invalidate(). Invalidate() является важным методом, поставляемым Microsoft. Поэтому мы постараемся объяснить его использование, прежде чем переходить к коду методов CalculateLineWidths() и CalculateDocumentSize() .

Метод Invalidate()

Invalidate() является членом System.Windows.Forms.Form, с которым мы еще не встречались. Это очень полезный метод для случая, когда что-то необходимо перерисовать. По

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

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

Отметить Добавить цитату