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 | < Назад | Оглавление | Далее > |