2009-03-25 17 views
1

Ich baue eine Delphi-Komponente, um eine SDL Rendering-Oberfläche in ein VCL-Formular einzubetten. Es funktioniert problemlos, solange das Formular in dem Moment auf dem Bildschirm angezeigt wird, in dem die SDL-Oberfläche erstellt wird. Andernfalls können keine Rendering-Texturen erstellt werden.Warum schlägt CreateDIBSection() fehl, wenn das Fenster nicht angezeigt wird?

ich in den SDL-Code verfolgt und mit dem folgenden Funktionsaufruf am Ende, die fehlschlägt (NULL zurück):

data->hbm = CreateDIBSection(renderdata->memory_hdc, bmi, DIB_RGB_COLORS, &data->pixels, NULL, 0); 

Der HDC ein gültiges Handle auf die Zeichnung Kontext von einer Steuer Besitz ist, der hat seine eigenes HWND-Fensterhandle, das richtig eingerichtet wurde. Wenn das Steuerelement jedoch außerhalb des Bildschirms erstellt wird, was häufig in Delphi geschieht (alle Formulare mit ihren Steuerelementen werden in einem ausgeblendeten Status erstellt, bis sie angezeigt werden), wird der CreateDIBSection-Aufruf fehlschlagen, bis das Steuerelement tatsächlich sichtbar ist.

Auch wenn es auf dem Bildschirm erstellt, dann ausgeblendet und wieder angezeigt wird (wenn es auf einer Registerkarte ist und ich z. B. Tabs), werden alle Texturen, die ich erstelle, während dieses Prozesses ausgeblendet.

Das macht mich verrückt. Wer weiß was vor sich geht und wie ich es umgehen kann?

Antwort

0

Nur eine Idee .... Haben Sie das Fenster beobachtet? Wird es nicht geschlachtet und neu erschaffen?

+0

Nein. DestroyWnd wird nie aufgerufen. –

-1

Der Zeichnungskontext ist nur während der Paint-Verarbeitung gültig.

+0

Was ist "Lackverarbeitung"? Wann tritt es auf? –

+0

"Paint" bedeutet in der Paint-Methode des Steuerelements, die von PaintWindow als Antwort auf WM_PAINT-Nachrichten aufgerufen wird. PaintWindow initialisiert das Gerätekontexthandle des Steuerelements. –

+0

In diesem Fall ist Ihre Antwort eindeutig falsch. –

Verwandte Themen