Zamiana HIcon na Bitmapę

0

Zamieniam HICON na Bitmapę za pomocą takiego kodu :

#include <memory>

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    String File ;
    if(OpenDialog1->Execute())
    {
        File = OpenDialog1->FileName ;
    }

    HICON Ikona ;
    WORD Index ;
    Ikona = ExtractAssociatedIcon(HInstance, File.c_str(), &Index) ;
    Image1->Picture->Icon->Handle = Ikona ;

    ICONINFO IconInfo ;
    GetIconInfo(Ikona, &IconInfo) ;
    std::auto_ptr<Graphics::TBitmap>BitmapColor(new Graphics::TBitmap());
    BitmapColor->Handle = IconInfo.hbmColor ;
    Graphics::TBitmap *Tmp = new Graphics::TBitmap ;
    Tmp->Assign(BitmapColor.get());
    Image2->Picture->Bitmap = Tmp ;
}

Ale powstała w wyniku tej konwersji Bitmapa jest trochę zwalona :-( : http://img297.imageshack.us/my.php?image=obrazgp6.png
Czy ktoś wie co z tym fantem trzeba zrobić, tak żeby obraz na Image2 był taki sam jak na Image1 ?
Z góry dzięki

0

Pamiętaj, że ikona może być przezroczysta, bitmapa nie. Po prostu tam, gdzie ikona jest przezroczysta kolory pikseli są nieprzewidziane, stąd taki dziwny rysunek po przeniesieniu ich na nieprzezroczystą bitmapę.

  1. Utwórz bitmapę (Graphics::TBitmap* Bitmapa = new Graphics::TBitmap())
  2. Ustaw jej rozmiary zgodnie z rozmiarami ikony (Bitmapa->Width = ...)
  3. Namaluj tło bitmapy (np. Bitmapa->Canvas->FillRect(...);)
  4. Przenieś zawartość Image1 na kontekst bitmapy (Bitmapa->Canvas->Draw(0, 0, Image1->Picture)).
  5. Skopiuj bitmapę do Image2 (Image2->Picture->Bitmap = Bitmapa)
  6. Usuń bitmapę (delete Bitmapa)

ew. zamiast new i delete użyj swojego auto_ptr, ale w tym miejscu jest nie potrzebny

0

Dzięki, ale zamiast ikony w Image2 pojawia mi się biały kwadrat. Oto kod :

String File ;
    if(OpenDialog1->Execute())
    {
        File = OpenDialog1->FileName ;
    }

    HICON Ikona ;
    WORD Index ;
    Ikona = ExtractAssociatedIcon(HInstance, File.c_str(), &Index) ;
    Image1->Picture->Icon->Handle = Ikona ;


    Graphics::TBitmap* Bitmapa = new Graphics::TBitmap() ;
    Bitmapa->Width = 32 ;
    Bitmapa->Height = 32 ;
    TRect R = TRect(0, 0, Bitmapa->Width, Bitmapa->Height) ;
    Bitmapa->Canvas->FillRect(R) ;
    Bitmapa->Canvas->Draw(0, 0, Image1->Picture->Bitmap) ;
    Image2->Picture->Bitmap = Bitmapa ;

EDIT :
OK działa, Zamiast Bitmapa->Canvas->Draw(0, 0, Image1->Picture->Bitmap) ; trzeba było zrobić Bitmapa->Canvas->Draw(0, 0, Image1->Picture->Graphic) ;
Jeszcze raz dzięki

0

Brakuje ci dwóch rzecz na końcu:

delete Bitamapa;
DestroyIcon(Ikona);

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