Formular schneller anzeigen
-
Hallo zusamm'
Ich habe in einem Programm ein rahmenloses Formular mit einem Image (640x480, Align=alClient) darin, um ein paar Infos anzuzeigen. Das Image lasse ich im Konstruktur des Formulars aus einer JPG-Resource laden. Wenn ich dieses Formular aus einem anderen heraus mit Show() anzeigen lasse, erscheint das Formular sofort, allerdings dauert es etwa 2 Sekunden, bis das Image erscheint. Wie kann man das beschleunigen?
PS: Wenn ich im Konstruktor z.B. nur ein Rechteck in das Image zeichnen lasse, passiert das Anzeigen ohne Verzögerung.....
-
hm
ich weiss jetzt nciht, ob es viel bring, aber versuch mal:1. Schalte DoubleBuffering des Formulars auf true;
2. Zeichne das Bild direkt auf das Formular. Benutze dazu die Canvas-Eigenschaft. Mach das im OnPaint-Ereignis des Formularswenn sich das Formular zeichnet, muss das Bild dann gleich mitgeledaen werden. Das sollte die Verzögerung etwas abschwächen.
-
Ich werds gleich mal testen, aber ich glaub nicht, dasses was bringt, denn einlesen und dem Image zuweisen tu ich das Bild ja schon im Konstruktor...
Und, ähm, wie schalte ich das DobleBuffering auf true?
Und wie weise ich das JPG-Image dem Formular-Canvas zu?
,
-
einfach im FormCtor
Form1->DoubleBuffered = true;
fertig.
Bei dem Canvas kann ich dir jetzt nicht helfen, aber ich denke die BCB Hilfe is mal ein guter anfng
-
Was habt ihr nur immer mit dem Ctor des Forms? Wieso nicht einfach den Objektinspektor verwenden?!?
-junix
-
junix schrieb:
Wieso nicht einfach den Objektinspektor verwenden?!?
-junix
Also bei mir im BCB 5 Prof kann ich das für die Form im OI nicht einstellen, daher im Ctor
-
DoubleBuffered (welches es beim BCB6 übrigens auch nicht im OI gibt), bringt es leider auch nicht.
Ich hab jetzt mal das JPG-Image über ne Bitmap in den Canvas kopiert. Nur dummerweise wird kein Bild angezeigt. Hier der Source von Konstruktor://--------------------------------------------------------------------------- __fastcall TfrmSplash::TfrmSplash(TComponent* Owner) : TForm(Owner) { this->DoubleBuffered = true; HRSRC hRes = FindResource(HInstance, MAKEINTRESOURCE(ID_SPLASH), RT_RCDATA); if(hRes) { DWORD dwSize = SizeofResource(HInstance, hRes); HGLOBAL hgMem = LoadResource(HInstance, hRes); if(hgMem) { LPVOID pMem = LockResource(hgMem); auto_ptr<TMemoryStream> pStream(new TMemoryStream); pStream->Write(pMem, dwSize); pStream->Position = 0; auto_ptr<TJPEGImage> pJPG(new TJPEGImage()); pJPG->LoadFromStream(pStream.get()); auto_ptr<Graphics::TBitmap> pBmp(new Graphics::TBitmap()); pBmp->Assign(pJPG.get()); Canvas->CopyMode = cmSrcCopy; TRect r = Rect(0, 0, ClientWidth, ClientHeight); Canvas->CopyRect(r, pBmp.get()->Canvas, r); } } } //---------------------------------------------------------------------------
Hat jemand ne Idee?
-
Wozu das:
pStream->Write(pMem, dwSize);
?
Und warum lädst Du das Image nicht einfach von der Platte sondern umständlich aus der Resource in den Stream usw ...
-
F98 schrieb:
Wozu das:
pStream->Write(pMem, dwSize);
?
Und warum lädst Du das Image nicht einfach von der Platte sondern umständlich aus der Resource in den Stream usw ...
Weil ich sämtliche Images etc. als Resource einbinde, u.a. auch das JPG-Bild. Der Umweg über den Mem-Stream, weil TJPEGImage es nicht ermöglicht, Daten direkt aus dem Speicher zu lesen, aber z.B. aus nem Stream. Und nach dem Laden einer Raw-Resource, liegt diese halt im Speicher
.
-
@F98: Schau z.B. mal auf deine Site -> C++Builder -> Resourcen
Nur von BCBDev.com kopiert ?.
-
Ich entsinne mich, jetzt wo Du's sagst. Ist schon lange her, dass ich mich damit beschäftigt habe.
Kann sein, dass ich das von der Seite her habe.