Rysowanie ikony w listboxie

0

Witam

Jak narysować ikonę w listboxie znając jej uchwyt?

Np mam uchwyt

ico_handle:=ExtractIcon(HInstance, 'Nazwapliku', 32);

I teraz chce ją narysować w listboxie:

listbox.canvas.draw(rect.left+5, rect.top, ico_handle);

Tyle, że przy canvas.draw należy użyć klasy TGraphic, nie można tego zrobić przez uchwyt...

Jak to zrobić?

0
img := ticon.Create;
img.Handle := Handle;
0

Już niestety tego próbowałem (TBitmap również) - ale nie działa. Pozostaje tylko puste miejsce...

Dodam, że każdy item rysuje osobno w OnDrawItem, czyli rysuje tlo, obramowanie i tekst (i chce ikone) - może to ma jakiś wplyw?

0

U mnie działa bezproblemowo - zerknij na kod źródłowy i wynikowy: http://l.fronczyk.novacom.pl/4p/v2.rar

0

Hehehe - przy uruchomieniu exeka wywala mi access violation :P. Musze przeniesc te pliki na drugiego kompa (z delphi) i skompilowac jeszcze raz... B)

// EDIT - po sprawdzeniu

Hm... To, co ja robie i to, co Ty mi wyslales, łączy chyba tylko klasa TIcon :]. Nic poza tym...

// owszem, łączy je tylko to, o co pytasz - Ł

0

Napisałem na szybko program, który ma wydobyć te ikone i narysowac ja na canvasie formy.
Oto caly unit:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, shellapi;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    OpenDialog: TOpenDialog;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
if openDialog.execute then edit1.Text:= openDialog.FileName;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
ico: TIcon;
ico_handle: THandle;
begin
ico_handle:=extractIcon(Hinstance, PChar(edit1.text), 32);

ico:=TIcon.Create;
ico.Handle:=ico_handle;

form1.Canvas.Draw(10, 50, ico);
end;

end.

Niestety nie działa :]. Nie zostaje wyświetlona ikona w miejscu o współrzędnych x:10 y:50...

0

sprawdziłeś, czy ico_handle jest różny od zera?

0

ico_handle niestety się równa zeru :/. To widocznie wina funkcji ExtractIcon... Jednak co jest w niej źle?

0

sam debuguj swoje programy. sprawdź, czy wszystkie parametry dla funkcji wyciągającej uchwyt ikonki są poprawne, bo na mur beton tam występuje błąd (polecam lekturę msdn).

0

Hehehe :)

W ostatnim parametrze (nIconIndex) zamiast 32 należało wpisać 0... I to był ten błąd :).

To teraz kolejny problem :P. Ta ikona ma wielkość 32x32, a mnie to niebardzo pasuje... Potrzebuję 16x16... Pytanie: czy da się z pliku ikony (znając ten felerny uchwyt) wyciągnąć ikonę w rozmiarze 16x16, czy trzeba skalować w canvasie (jak tak, to jak?)

0

facet, masz F1 na klawiaturze jak każdy. skoro używasz metody draw, to mógłbyś poszukać, czy ten sam obiekt który ma tę metodę aby nie ma innej, która pomoże zmienić rozmiar obrazka! StretchDraw + F1
poza tym w pliku exe przeważnie jest więcej niż jedna ikona, sprawdź wszystkie indeksy dla których są ikony i wybierz tą, która ma żądane rozmiary.

0

Tyle, że przez stretchdraw z tej ikonki wyjdzie niewiadomoco, jakiś niewielki zbitek pikseli :]. Nie da się tym pierwszym sposobem (jeśli w ogóle taki istnieje)?

0

Jest sposób :)
extractIconEx - więcej tutaj
Tyle, że w "paczce" ikony musi być wersja także 16x16 :) Jak nie ma to pobieraj tą dużą wersję a potem jakaś metoda zmniejszania urazów obrazka przy zmniejszaniu/powiększaniu np. bicubic ;] Więcej o bicubic, bilinera itp. znajdziesz na google :)

0

Może zainteresuj się DrawIconEx.
DrawIconEx(canvas.handle,x,y,hIcon,size_x,size_y,0,0,DI_NORMAL);

0

PcSa, nav, ŁF - dzieki Wam za pomoc <browar>

1 użytkowników online, w tym zalogowanych: 0, gości: 1