2009-03-25 5 views
1

Je construis un composant Delphi pour incorporer une surface de rendu SDL sur un formulaire VCL. Cela fonctionne très bien tant que le formulaire est à l'écran au moment où la surface SDL est créée. Sinon, il n'est pas capable de créer des textures de rendu.Pourquoi CreateDIBSection() échoue-t-il lorsque la fenêtre est hors-écran?

Je retracée dans le code SDL et a fini avec l'appel de fonction suivante, qui échoue (retourne NULL):

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

Le HDC est une poignée valide dans le contexte de dessin appartenant à un contrôle qui a son propre poignée de fenêtre HWND, qui a été correctement configuré. Mais lorsque le contrôle est créé en dehors de l'écran, ce qui se produit généralement dans Delphi (tous les formulaires, avec leurs contrôles, sont créés dans un état caché jusqu'au moment de les afficher), l'appel CreateDIBSection échouera jusqu'à ce que le contrôle soit visible.

De même, si elle est créée à l'écran, puis masquée et ré-affichée (si elle est sur une feuille d'onglet et que je change d'onglet, par exemple), toutes les textures que je crée sont masquées pendant ce processus.

Cela me rend fou. Quelqu'un sait ce qui se passe et comment je peux contourner cela?

Répondre

0

Juste une idée .... Avez-vous regardé la fenêtre Poignée? N'est-il pas bouché et recréé?

+0

Non. DestroyWnd n'est jamais appelé. –

-1

Le contexte de dessin est uniquement valide pendant le traitement de peinture.

+0

Qu'est-ce que c'est «traitement de la peinture»? Quand cela se produit-il? –

+0

Les moyens de traitement "Paint" sont dans la méthode Paint du contrôle, appelée par PaintWindow en réponse aux messages WM_PAINT. PaintWindow est ce qui initialise le handle de contexte de périphérique du contrôle. –

+0

Dans ce cas, votre réponse est tout à fait fausse. –

Questions connexes