Конференция "WinAPI" » Как загрузить анимационный курсор (ANI) из ресурсов? [D7, WinXP]
 
  • JetuS (11.01.08 12:35) [0]
    Из файла загружается без проблем, но не охота таскать с собой дополнительные файлы, поэтому создаю файл Cur.res из rc-файла такого содержания:
    BUSY ANICURSOR 4.ani



    Пробую - не работает. Что не так?

    Вот код:
    const
     crMyCursor = 777;

    implementation

    {$R *.dfm}
    {$R Cur.res}

    procedure TForm1.Button1Click(Sender: TObject);
    var
     h: THandle;
    begin
     h := LoadImage(hInstance, 'BUSY', IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE);
     ShowMessage(IntToStr(h));
     Screen.Cursors[crMyCursor] := h;
     Screen.Cursor := crMyCursor;
    end;

  • Dimaxx © (11.01.08 13:31) [1]
    Я грузил с помощью LoadCursor и все работало.
  • clickmaker © (11.01.08 13:34) [2]
    h := LoadImage(hInstance, 'BUSY', IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE);
    if (h = 0) then
     RaiseLastWin32Error(); // что говорит?
  • JetuS (11.01.08 14:07) [3]

    > RaiseLastWin32Error(); // что говорит?


    "Указанный тип ресурса в файле образа отсутствует."
    Как это понять?
  • JetuS (11.01.08 14:08) [4]

    > Я грузил с помощью LoadCursor и все работало.


    Покажи код, потому что я как ни пробовал - не работает.
  • clickmaker © (11.01.08 14:13) [5]

    > Как это понять?

    буквально. Не находит ресурс.
    Просто добавь в проект Project - Add to project - *.rc
    res можно заранее и не делать
  • JetuS (11.01.08 14:48) [6]

    > буквально. Не находит ресурс.Просто добавь в проект Project
    > - Add to project - *.rcres можно заранее и не делать

    Никакой разницы. Ошибка аналогичная.
  • clickmaker © (11.01.08 15:05) [7]
    я делал так
    images.rc:
    #include "resource.inc"

    IDB_DIAGBRUSH     BITMAP        "res\\dpbrush.bmp"


    resource.inc:
    const
     IDB_DIAGBRUSH = 101;



    *.pas:
    {$I resource.inc}
    ...
    FDisabledBitmap.LoadFromResourceID(hInstance, IDB_DIAGBRUSH);



    по аналогии должно и с курсором работать
    типа так
    h := LoadImage(hInstance, MakeIntResource(IDC_BUSY), IMAGE_CURSOR, 0, 0, 0);
  • JetuS (11.01.08 15:49) [8]

    > по аналогии должно и с курсором работать

    С картинкой оно и у мненя работает.
    Кажеться я понял: программа попросту не понимает, что мой ресурс есть курсором. Возможно я неправильно создаю rc-файл?
    Как же тогда правильно указать?
  • clickmaker © (11.01.08 16:38) [9]

    > Как же тогда правильно указать?

    BUSY CURSOR "1.ani"
  • jetus (11.01.08 17:37) [10]

    > BUSY CURSOR "1.ani"


    Компилятор ругается: Error Cur.rc 1 13: Invalid cursor format
  • Dib@zol © (11.01.08 18:07) [11]
    > Компилятор ругается: Error Cur.rc 1 13: Invalid cursor format

    Ну и пиши ету твою иконку в RCDATA. Я как-то сам давным-давно сюда выкладывал меню с анимированными иконками. Это была главная часть их загрузчика. Грузит из любого раздела реестра. Надо только собсно раздел указать.
    ЗЫ под ХРеновину и выше сей загрузчик работает на ура, а вот в 98-м (2К и МЕ не проверял) прут просто НЕРЕАЛЬНЫЕ лаги. В лучшем случае возвращается нулевой результат, в худшем - лично я пару раз словил BSOD. Поэтому предупреждаю сразу. А вообще, ИМХО, надо самому склепать расшифровщик, благо у ANI иконок не пользуется шифрование, а заголовочная запись не сильно огромна :)

    function LoadIconEx(H:HINST; N, T:string):HICON;
    var
     R : HRSRC;
     S : Cardinal;
     G : HGLOBAL;
     P : Pointer;
    begin
     Result:=0;
     R:=FindResource(H, PChar(N), PChar(T));
     if R=0 then exit;
     S:=SizeOfResource(H, R);
     G:=LoadResource(H, R);
     P:=LockResource(G);
     Result:=CreateIconFromResource(P, S, true, $00030000);
    end;
  • ага (12.01.08 11:08) [12]

    > Компилятор ругается: Error Cur.rc 1 13: Invalid cursor format

    BRCC? Попробуй RC.exe от MS.
  • jetus (12.01.08 13:13) [13]

    > Ну и пиши ету твою иконку в RCDATA...

    Пробовал твой код, выё время вылетает AV (среда XP SP2, D2007)


    > BRCC? Попробуй RC.exe от MS.

    Действительно, RC.exe скомпилировал ресурсный файл.
    Но программа ошибку выдаёт всё ту же :(
  • Dib@zol © (12.01.08 13:24) [14]
    > [13] jetus   (12.01.08 13:13)
    >
    > > Ну и пиши ету твою иконку в RCDATA...
    >
    > Пробовал твой код, выё время вылетает AV (среда XP SP2,
    > D2007)
    >
    >
    > > BRCC? Попробуй RC.exe от MS.
    >
    > Действительно, RC.exe скомпилировал ресурсный файл.
    > Но программа ошибку выдаёт всё ту же :(

    Это происходит потому, что вызывать мою функцию надо (если ты кнешн действительно положил иконку в раздел RCDATA) вот так:

    var i:HICON;
    ...
    i:=LoadIconEx(hInstance, 'имя_твоей_иконки_в_ресах', RT_RCDATA);
  • ага (12.01.08 16:44) [15]

    > jetus   (12.01.08 13:13) [13]

    Какую ту-же? В общем, по шагам.
    - имеем файл курсора 1.ani
    - Создаем файл AniCusor.rc, в нем пишем одну строку
    200 CURSOR "1.ani"
    - Компилим из CMD командой
    rc AniCursor.rc
    только перейти в каталог не забудь
    - В любой модуль проекта добавляем строку
    {$R anicursor.res}
    - Гди-нить, типа в OnCreate или по кнопке пишем код

    var
     h: Cardinal;
    begin
     h:= LoadCursor(hInstance, PChar(200));
    // или
    // h:= LoadImage(HInstance, PChar(200), IMAGE_CURSOR, 0, 0, 0);
    // без разницы
     if h = 0 then RaiseLastOSError;
     Screen.Cursors[1]:= h;
     Screen.Cursor:= 1;


    Запускаем и наслаждаемся.
  • jetus (12.01.08 17:11) [16]

    > Запускаем и наслаждаемся.


    Сделал точно как ты написал.
    Вот:
    System Error.  Code: 1814.
    Указанное имя ресурса не найдено в файле образа.

    Ты сам код проверял?
  • ага (13.01.08 05:52) [17]
    2 jetus

    > Ты сам код проверял?

    Да, и не одноератно. И сейчас еще раз проверил - все работает. Глянь каким-нить просмотрщиком ресурсов полученный экзешник, Ресторатором например. А еще попробуй загрузить твой курсор прямо из файла
    Screen.Cursors[1]:= LoadImage(0, '1.ani', IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE);


    Мож у тя исходный файл кривой.
  • jetus (13.01.08 10:43) [18]

    > Да, и не одноератно. И сейчас еще раз проверил - все работает.
    >  Глянь каким-нить просмотрщиком ресурсов полученный экзешник,
    >  Ресторатором например. А еще попробуй загрузить твой курсор
    > прямо из файлаScreen.Cursors[1]:= LoadImage(0, '1.ani',
    > IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE);Мож у тя исходный файл
    > кривой.


    Смотрел ресурс ResHacker'ом - всё на месте. Курсор грузил напрямую из файла - никаких проблем, грузиться отлично. Не знаю уже, в чём беда...
  • ага (13.01.08 14:45) [19]

    > jetus   (13.01.08 10:43) [18]

    Ну тады я тож не знаю. Пожоже ты один такой несчастливый. На всяк случай выложи код с объявлением ресурса и загрузкой курсора - мож чего увижу.

    > Смотрел ресурс ResHacker'ом - всё на месте

    А тип ресурса какой, Ani Cursor? Может в имени ошибся? Я ваще не люблю ресурсам имена давать, только числовые индексы - привычка.
  • jetus (13.01.08 21:10) [20]

    > Ну тады я тож не знаю. Пожоже ты один такой несчастливый.
    >  На всяк случай выложи код с объявлением ресурса и загрузкой
    > курсора - мож чего увижу.


    Значит так. Создаю файл "Cur.rc" такого содержания:
    #define BUSY 200
    #define CUR 201

    BUSY CURSOR "4.ani"
    CUR CURSOR "5.cur"


    Файлы 4.ani (анимированый курсор) и 5.cur (простой курсор) присутствуют.
    Компилируется ресурс нормально.

    Код программы:
    {$R Cur.RES}

    procedure TForm1.Button1Click(Sender: TObject);
    var
    h: Cardinal;
    begin
    h:= LoadCursor(hInstance, PChar(200));
    if h = 0 then RaiseLastOSError;
    Screen.Cursors[1]:= h;
    Screen.Cursor:= 1;
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    var
    h: Cardinal;
    begin
    h:= LoadCursor(hInstance, PChar(201));
    if h = 0 then RaiseLastOSError;
    Screen.Cursors[2]:= h;
    Screen.Cursor:= 2;
    end;



    При нажатии на кнопку Button2 всё нормально - обычный курсор загружается, ошибок нет.
    При нажатии на кнопку Button1 вылетает: "System Error.  Code: 1814. Указанное имя ресурса не найдено в файле образа."
  • Dib@zol © (13.01.08 21:29) [21]
    Попробуй MAKEINTRESOURCE() вместо приведения к PChar. И посмотри размер скомпиленного ресурса - если он меньше суммарного размера .cur и .ani иконок, значит ресурс-компилер просто пропускает при построении реса этот .ani файл...

    ЗЫ Ну уж не знаю чего у тебя там происходит 0_о

    в первый раз в жизни такое получаю ©
  • jetus (13.01.08 22:54) [22]

    > Попробуй MAKEINTRESOURCE() вместо приведения к PChar. И
    > посмотри размер скомпиленного ресурса - если он меньше суммарного
    > размера .cur и .ani иконок, значит ресурс-компилер просто
    > пропускает при построении реса этот .ani файл...

    C  MAKEINTRESOURCE() всё аналогично.
    Размер полученого .res-файла соответствующий.

    Хотя, в принципе, ошибку выдаёт правильную "Указанное имя ресурса не найдено в файле образа.": в ресурсах ехе-файла в группе курсоров есть курсор 201, а 200-го нету. 200-ый лежит себе отдельным типом, а почему?
  • Dib@zol © (13.01.08 23:03) [23]
    > 200-ый лежит себе отдельным типом, а почему?
    А вот потому что
    > Error Cur.rc 1 13: Invalid cursor format

    Просто RC, вестимо (непонятно, правда, накой) маскирует ету проблему...
  • ага (14.01.08 10:50) [24]

    >  200-ый лежит себе отдельным типом, а почему?

    Дык потому, что это и есть отдельный тип - анимированный курсор.
    Выложи куда-нить этот файл курсора, попробую с ним скомпилить.
  • JetuS (14.01.08 11:28) [25]

    > Дык потому, что это и есть отдельный тип - анимированный
    > курсор.Выложи куда-нить этот файл курсора, попробую с ним
    > скомпилить.


    Да зачем выкладывать? Возьми любой .ani-файл (даже из папки винды) и попробуй с ним.
  • ALS (14.01.08 12:30) [26]
    Когда-то подключал анимированный курсор из rc-файла, прописывал код:
     DARROW 21 darrow.ani
    Были аналогичные проблемы, если в рессурсах модуля присутствовал XP-манифест.
  • icWasya © (14.01.08 17:16) [27]
    компилятор *.rc - файлов для дельфи отстаёт от микрософта, по этому -[26]
  • jetus (14.01.08 18:35) [28]

    > Были аналогичные проблемы, если в рессурсах модуля присутствовал
    > XP-манифест.

    Гм... и как узнать, есть ли там манифест?


    > компилятор *.rc - файлов для дельфи отстаёт от микрософта,
    >  по этому -[26]

    Специально уже компилю через микрософтский rc.exe
  • ага (14.01.08 19:05) [29]

    > JetuS   (14.01.08 11:28) [25]


    > Да зачем выкладывать? Возьми любой .ani-файл (даже из папки
    > винды) и попробуй с ним.

    С любым я уже пробовал - смотри ага   (13.01.08 05:52) [17]
    Ну твои дела, как знаешь
  • ага (14.01.08 19:10) [30]

    > ALS   (14.01.08 12:30) [26]


    > Были аналогичные проблемы, если в рессурсах модуля присутствовал
    > XP-манифест.

    А у меня почему-то и с манифестом никаких проблем
  • jetus (14.01.08 21:04) [31]

    > С любым я уже пробовал - смотри ага   (13.01.08 05:52) [17]
    > Ну твои дела, как знаешь

    Гм...
    Ну, раз у тебя всё получается, то выложи куда-нибудь архив с проектом (с ехе-шником, rc и res-файлами), а ещё лучше - отправь на jetuso@gmail.com,
    буду тебе очень благодарен.
  • ага (14.01.08 21:55) [32]
    Да я бы отправил, да только твой сервак не хочет принимать архив с экзешником.
  • jetus (15.01.08 07:45) [33]

    > Да я бы отправил, да только твой сервак не хочет принимать
    > архив с экзешником.

    Запакуй rar-ом, тогда ругаться не будет. А если лень, то кинь на jetus@rambler.ru :)
  • ага (15.01.08 15:25) [34]
    Дык я и так паковал - в ZIP, не приниало. Надо было попробовать ахиву расширение заменить, чет не сообразил с недосыпу:)) На рэмблер вроде ушло.
  • jetus (16.01.08 18:48) [35]

    >  На рэмблер вроде ушло.

    Спасибо, пришло )
    Действительно, ехе-шник рабочий.
    А вот с кодом я чего-то не понял: модуль оказался "пустой":
    unit Unit1;

    interface

    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs;

    type
     TForm1 = class(TForm)
     private
       { Private declarations }
     public
       { Public declarations }
     end;

    var
     Form1: TForm1;

    implementation

    {$R *.dfm}

    end.



    Ни упоминания о курсоре.
    Естественно, при компиляции ехе-шник без курсора вышел.

    То ли ты мне pas-файл не тот выслал, то ли лыжи не едут )
  • ага (16.01.08 19:27) [36]
    Блин, точно пустой:(( Без понятия как оно получилось, чет с недосыпу начудил:( Вот модуль:

    unit Unit1;

    interface

    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs;

    type
     TForm1 = class(TForm)
       procedure FormCreate(Sender: TObject);
     private
       { Private declarations }
     public
       { Public declarations }
     end;

    var
     Form1: TForm1;

    implementation

    {$R *.dfm}
    {$R WindowsXP.res}
    {$R Anicursor.res}

    procedure TForm1.FormCreate(Sender: TObject);
    var
     h: Cardinal;
    begin
     h:= LoadCursor(HInstance, PChar(200));
     if 0 = h then RaiseLastOSError;
     Screen.Cursors[1]:= h;
     Screen.Cursor:= 1;
    end;

    end.

  • jetus (17.01.08 08:09) [37]

    > Вот модуль:

    Гы, действительно работает )
    А теперь вот что я сделал: взял другой .ani-файл, назвал его "1.ani" и просто заменил твой. Скомпилировал ресурс. Перебилдил проект. Запускаю - выдаёт: "System Error.  Code: 1814. Указанное имя ресурса не найдено в файле образа."
    Беру твой файл назад. Компилю ресурс. Билдю проект. Запускаю - работает.

    Кто-нибудь может объяснить мне, что происходит?!
    З.Ы. Пробовал на 6 разных .ani-файлах с размерами от 6кБ до 80кБ - одинаково.
  • JetuS (17.01.08 09:19) [38]
    Всё, проблема решена.
    Достаточно было удалить строку {$R WindowsXP.res}

    Большое спасибо за помощь )
  • ага (17.01.08 10:42) [39]

    > jetus   (17.01.08 08:09) [37]

    А я те говорил - давай твой курсор, попробую. Так нет, не послушал.
  • имя (28.02.08 22:10) [40]
    Удалено модератором
 
Конференция "WinAPI" » Как загрузить анимационный курсор (ANI) из ресурсов? [D7, WinXP]
Есть новые Нет новых   [134431   +15][b:0][p:0.003]