Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.006 c
15-1227128472
АгатаКристи
2008-11-20 00:01
2009.01.18
JavaScript


1-1206530639
Igor_34
2008-03-26 14:23
2009.01.18
документ Word и компонент WebBrowser


8-1189345084
SysError
2007-09-09 17:38
2009.01.18
Как создать и cохранить MIDI


3-1213079849
Артем
2008-06-10 10:37
2009.01.18
проблема при работе с таблицами FoxPro 2.5


15-1226873370
wl
2008-11-17 01:09
2009.01.18
сниму коннату в москве или области





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский