Конференция "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? Может в имени ошибся? Я ваще не люблю ресурсам имена давать, только числовые индексы - привычка.
 
Конференция "WinAPI" » Как загрузить анимационный курсор (ANI) из ресурсов? [D7, WinXP]
Есть новые Нет новых   [134431   +14][b:0][p:0.001]