- •Глава 8. Использование графики
- •Глава 8
- •Графические инструменты Delphi
- •Imagel.Picture.LoadFromFile('rnyicon.Ico'); //Создан и загружен объект класса tIcon
- •Компонент tImage
- •Использование диалогов для загрузки и сохранения графических файлов
- •Класс tcIipboard
- •Класс tScreen
- •Вывод графики с использованием отображаемых файлов
- •Класс tAnimate
Класс tScreen
Этот компонент представляет свойства дисплея (в Windows 98 и 2000 — нескольких дисплеев), на котором выполняется приложение. Поскольку экземпляр данного класса только один (он создается системой при запуске приложения), то большинство методов и свойств имеют информационный характер и недоступны для записи.
Курсор приложения, общий для всех форм, доступен через свойство:
property Cursor: TCursor;
Часто приходится включать "песочные часы" на время выполнения длительной операции. Правильнее всего это сделать следующим образом:
Screen.Cursor := crHourglass;
try
{Calculations... } finally
Screen.Cursor := crDefauit;
end;
Имеется список всех курсоров. Получить дескриптор курсора с индексом index можно при помощи свойства:
property Cursors[Index: Integer]: HCURSOR;
Напомним, что индексы зарегистрированных курсоров лежат в диапазоне от -22 (crSizeAll) до 0 (crDefauit).
Рассмотренный ниже фрагмент кода при инициализации формы заносит имена всех зарегистрированных в системе курсоров в список ListBoxl. Затем, при выборе элемента списка, устанавливается соответствующий ему курсор:
procedure TForml.FormCreate(Sender: TObject);
type
TGetStrFunc = function(const Value: string): Integer of object;
var
CursorNames: TStringList;
AddValue: TGetStrFunc;
begin
CursorNames := TStringList.Create;
AddValue := CursorNames.Add;
GetCursorValues(TGetStrProc(AddValue));
ListBoxl.Items.Assign(CursorNames);
end;
procedure TForml.ListBoxlClick(Sender: TObject);
begin
Screen.Cursor := StringToCursor(ListBoxl.Items[ListBoxl.Itemlndex]);
end;
Список курсоров, функции GetCursorValues, StringToCursor и некоторые другие содержатся в модуле controls. pas.
Имена всех установленных в системе шрифтов помещаются в список, определенный в свойстве:
property Fonts: TStrings;
Компонент сообщает неизменяемые свойства экрана (в данном видеорежиме). Его размеры в пикселах определены в свойствах:
property Height: Integer;
property Width: Integer;
В последних версиях ОС Microsoft имеется поддержка отображения на нескольких мониторах одновременно. Для этой цели предусмотрены свойства:
property MonitorCount: Integer;
property Monitors[Index: Integer]: TMonitor;
Каждый компонент TMonitor несет информацию о размерах и положении изображения на его экране. Образовавшийся же виртуальный рабочий стол характеризуется свойствами:
property DesktopLeft: Integer; property DesktopTop: Integer;
property DesktopWidth: Integer;
property DesktopHeight: Integer;
Все координаты отсчитываются от верхнего левого угла экрана первого монитора. Если монитор один, значения этих свойств совпадают с Left, Top, Width и Height.
С исходными текстами Delphi 5 поставляется модуль multimun. pas, содержащий прототипы структур и функций Windows 98/2000 для работы с многими мониторами.
Число точек на дюйм экрана содержится в свойстве:
property PixelsPerInch: Integer;
При появлении каждая форма заносит себя в список форм глобального объекта Screen. Два (доступных только для чтения) свойства дают информацию об этом списке:
property Forms[Index: Integer]: TForm;
property FormCount: Integer;
Нужно иметь в виду, что в списке указаны только формы, открытые приложением, а не все окна системы.
Следующие два свойства указывают на активную в данный момент форму и ее активный элемент управления:
property ActiveControl: TWinControl;
property ActiveForm: TForm;
При их изменении генерируются, соответственно, события:
property OnActiveControlChange: TNotifyEvent;
property OnActiveFormChange: TNotifyEvent;
Хоть и "некстати", расскажем здесь о свойстве
property DefaultKbLayout: HKL;
Оно указывает на раскладку клавиатуры, принятую в системе по умолчанию. Часто раскладку клавиатуры нужно переключать программно, чтобы облегчить жизнь пользователю. Так, в приложении, в котором нужно быстро вводить в базу данных большой объем информации на русском и английском языках, такое переключение при смене полей просто необходимо.
Сначала нужно прочитать список имеющихся в системе раскладок и установить нужную:
var RusLayout, EngLayout : THandle;
procedure TMainForm. FomCreate (Sender: TObject);
var Layouts : array[0..7] of THandle;
i,n : Integer;
begin
// считывание раскладок
RusLayout := 0; EngLayout := 0;
n := GetKeyboardLayoutList(High(Layouts)+1, Layouts);
if n>0 then
for i:=0 to n-1 do
if LoWord(Layouts[i]) and $FF = LAMG_RUSSIAN then RusLayout := Layouts[i]
else if LoWord(Layouts[i]) and $FF = LANG_ENGLISH then EngLayout := Layouts[i];
// если есть, включим русскую
if RusLayoutOO then ActivateKeyboardLayout(RusLayout,0);
end;
Затем при входе в определенное поле (компонент редактирования данных) и выходе из него можно программно сменить раскладку:
procedure TMainForm.EditDocSerEnterfSender: TObject);
begin
if EngLayoutoO then ActivateKeyboardLayout(EngLayout,0);
end;
procedure TMainForm.EditDocSerExit(Sender: TObject);
begin
if RusLayoutoO then ActivateKeyboardLayout(RusLayout,0);
end;
