Question

J'ai une application MFC qui affiche des cartes annotées, qui peuvent inclure une grande quantité de texte. Bien que la taille et la police du texte n'a pas tendance à changer beaucoup, la rotation du texte varie considérablement, pour être aligné avec le travail en ligne autour. Cela signifie que je dois faire créer et sélectionnez une nouvelle police dans le contexte d'affichage à chaque fois que les changements de rotation. Quelque chose comme;

if (TextRotationChanges)
{
    m_pFont = new CFont;
    m_lf.lfEscapement = NewRotation;
    m_pFont->CreateFontIndirect(&m_lf);
}
CFont *OldFont = m_pDC->SelectObject(m_pFont);
m_pDC->TextOut(x,y,text,strlen(text));
m_pDC->SelectObject(OldFont);

Ceci est évidemment lent lorsqu'il s'agit de grandes quantités de texte. Est-il possible d'accélérer ce sans aller à un moteur d'affichage différent tel que D3D ou OpenGL? Autrement dit, puis-je changer la rotation de texte dans la police sélectionnée existante?

N.B.. Je suis déjà à réaliser d'autres optimisations évidentes, comme assurer le texte est à l'écran à une taille visible avant de tenter de le dessiner.

Était-ce utile?

La solution

Créer et détruire de nombreux objets GDI peut être lent. Ce que vous pouvez faire est de créer 360 polices au démarrage de votre programme afin que vous puissiez SelectObject () à partir d'une table de consultation avec les polices pré-faites à la rotation correcte, plutôt que de les créer à la demande. Ou vous pouvez faire pivoter votre texte par ne pas utiliser lfEscapement mais en utilisant SetWorldTransform () avec la matrice de rotation appropriée (encore une fois, vous pouvez mettre en cache des matrices de rotation pour la vitesse). Il faudrait vérifier s'il vous donnera en fait un gain de vitesse.

Voir ma question ici SetWorldTransform () et la rotation de la police pour une question que j'eu / ont avec cette approche, bien que (n'ont pas eu le temps de revenir en arrière et regarder dedans).

Autres conseils

Êtes-vous sûr que le problème est la police et non pas le TextOut
L'idée d'Oleg d'utiliser un tampon de retour est pas mal si vous voulez éviter le clignotement.

Si je devais utiliser un moteur graphique que je vais essayer Caire car il a été conçu spécifiquement pour cette genre d'emplois.
(Il peut rendre directement sur Win32 surfaces DC)

Vous devez tout d'abord dessiner sur l'invisible DC et que copier sur votre DC.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top