однажды в поле 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
, с которым мы еще не встречались. Это очень полезный метод для случая, когда что-то необходимо перерисовать. По