![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перерисовка PopupMenu
Dib@zol © (2007-09-30 16:45:00)Как по запросу перерисовать всплывающее меню, используя только средства API? Вот у главного меню есть DrawMenuBar, а вот как обновить поп-уп, ума не приложу... Ах да, вдогонку - как загрузить из ресурса анимированный курсор? LoadCursor не катит, т.к. ни brcc32, ни ImagEdit.exe, ни Resource Builder не могут запихать в Icon- или Cursor-секцию реса файлы данного типа, грят неправильный формат.
Dib@zol (2007-10-10 20:00:00) [1]Мдя. На ХР-шнике мой код тоже работает. А вот на 98-м - не пашет ни один... :(
Ping (2007-10-10 19:40:00) [2]У меня вот это "на скорую руку" работает:
const
MY_CURSOR = $100;
procedure TForm1.FormCreate(Sender: TObject);
var
hRes: THandle;
iSize: integer;
hGlob: THandle;
pBytes: PByte;
hCursor: THandle;
begin
hRes := FindResource(HINSTANCE, 'MY_CURSOR', 'ANICURSORS');
iSize := SizeOfResource(HINSTANCE, hRes);
hGlob := LoadResource(HINSTANCE, hRes);
pBytes := LockResource(hGlob);
Screen.Cursors[MY_CURSOR] := CreateIconFromResource(pBytes, iSize, true, $30000);
Cursor := MY_CURSOR;
Тестировал на windows\cursors\dinosaur.ani
Вот такой вот .rc
MY_CURSOR ANICURSORS "dinosaur.ani"
P.S. В коде, скорее всего, утечки памяти.
Dib@zol (2007-10-10 19:23:00) [3]ГетЛастЕррор возвращает результат, который был задан до вызова CreateIconFromResource.
Dib@zol (2007-10-10 19:21:00) [4]я кладу в ресы иконку ANI-формата. Поскольку в стандартный раздел ICON доступными мне средствами его не положишь, пришлось создавать собственный раздел ресов, называется ANIMATED. Даю иконке имя ANIICON1. Сохраняю ресы, линкую их к проге (*$R Icon.res*) и вызываю функцию:
I : HICON;
...
I:=LoadIconEx(hInstance, 'ANIICON1', 'ANIMATED');
Трассирую функцию. Ресурс найден, и получен его размер. Получена и сохранена в P ссылка на него. Вызываю CreateIconFromResource - и ни фига! Result=0! Почему???
Ping (2007-10-10 19:01:00) [5]Что ты в ресурс кладешь? Как называется ресурс? Как вызываешь приведенную тобой функцию?
Dib@zol (2007-10-10 18:09:00) [6]Погуглился. Как ни странно - нифига! Тык что, никто не знает? :(
Dib@zol (2007-09-30 22:08:00) [7]Вот, сижу решаю 2-ю проблему. Может ли мне кто-нибудь вразумительно объяснить, почему не работает вот эта функция??? CreateIconFromResource возвращает всегда 0, хотя отладка показывает, что ресурс она находит и правильно определяет размер. ГетЛастЕррор возвращает результат, который был задан до вызова функции. В чём же причина?
function LoadIconEx(H:HINST; N, T:PChar):HICON;
var
R : HRSRC;
S : Cardinal;
G : HGLOBAL;
P : Pointer;
begin
Result:=0;
R:=FindResource(H, N, T);
if R=0 then exit;
S:=SizeOfResource(H, R);
G:=LoadResource(H, R);
P:=LockResource(G);
Result:=CreateIconFromResource(P, S, true, $00030000);
end;
Dib@zol (2007-09-30 19:41:00) [8]ОК. Первая проблема решилась принятием WM_ENTERIDLE. Осталась вторая...