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