?
*Booo*, da kann ich lange knobeln. Wozu konvertieren, wenn die Canvas Draw'en kann? - So einfach hätt ich das nicht erwartet - . Bin euch sehr dankbar.
@Aoeke, nach der Hilfe sollen ICON und Metafile immer transparent sein. Ich merx nur nix davon. Vielleicht geht es in den neueren BCB-Versionen? - Aber in einer richtigen Anwendung kann man die Transparentfarbe bestimmen. Via API muß es möglich sein...
@WebFritzi hat in seinem Beispiel ja clTransparent drin. Nutzlos macht er sowas nicht. Ich muß noch mal mit Ruhe expirimentieren. - ... Ich glaub schon, daß ich die Funktionen aufrufen kann. Was nützt ein bmp, wenn es nicht mit new initialisiert wurde? *Oh_ich_Nili_mit_der_dünnen_Scheibe*
Aber @WebFritzi, das Teilchen belegt zur Laufzeit permanent Speicher. Es wird sicher sinnvoll sein, solche Funktionen so abzuschließen:
bmp->Width = 1;
bmp->Height = 1;
Oder lieg ich falsch?
Ole, mal abgesehen von der Transparenz, mein Code war noch falsch aufgebaut. Damit alles richtig laufen kann, sieht es im Auszug so aus:
void __fastcall TPixi::Open(TObject *Sender)
{
Image->AutoSize = true;
...
if (ExtractFileExt(OpenDialog->FileName).LowerCase() == ".ico")
{
TIcon *icn = new TIcon();
icn->LoadFromFile(OpenDialog->FileName);
Image->Width = icn->Width;
Image->Height = icn->Height;
Image->Picture->Graphic->Width = icn->Width;
Image->Picture->Graphic->Height = icn->Height;
Image->Canvas->Draw(0,0,icn);
delete icn;
}
ImgOriWidth = Image->Width; // für Zoomfaktorberechnung
ImgOriHeight = Image->Height; // dto.
Image->AutoSize = false;
BildModified = false;
VergrBox->ItemIndex=0; // 100%
ZFac = 1;
FormResize(Sender); // Bild zentrieren
SetCaption(Sender);
BitmapHandleType(Sender); // DDB, alles flutscht wesentlich besser
}
//---------------------------------------------------------------------------
void __fastcall TPixi::SaveAsIco(TObject *Sender)
{
int pixels;
if(Image->Picture->Graphic->Width==16 &&
Image->Picture->Graphic->Height==16)
pixels = 16;
else if(Image->Picture->Graphic->Width==32 &&
Image->Picture->Graphic->Height==32)
pixels = 32;
else if(Image->Picture->Graphic->Width==48 &&
Image->Picture->Graphic->Height==48)
pixels = 48;
else pixels = 0;
if (Image->Picture->Graphic->Width<=48 &&
Image->Picture->Graphic->Height<=48 && pixels != 0)
{
Graphics::TBitmap* NewBmp = new Graphics::TBitmap;
TImageList* List = new TImageList(Application);
icn = new TIcon;
List->Height = pixels;
List->Width = pixels;
NewBmp->Width = pixels;
NewBmp->Height = pixels;
NewBmp->Canvas->StretchDraw(NewBmp->Canvas->ClipRect,
Image->Picture->Graphic);
List->AddMasked(NewBmp, clTransparent);
List->GetIcon(0, icn);
delete List;
icn->SaveToFile(SaveDialog->FileName);
Image->Picture->Assign(NewBmp);
delete NewBmp;
}
else
{
SDOK = false; // verhindert Aktionen im else-Fall
ShowMessage("Ungültige Symbolgröße.\n\nBild konnte nicht gespeichert werden.");
return;
}
}
Dann hätt ich noch 'ne Caption-Frage (PixelFormat). Außerdem muß ich das PixelFormat der ArbeitsBitmap zuweisen. PixelFormat bei TIcon? Aber die Teilchen haben auch ein Speicherformat. Weiß jemand, wie man das auslesen kann?