понедельник, 29 декабря 2008 г.

Использование собственных курсоров в Delphi

На днях мне задали довольно тривиальный вопрос: "Как сделать собственные курсоры в Delphi?". Что, думаю, в сети разве нет информации по этому поводу? Методом "гугления" обнаружил статью на DelphiSources - была первая в списке. Но это не совсем то, просмотрев еще несклько ресурсов, бросил это дело. И хотя вся процедура создания и подключения курсоров, да и других ресурсов довольно проста, но она не прозрачна и содержит много подводных камней, и может вызвать затруднения у начинающего программиста.

Итак, что мы имеем? Тривиальная задача из студенчества: создание примитивнейшего графического редактора. Необходимо подключить к программе и использовать курсоры для карандаша и резинки.

Собственно курсоры создаются в программе ImageEditor входящей в поставку Delphi 7 (именно для этой версии прозвучал порос). Процесс рисования курсора опустим - там все достаточно просто. Первые проблемы могут возникнуть при попытке подключения курсоров к программе.

В некоторых статьях рекомендуют открывать файл ресурсов, создаваемый в приложении по умолчанию и добавлять курсоры туда. Я не советую так делать, поскольку в свое время наколося на этом - среда просто переписала созданный файл (не помню зачем - ей виднее) и все курсоры пропали, пришлось делать заново - что не очень приятно. Поэтому будем делать собственный файл ресурсов, тем более что в этом нет ничего сложного.

Для создания ресурсов нам понадобится утилита brcc32.exe (Borland Resource Compiler) - которая распологается в каталоге с Delphi. Я рекомендую создать отдельный подкаталог "resources" в каталоге с проектом и разместить там все необходимые файлы для создания файла с собственными ресурсами. Туда же скопировать и эту утилиту.


Теперь необходимо подготовить файлик для компиляции ресурсов. Неоходимо открыть блокнот и описать каждый курсор в следующем формате:

ИМЯ_РЕСУРСА ТИП_РЕСУРСА ПУТЬ_К_РЕСУРСУ

Для исключения возможных неточностей следует имя ресурса сразу же писать заглавными латинскими буквами. Чтобы мои ресурсы можно было легко увидеть в одном месте я именую их все с заглавной буквы Z - так проще. Реальный файл с описаниями ресурсов одного из моих проектов представлен ниже:

В нашем случае необходимо написать следующее:

ZCURSOR_PEN CURSOR pen.cur
ZCURSOR_ERR CURSOR err.cur

и сохранить в файле cursors.rc. Теперь остается только выполнить из командной строки команду brcc32 cursors.rc в результате чего создастся файл с ресурсами cursors.res, содержащий в себе наши курсоры.

Теперь остается только подключить этот файл к проекту, делается это следующей директивой {$R cursors.res}. В моем проекте это сделано следующим образом:

Затем объявляется числовая константа на каждый курсор, например:

crPen = 100;
crErraser = 101;

и далее при инициализации формы следует подгрузить эти ресурсы:

Screen.Cursors[crPen] := LoadCursor(HInstance, 'ZCURSOR_PEN');
Screen.Cursors[crErraser] := LoadCursor(HInstance, 'ZCURSOR_ERR CURSOR');

Ну и теперь, наконец-то, можно с ними работать как с обычными курсорами. Кстати, тут можно посмотреть описание функций для работы с курсорами.

Вот собственно и все, довольно объемный пост получился, даже сам не ожидал :)

4 комментария:

  1. если не ошибаюсь, для редактирования курсоров и сохранения в ресурс более подходит Borland Image Editor -- imagedit.exe в каталоге bin установки Delphi

    ОтветитьУдалить
  2. А для добавления других ресурсов - Restorator 2007) На мой взгляд, удобнее)

    ОтветитьУдалить
  3. да! но! считаю, что использование "своих" курсоров в программах отличных от игр - дурной тон.
    -gf-

    ОтветитьУдалить
  4. Да ну! 2 самых простых и самых примитивных примера где нужны собственные курсоры: графический редактор и просмотрщик изображений. Тот же MS Word использует некоторое количество собственных курсоров - и что это тоже дурной тон? Конечно, я абсолютно согласен, что курсор в виде зеленого крокодила в информационной системе просто неуместен, но есть ситуации где без этого не обойтись.

    ОтветитьУдалить