| netlib.narod.ru | < Назад | Оглавление | Далее > |
Б проекте SysInfoList я создал файл SysInfoStrings.cs, а также показанный ниже файл SysInfoList.cs. Эта программа отображает сведения о системе, возвращаемые классом SysInfoStrings.
SysInfoList.cs
//--------------------------------------------
// SysInfoList.cs (C) 2001 by Charles Petzold
//--------------------------------------------
using System;
using System.Drawing;
using System.Windows.Forms;
class SysInfoList: Form
{
readonly float cxCol;
readonly int cySpace;
public static void Main()
{
Application.Run(new SysInfoList());
}
public SysInfoList()
{
Text = "System Information: List";
BackColor = SystemColors.Window;
ForeColor = SystemColors.WindowText;
Graphics grfx = CreateGraphics();
SizeF sizef = grfx.MeasureString(" ", Font);
cxCol = sizef.Width + SysInfoStrings.MaxLabelWidth(grfx, Font);
grfx.Dispose();
cySpace = Font.Height;
}
protected override void OnPaint(PaintEventArgs pea)
{
Graphics grfx = pea.Graphics;
Brush brush = new SolidBrush(ForeColor);
int iCount = SysInfoStrings.Count;
string[] astrLabels = SysInfoStrings.Labels;
string[] astrValues = SysInfoStrings.Values;
for (int i = 0; i < iCount; i++)
{
grfx.DrawString(astrLabels[i], Font, brush,
0, i * cySpace);
grfx.DrawString(astrValues[i], Font, brush,
cxCol, i * cySpace);
}
}
}
Эта программа немного оптимизирована, так как значения cxCol и cySpace вычисляются лишь однажды в конструкторе формы и затем сохраняются в качестве полей, используемых позже методом OnPaint. Однако это вычисление требует вызова метода MeasureString, для чего в свою очередь требуется объект Graphics. Как же получить этот объект вне события Paint или метода OnPaint?
Класс Control содержит наследуемый классом Form метод CreateGraphics, позволяющий в любой момент получить доступ к объекту Graphics:
Методы Control (выборочно)
| Graphics CreateGraphics() |
Объект Graphics можно использовать для получения информации (как это сделано в SysInfoList) или для вывода графики в клиентской области программы. (Однако не стоит беспокоиться о выводе графики во время работы конструктора, так как в это время форма не отображается.)
До возврата управления от конструктора или события, в котором при помощи метода CreateGraphics был создан объект Graphics, этот объект нужно уничтожить вызвав метод Dispose:
Методы Graphics (выборочно)
| void Dispose() |
За созданием объекта Graphics методом CreateGraphics в программе SysInfoList идет вызов MeasureString для вычисления ширины символа «пробел». Полученная величина прибавляется к значению MaxLabelWidth, возвращенному классом SysInfoStrings, а результат сохраняется в переменной cxCol. В методе OnPaint находится простой цикл for, внутри которого выводятся пары строк.
Мы определенно достигли некоторого прогресса:

Однако в зависимости от установленного на вашем компьютере разрешения экрана (которое мы будем подробно обсуждать в главе 9), вам, возможно, не удастся развернуть форму так, чтобы видеть все 60 значений. В этом случае программа окажется не слишком полезной, так как просмотреть значения, находящиеся в конце списка, невозможно.
Вы можете столкнуться с этой проблемой, даже если речь будет идти всего о 20 или 25 значениях. Возможно худшей ошибкой в программировании для Windows является предположение о том, что некоторое количество текста будет умещаться на экранах всех пользователей программы. Пользователи — особенно со слабым зрением — могут установить крупный размер шрифта, уменьшив тем самым количество текста, умещающегося на экране. Поэтому в ваших программах надо предусматривать возможность работы при любом разрешении экрана и размере шрифта.
Отобразить больше текста, чем умещается на экране, помогут полосы прокрутки.
| netlib.narod.ru | < Назад | Оглавление | Далее > |