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

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

ico -> Imagelist -> bitmap [WinXP]


Sergey_FV ©   (2006-10-28 02:15:00) 

Уважаемые мастера.

Возник вопрос, бюсь, и ни как немогу врубится.
Отображаю програмы для запуска в popupmenu с иконкой, так как програм много, все иконки загоняю в ImageList, потом просто отрисовываю в меню. Вот тут и проблема с 32бит иконками. Если добавлять иконки не посредственно в ImageList заранее, то отображается как и положено, а если програмно, фигня получается.
Метод добавления прост:

Ic:=TIcon.Create;
Ic.Handle:=GetFileIconByName(FName);// достаём иконку из файла
ImageList1.AddIcon(Ic);

Вот и не пойму как нормально отобразить иконку.


Vovan#1   (2006-10-29 16:53:00) [1]

> у битмапа нет прозрачности. и не было никогда.

И не будет.


Sergey_FV   (2006-10-29 13:57:00) [2]

Ясно, спасибо ещё раз.


Ketmar   (2006-10-29 13:02:00) [3]

у битмапа нет прозрачности. и не было никогда. если, конечно, не рисовать руками через AlphaBlend().


Sergey_FV   (2006-10-29 12:41:00) [4]

Да, ещё бы с прозрачностью разобраться, что-бы и у битмапа там-же прозрачно было как у иконки.


Sergey_FV   (2006-10-29 12:33:00) [5]

Сделал так:
// кусь //

Ic.Handle:=(Хендл Иконки)
bmp:=tbitmap.Create;
Bmp.Height:=16;
Bmp.Width:= 16;
DrawIconEx(Bmp.Canvas.Handle,0,0,ic.Handle,GetSystemMetrics(SM_CXSMICON)
                  ,GetSystemMetrics(SM_CYSMICON),0,ic.Handle,DI_NORMAL);

ImageList1.add(bmp,nil);
bmp.Free;

// кусь //

Результат меня устраивает, отоброжает как надо.

Всем спасибо.


Ketmar   (2006-10-29 02:39:00) [6]

>[7] homm(c) 29-Oct-2006, 02:32
>с виндой уж дельфи работает более менее правильно.
в этом случае -- скорее "менее". потому что код TIcon. потому что не было в win95 таких иконок. %-)


homm   (2006-10-29 02:32:00) [7]


> баян. Delphi не умеет работать с сильно многоцветными иконками.

имхо, ему и не надо. Винда должна с ними работать, а вот с виндой уж дельфи работает более менее правильно.


Sergey_FV   (2006-10-28 19:29:00) [8]

Спасибо, нашёл, скачал, разбираюсь :)


Ketmar   (2006-10-28 17:23:00) [9]

поиск по анкетам. Rouse_. в анкете -- ссылка на сайт (мне ещё и искать за тебя?!)


Sergey_FV   (2006-10-28 16:06:00) [10]

Мда.
#0FFFF спасибо, но не работает, вернее, работает но так же как и раньше.

Ketmar  не въехал, что за сайт? Что за компонент?


Ketmar   (2006-10-28 14:38:00) [11]

>[2] #0FFFF 28-Oct-2006, 11:20
>Вот у меня отлично отображаются, поможет может?
так ты TIcon не используешь. %-)


#0FFFF   (2006-10-28 11:20:00) [12]

Вот у меня отлично отображаются, поможет может?

uses
 ShellAPI, ShlObj, PsAPI, TlHelp32

function GetIcon(const FileName: string): TIcon;
var
 FileInfo: TShFileInfo;
 ImageList: TImageList;
begin
 Result := TIcon.Create;
 ImageList := TImageList.Create(nil);
 FillChar(FileInfo, SizeOf(FileInfo), #0);
 ImageList.ShareImages := true;
 ImageList.Handle := SHGetFileInfo(
   PChar(FileName),
   SFGAO_SHARE,
   FileInfo,
   SizeOf(FileInfo),
   SHGFI_SMALLICON or SHGFI_SYSICONINDEX
   );
 ImageList.GetIcon(FileInfo.iIcon, Result);
 ImageList.Free;
end;

procedure TForm1.GetProcessesList();
var
 hSnapshoot:         THandle;
 lppe:               TProcessEntry32;
 NewItem:            TMenuItem;
 ExePath:            array [0..MAX_PATH] of Char;
 PrHandle:           THandle;
begin
 hSnapshoot:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 lppe.dwSize:= SizeOf(TProcessEntry32);
 if (Process32First(hSnapshoot, lppe)) then
 repeat
   PrHandle:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, lppe.th32ProcessID);
   GetModuleFileNameEx(PrHandle, 0, ExePath, SizeOf(ExePath));
   ImageList1.AddIcon(GetIcon(ExePath));
   NewItem:= TMenuItem.Create(PopupMenu1);
   NewItem.Caption:= lppe.szExeFile;
   NewItem.ImageIndex:= ImageList1.Count - 1;
   PopupMenu1.Items.Add(NewItem);
 until
   not Process32Next(hSnapshoot, lppe);
 CloseHandle (hSnapshoot);
end;


Ketmar   (2006-10-28 03:44:00) [13]

баян. Delphi не умеет работать с сильно многоцветными иконками. иди на сайт Rouse_(c), бери компонент, делай на его основе.


Наверх

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