Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как загрузить анимационный курсор (ANI) из ресурсов? [D7, WinXP]


Страницы:   1 2

JetuS ©   (2008-01-11 12:35:00) 

Из файла загружается без проблем, но не охота таскать с собой дополнительные файлы, поэтому создаю файл 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;


jetus   (2008-01-13 21:10:00) [21]


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


Значит так. Создаю файл "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. Указанное имя ресурса не найдено в файле образа."


ага   (2008-01-13 14:45:00) [22]


> jetus   (13.01.08 10:43) [18]

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

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

А тип ресурса какой, Ani Cursor? Может в имени ошибся? Я ваще не люблю ресурсам имена давать, только числовые индексы - привычка.


jetus   (2008-01-13 10:43:00) [23]


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


Смотрел ресурс ResHacker'ом - всё на месте. Курсор грузил напрямую из файла - никаких проблем, грузиться отлично. Не знаю уже, в чём беда...


ага   (2008-01-13 05:52:00) [24]

2 jetus

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

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


jetus   (2008-01-12 17:11:00) [25]


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


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

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


ага   (2008-01-12 16:44:00) [26]


> 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;

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


Dib@zol   (2008-01-12 13:24:00) [27]

> [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);


jetus   (2008-01-12 13:13:00) [28]


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

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


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

Действительно, RC.exe скомпилировал ресурсный файл.
Но программа ошибку выдаёт всё ту же :(


ага   (2008-01-12 11:08:00) [29]


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

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


Dib@zol   (2008-01-11 18:07:00) [30]

> Компилятор ругается: 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;


jetus   (2008-01-11 17:37:00) [31]


> BUSY CURSOR "1.ani"


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


clickmaker   (2008-01-11 16:38:00) [32]


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

BUSY CURSOR "1.ani"


JetuS   (2008-01-11 15:49:00) [33]


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

С картинкой оно и у мненя работает.
Кажеться я понял: программа попросту не понимает, что мой ресурс есть курсором. Возможно я неправильно создаю rc-файл?
Как же тогда правильно указать?


clickmaker   (2008-01-11 15:05:00) [34]

я делал так
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   (2008-01-11 14:48:00) [35]


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

Никакой разницы. Ошибка аналогичная.


clickmaker   (2008-01-11 14:13:00) [36]


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

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


JetuS   (2008-01-11 14:08:00) [37]


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


Покажи код, потому что я как ни пробовал - не работает.


JetuS   (2008-01-11 14:07:00) [38]


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


"Указанный тип ресурса в файле образа отсутствует."
Как это понять?


clickmaker   (2008-01-11 13:34:00) [39]

h := LoadImage(hInstance, 'BUSY', IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE);
if (h = 0) then
 RaiseLastWin32Error(); // что говорит?


Dimaxx   (2008-01-11 13:31:00) [40]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо