Avatar billede mcgoat Nybegynder
27. august 2003 - 08:30 Der er 17 kommentarer og
1 løsning

TIcon & ExtractIcon

Hejsa og Godmorgen...

Er i gang med at lave en Icon Extractor og har følgende kode:

    HIcon = NULL;
    img = new TIcon;
    HIcon = ExtractIcon(frmMain->Handle,FL->Items->Strings[FL->ItemIndex].c_str(),TB->Position);
        if(HIcon == 0)
        {
            IconInfo->Caption = "No Icon(s) In File";
        }
        else
        {
            IconInfo->Caption = "X Icon(s) In File";
        }
    img->Handle = HIcon;
    Preview->Picture->Icon = img;

Så kan jeg så: img->SaveToFile("fil.ico");
Meennn TIcon kan godt vise ikoner med mange farver, men ikke gemme dem med mange farver, er der en anden måde til dette??
Og hvordan kan jeg finde ud af hvor mange ikoner der er i filen(exe,dll)???
Avatar billede marla05 Nybegynder
27. august 2003 - 09:56 #1
Hejsa

Du skal bruge ExtractIconEx, eksempelvis på følgende måde:

HICON hSmallIcons[1] = {0};
HICON hLargeIcons[1] = {0};

  UINT exResult = ExtractIconEx(resFile, 0, hLargeIcons, hSmallIcons, 1);

Det sidste 1-tal angiver hvor manger ikoner du ønsker at trække ud, det skal helst matche med dine arrays størrelser!

Du kan bruge følgende kald til at få af vide hvor mange ikoner der er i filen:

  UINT exResult = ExtractIconEx(resFile, -1, NULL, NULL, 1);

Antallet af ikoner returneres i exResult.

Læs på MSDN, der bliver funktionen beskrever meget godt:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/Resources/Icons/IconReference/IconFunctions/ExtractIconEx.asp


Lars
Avatar billede mcgoat Nybegynder
27. august 2003 - 10:06 #2
virker både og... Den returnerer 0 hvis jeg vælger C:\winnt\system32\shell32.dll, og jeg ved da at der ligger massere af ikoner deri :o(
Avatar billede marla05 Nybegynder
27. august 2003 - 10:15 #3
hmm, virker fint her!

UINT x = ExtractIconEx("c:\\winnt\\system32\\shell32.dll",-1,NULL,NULL,1);

Sætter x = 108
Avatar billede mcgoat Nybegynder
27. august 2003 - 10:20 #4
virker på den måde... men jeg har følgende, og der kan jeg ikke få den til det :o(

    const char *resFile;
    resFile = FL->Items->Strings[FL->ItemIndex].c_str();
    UINT exResult = ExtractIconEx(resFile, -1, NULL, NULL, 1);
    frmMain->Caption = String(exResult);
Avatar billede mcgoat Nybegynder
27. august 2003 - 10:21 #5
og FL er en FileList...
Avatar billede marla05 Nybegynder
27. august 2003 - 10:38 #6
Hmm, jeg tror ikke at resFile er valid på den måde.
Prøv istedet at allokere plads i resFile, og derefter strcpy strengen over:

char resFile[MAX_PATH] = {0};
strcpy(resFile, FL->Items->Strings[FL->ItemIndex].c_str());

Dobbelcheck lige at du får et valid indhold i resFile

Lars
Avatar billede mcgoat Nybegynder
27. august 2003 - 10:41 #7
Så virkede det sq :o) takker....

Kan du så også hjælpe med den anden ting?? Gemme ikon som Highres... ??
Avatar billede marla05 Nybegynder
27. august 2003 - 10:52 #8
Sorry, kender ikke TIcon classen.
Jeg kan sgu ikke lige finde en funktion der fortæller om ikonet er highres...
Avatar billede mcgoat Nybegynder
27. august 2003 - 10:58 #9
er okay... læste det under TIcon i BCB... bare noget skod... nåh, men læg et svar så får du lidt points
Avatar billede marla05 Nybegynder
27. august 2003 - 11:00 #10
Er det en Borland klasse? Det kender jeg ikke meget til (læs intet), der mås da stå et eller andet i hjælpen...
Avatar billede mcgoat Nybegynder
27. august 2003 - 11:08 #11
Står bare at TIcon kan godt indlæse Ikoner med mange farver, men kan ikke gemme dem med mange farver... totalt skod :o(
Avatar billede mcgoat Nybegynder
27. august 2003 - 11:09 #12
Meenn, jeg kan godt gemme ikonet som et BMP, så hvis der er en funktion til at konvertere BMP til ICO ville det jo også være en stor hjælp :o)
Avatar billede marla05 Nybegynder
27. august 2003 - 11:14 #13
Der findes ingen funktioner der kan gemme en ikon igen..... har altid undret mig, men det findes ikke! Men der er sikkert nogen derude der har lavet en funktion der tager en HICON og gemmer den på disken.

Principielt er det jo bare at udfylde en icon struktur binært og hamre lortet ned på disken...

Lars
Avatar billede mcgoat Nybegynder
27. august 2003 - 11:29 #14
HIcon = NULL;
    img = new TIcon;
    HIcon = ExtractIcon(frmMain->Handle,FL->Items->Strings[FL->ItemIndex].c_str(),TB->Position);
        if(HIcon == 0)
        {
            IconInfo->Caption = "No Icon(s) In File";
        }
        else
        {
            IconInfo->Caption = String(exResult) + " Icon(s) In File";
            img->Handle = HIcon;
            Preview->Picture->Icon = img;
        }

String FIL = FL->Items->Strings[FL->ItemIndex];
FIL = FIL.SubString(1,strlen(FIL.c_str())-4);
img->SaveToFile("D:\\IKON\\" + FIL + "-" + String(TB->Position) + ".ico");

Man kan godt gemme det, men bliver ikke godt..
Avatar billede marla05 Nybegynder
27. august 2003 - 11:38 #15
Du kan vha GetIconInfo få fat i handlen til det bitmap der udgør ikonet.
Du kan derefter bruge CBitmap::GetBitmap() til at få en BITMAP struktur tilbage, denne struktur beskrive hvor mange bitplanes mede mere det udgør, og du kan deraf check om ikonet er highres
Avatar billede mcgoat Nybegynder
28. august 2003 - 13:29 #16
men jeg vil ikke tjekke om det er highres... jeg vil gemme det i highres... men det kan TIcon ikke gøre, og det skal gemmes som .ico
Avatar billede mcgoat Nybegynder
24. marts 2004 - 15:58 #17
Hmm ingen svar... hvis nogen vil have point så bare skriv
Avatar billede mcgoat Nybegynder
03. maj 2004 - 08:08 #18
marla05 smid et svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester