17.5. УКАЗАТЕЛИ МЫШИ

При перемещении указателя мыши по экрану он может менять свою форму в зависимости от свойства Cursor компонента, над которым он расположен в данный момент:

property Cursor: TCursor;

type TCursor = -32768..+32767;

В Delphi предопределены стандартные указатели, показанные на рисунке 17.2.

Рис. 17.2. Стандартные курсоры Delphi

В практике программирования часто возникает необходимость изменения формы указателя для всех окон программы. Например, при выполнении достаточно длительного по времени процесса указатель мыши часто принимает вид crHourGlass, а после завершения процесса - восстанавливает свой первоначальный вид. Чтобы изменить форму указателя для всех окон программы одновременно, используется свойство cursor у глобального объекта screen, который автоматически создается для каждой программы:

Screen.Cursor := crHourGiass;

..... //Делаем длительную работу

Screen.Cursor := crDefault; // Восстанавливаем начальную

// форму указателя

Программист может создать и использовать нестандартный указатель. При этом он должен:

- с помощью редактора изображений Delphi создать изображение указателя и разместить это изображение в ресурсном файле программы;
- в работающей программе сначала загрузить указатель из ресурсного файла с помощью функции LoadCursor и зарегистрировать его в списке cursors объекта screen, а уже только после этого назначать нестандартный указатель свойствам cursor компонентов или экрана.

Рассмотрим процесс создания и использования нестандартного указателя на следующем примере, в котором создается и используется указатель в виде окружности.

- Выберите опцию меню Tools | image Editor, чтобы загрузить редактор изображений Delphi.
- В окне редактора сначала выберите File | New | Resource File, а затем - Resource | New | Cursor. Окно редактора к этому моменту должно иметь вид, показанный на рис. 17.3.

Рис. 17.3. Окно редактора изображений с заготовкой для указателя мыши

- С помощью опции Resource | Rename обязательно измените стандартное имя ресурса cursorl на любое другое, например, mycursor. Вы можете даже написать прежнее имя Сursor1, но изменить умалчиваемое имя ресурса нужно обязательно, иначе функция LoadCursor не сможет извлечь указатель из ресурсного файла (это имя должно состоять из заглавных букв).

- Дважды щелкните по ресурсу в списке ресурсов или выберите опцию Resource | Edit - на экране появится окно редактора с двумя пустыми полями, обведенными красными рамками. Левое поле предназначено для показа создаваемого указателя в крупном масштабе, правое показывает его в натуральную величину.
- Выберите инструмент в форме окружности в левой части окна редактора, нажмите и удерживайте клавишу Shift, чтобы получилась правильная окружность, подведите указатель мыши в виде крестика несколько правее и ниже верхнего угла левого поля редактора, нажмите левую кнопку мыши и, удерживая кнопку и клавишу Shift нажатыми, переместите указатель несколько левее и выше правого нижнего угла поля, после чего отпустите кнопку и клавишу (см. рис. 17.5: на этом рисунке выбранный инструмент имеет вид вдавленной кнопки).
- Щелкните мышью по заголовку untitiedi.res окна со списком ресурсов (или закройте окно с изображениями указателя кнопкой в его правом верхнем углу) и с помощью File | save сохраните ресурсный файл под именем cursor, после чего закройте редактор изображений.
- Создайте новый проект с пустой формой и напишите такой обработчик события OnCreate для формы Form1:

{$R *.DFM} ($R Cursor.res}

procedure TForm1.FormCreate(Sender: TObject);

begin

// Регистрируем указатель:

Screen.Cursors[1] := LoadCursor(HInstance,'MYCURSOR');

// Используем его для клиентской части формы:

Cursor := 1

end;

Не забудьте указать комментарий {$r cursor, res}, чтобы компоновщик пристыковал ресурсный файл cursor, res к ресурсному файлу программы. После запуска программы вы увидите в клиентской части пустой формы нестандартный указатель. Замечу, что при регистрации указателя в screen, cursors индекс может быть любым числом в диапазоне от -32768 до +32767. Однако следует учитывать,

что индексы в диапазоне от -22 до -1 включительно заняты стандартными указателями, показанными на рис. 17.3 (индексы -5 и -1 соответствуют указателю crNone), а индекс 0 всегда связан со стандартным указателем Windows ^ и не может переопределяться.

Рис. 17.4 . Окно редактора с готовым изображением указателя