![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как загрузить анимационный курсор (ANI) из ресурсов? [D7, WinXP]
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 и все работало.