2017-09-28 4 views
0

Un TCanvasGPU est utilisé pour les plates-formes mobiles sur FireMonkey. Malheureusement, comme quelqu'un l'a découvert: FMX on iOS: how to perform partial invalidation?, ce canevas ne supporte pas les clivés et Canvas.InvalidateRect (TRectF) invalide toujours le canevas entier.Comment arrêter FireMonkey TPaintBox d'effacer son arrière-plan?

Cela ne serait pas si grave, sauf que l'arrière-plan de la toile est toujours effacé avant un événement OnPaint. Ce qui signifie que toute tentative de mettre à jour juste un rectangle dans un OnPaint est vouée à l'échec, car toute la zone est effacée en premier. Donc, même la plus petite mise à jour nécessite que la toile entière soit dessinée.

Est-ce que quelqu'un sait s'il est possible d'arrêter l'effacement d'un arrière-plan de contrôle (spécifiquement TPaintBox) dans FireMonkey? Cela était possible dans VCL en définissant ControlStyle: = ControlStyle + [csOpaque].

J'ai trouvé TCustomForm.PaintBackground dans FMX.Forms, j'ai fait une copie locale et j'ai commenté l'appel dans TCustomForm.PaintRects, pensant qu'il arrêterait l'effacement des contrôles, mais le canevas TPaintBox a quand même été effacé.

Répondre

0

Pour répondre à ma propre question ...

TForm par défaut est de style pour inclure un TRectangle comme premier composant, et ceci est rempli de gris clair en tout état de cause de la peinture. En commentant ceci, remplissez FMX.Objects.TRectangle.Paint assez sûr, sur Windows, le TPaintBox Canvas conserve son image sur n'importe quel Invalidate.

Malheureusement sur Android, l'écran passe juste au noir au lieu du gris clair. Il semble donc que l'image TCanvasGPU n'est pas conservée entre les événements de peinture sur mobile, ce qui explique probablement pourquoi les clivettes ne sont pas supportées.