Форум: "WinAPI";
Текущий архив: 2009.01.18;
Скачать: [xml.tar.bz2];
ВнизКак загрузить анимационный курсор (ANI) из ресурсов? Найти похожие ветки
← →
JetuS (2008-01-11 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 © (2008-01-11 13:31) [1]Я грузил с помощью LoadCursor и все работало.
← →
clickmaker © (2008-01-11 13:34) [2]h := LoadImage(hInstance, "BUSY", IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE);
if (h = 0) then
RaiseLastWin32Error(); // что говорит?
← →
JetuS (2008-01-11 14:07) [3]
> RaiseLastWin32Error(); // что говорит?
"Указанный тип ресурса в файле образа отсутствует."
Как это понять?
← →
JetuS (2008-01-11 14:08) [4]
> Я грузил с помощью LoadCursor и все работало.
Покажи код, потому что я как ни пробовал - не работает.
← →
clickmaker © (2008-01-11 14:13) [5]
> Как это понять?
буквально. Не находит ресурс.
Просто добавь в проект Project - Add to project - *.rc
res можно заранее и не делать
← →
JetuS (2008-01-11 14:48) [6]
> буквально. Не находит ресурс.Просто добавь в проект Project
> - Add to project - *.rcres можно заранее и не делать
Никакой разницы. Ошибка аналогичная.
← →
clickmaker © (2008-01-11 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 (2008-01-11 15:49) [8]
> по аналогии должно и с курсором работать
С картинкой оно и у мненя работает.
Кажеться я понял: программа попросту не понимает, что мой ресурс есть курсором. Возможно я неправильно создаю rc-файл?
Как же тогда правильно указать?
← →
clickmaker © (2008-01-11 16:38) [9]
> Как же тогда правильно указать?
BUSY CURSOR "1.ani"
← →
jetus (2008-01-11 17:37) [10]
> BUSY CURSOR "1.ani"
Компилятор ругается: Error Cur.rc 1 13: Invalid cursor format
← →
Dib@zol © (2008-01-11 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;
← →
ага (2008-01-12 11:08) [12]
> Компилятор ругается: Error Cur.rc 1 13: Invalid cursor format
BRCC? Попробуй RC.exe от MS.
← →
jetus (2008-01-12 13:13) [13]
> Ну и пиши ету твою иконку в RCDATA...
Пробовал твой код, выё время вылетает AV (среда XP SP2, D2007)
> BRCC? Попробуй RC.exe от MS.
Действительно, RC.exe скомпилировал ресурсный файл.
Но программа ошибку выдаёт всё ту же :(
← →
Dib@zol © (2008-01-12 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);
← →
ага (2008-01-12 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 (2008-01-12 17:11) [16]
> Запускаем и наслаждаемся.
Сделал точно как ты написал.
Вот:
System Error. Code: 1814.
Указанное имя ресурса не найдено в файле образа.
Ты сам код проверял?
← →
ага (2008-01-13 05:52) [17]2 jetus
> Ты сам код проверял?
Да, и не одноератно. И сейчас еще раз проверил - все работает. Глянь каким-нить просмотрщиком ресурсов полученный экзешник, Ресторатором например. А еще попробуй загрузить твой курсор прямо из файлаScreen.Cursors[1]:= LoadImage(0, "1.ani", IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE);
Мож у тя исходный файл кривой.
← →
jetus (2008-01-13 10:43) [18]
> Да, и не одноератно. И сейчас еще раз проверил - все работает.
> Глянь каким-нить просмотрщиком ресурсов полученный экзешник,
> Ресторатором например. А еще попробуй загрузить твой курсор
> прямо из файлаScreen.Cursors[1]:= LoadImage(0, "1.ani",
> IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE);Мож у тя исходный файл
> кривой.
Смотрел ресурс ResHacker"ом - всё на месте. Курсор грузил напрямую из файла - никаких проблем, грузиться отлично. Не знаю уже, в чём беда...
← →
ага (2008-01-13 14:45) [19]
> jetus (13.01.08 10:43) [18]
Ну тады я тож не знаю. Пожоже ты один такой несчастливый. На всяк случай выложи код с объявлением ресурса и загрузкой курсора - мож чего увижу.
> Смотрел ресурс ResHacker"ом - всё на месте
А тип ресурса какой, Ani Cursor? Может в имени ошибся? Я ваще не люблю ресурсам имена давать, только числовые индексы - привычка.
← →
jetus (2008-01-13 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 © (2008-01-13 21:29) [21]Попробуй MAKEINTRESOURCE() вместо приведения к PChar. И посмотри размер скомпиленного ресурса - если он меньше суммарного размера .cur и .ani иконок, значит ресурс-компилер просто пропускает при построении реса этот .ani файл...
ЗЫ Ну уж не знаю чего у тебя там происходит 0_о
в первый раз в жизни такое получаю ©
← →
jetus (2008-01-13 22:54) [22]
> Попробуй MAKEINTRESOURCE() вместо приведения к PChar. И
> посмотри размер скомпиленного ресурса - если он меньше суммарного
> размера .cur и .ani иконок, значит ресурс-компилер просто
> пропускает при построении реса этот .ani файл...
C MAKEINTRESOURCE() всё аналогично.
Размер полученого .res-файла соответствующий.
Хотя, в принципе, ошибку выдаёт правильную "Указанное имя ресурса не найдено в файле образа.": в ресурсах ехе-файла в группе курсоров есть курсор 201, а 200-го нету. 200-ый лежит себе отдельным типом, а почему?
← →
Dib@zol © (2008-01-13 23:03) [23]> 200-ый лежит себе отдельным типом, а почему?
А вот потому что
> Error Cur.rc 1 13: Invalid cursor format
Просто RC, вестимо (непонятно, правда, накой) маскирует ету проблему...
← →
ага (2008-01-14 10:50) [24]
> 200-ый лежит себе отдельным типом, а почему?
Дык потому, что это и есть отдельный тип - анимированный курсор.
Выложи куда-нить этот файл курсора, попробую с ним скомпилить.
← →
JetuS (2008-01-14 11:28) [25]
> Дык потому, что это и есть отдельный тип - анимированный
> курсор.Выложи куда-нить этот файл курсора, попробую с ним
> скомпилить.
Да зачем выкладывать? Возьми любой .ani-файл (даже из папки винды) и попробуй с ним.
← →
ALS (2008-01-14 12:30) [26]Когда-то подключал анимированный курсор из rc-файла, прописывал код:
DARROW 21 darrow.ani
Были аналогичные проблемы, если в рессурсах модуля присутствовал XP-манифест.
← →
icWasya © (2008-01-14 17:16) [27]компилятор *.rc - файлов для дельфи отстаёт от микрософта, по этому -[26]
← →
jetus (2008-01-14 18:35) [28]
> Были аналогичные проблемы, если в рессурсах модуля присутствовал
> XP-манифест.
Гм... и как узнать, есть ли там манифест?
> компилятор *.rc - файлов для дельфи отстаёт от микрософта,
> по этому -[26]
Специально уже компилю через микрософтский rc.exe
← →
ага (2008-01-14 19:05) [29]
> JetuS (14.01.08 11:28) [25]
> Да зачем выкладывать? Возьми любой .ani-файл (даже из папки
> винды) и попробуй с ним.
С любым я уже пробовал - смотри ага (13.01.08 05:52) [17]
Ну твои дела, как знаешь
← →
ага (2008-01-14 19:10) [30]
> ALS (14.01.08 12:30) [26]
> Были аналогичные проблемы, если в рессурсах модуля присутствовал
> XP-манифест.
А у меня почему-то и с манифестом никаких проблем
← →
jetus (2008-01-14 21:04) [31]
> С любым я уже пробовал - смотри ага (13.01.08 05:52) [17]
> Ну твои дела, как знаешь
Гм...
Ну, раз у тебя всё получается, то выложи куда-нибудь архив с проектом (с ехе-шником, rc и res-файлами), а ещё лучше - отправь на jetuso@gmail.com,
буду тебе очень благодарен.
← →
ага (2008-01-14 21:55) [32]Да я бы отправил, да только твой сервак не хочет принимать архив с экзешником.
← →
jetus (2008-01-15 07:45) [33]
> Да я бы отправил, да только твой сервак не хочет принимать
> архив с экзешником.
Запакуй rar-ом, тогда ругаться не будет. А если лень, то кинь на jetus@rambler.ru :)
← →
ага (2008-01-15 15:25) [34]Дык я и так паковал - в ZIP, не приниало. Надо было попробовать ахиву расширение заменить, чет не сообразил с недосыпу:)) На рэмблер вроде ушло.
← →
jetus (2008-01-16 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-файл не тот выслал, то ли лыжи не едут )
← →
ага (2008-01-16 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 (2008-01-17 08:09) [37]
> Вот модуль:
Гы, действительно работает )
А теперь вот что я сделал: взял другой .ani-файл, назвал его "1.ani" и просто заменил твой. Скомпилировал ресурс. Перебилдил проект. Запускаю - выдаёт: "System Error. Code: 1814. Указанное имя ресурса не найдено в файле образа."
Беру твой файл назад. Компилю ресурс. Билдю проект. Запускаю - работает.
Кто-нибудь может объяснить мне, что происходит?!
З.Ы. Пробовал на 6 разных .ani-файлах с размерами от 6кБ до 80кБ - одинаково.
← →
JetuS (2008-01-17 09:19) [38]Всё, проблема решена.
Достаточно было удалить строку {$R WindowsXP.res}
Большое спасибо за помощь )
← →
ага (2008-01-17 10:42) [39]
> jetus (17.01.08 08:09) [37]
А я те говорил - давай твой курсор, попробую. Так нет, не послушал.
← →
имя (2008-02-28 22:10) [40]Удалено модератором
Страницы: 1 2 вся ветка
Форум: "WinAPI";
Текущий архив: 2009.01.18;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.005 c