2010-11-15 7 views
0

J'essaie de surveiller la position de la souris sur la zone client de la fenêtre. par exemple:Invalider ou ajouter du texte

WM_MOUSEMOVE: 
{ 
    std::ostringstring oss; 

    xPos = LOWORD(lParam); 
    yPos = HIWORD(lParam); 

    oss << xPos << ", " << yPos; 

    TextOut(hDC, 100, 100, oss.str().c_str(), oss.str().size()); 
} 

Ai-je besoin de mesurer la hauteur, la largeur des polices pour obtenir la zone à effacer avant de tirer un nouveau texte? Je ne comprends pas si j'aurais besoin d'écrêtage pour redessiner la région ou juste invalider rect serait suffisant pour dessiner correctement le texte.

Répondre

1

Chaque fois que vous dessinez du texte, utilisez GetTextExtentPoint32 pour mesurer la taille de la zone écrite et enregistrez-la quelque part. Ensuite, lorsque vous essayez de dessiner quelque chose de nouveau, vous pouvez passer un rectangle basé sur cette valeur dans InvalidateRect pour indiquer votre désir d'effacement, puis sur UpdateWindow pour que l'effacement s'effectue immédiatement.

+0

Serait-il possible de faire l'opération de dessin dans WM_PAINT pour que le texte soit redessiné? Parce que si je mets TextOut dans WM_PAINT cela invaliderait seulement l'ancienne zone écrite. – cnd

+0

@cnd C'est la meilleure pratique pour mettre le 'TextOut' dans WM_PAINT, car Windows va régler le nombre de messages WM_PAINT que vous devez traiter. Vous devrez invalider un rectangle plus grand pour vous assurer que la nouvelle valeur a été affichée sans être coupée, ou peut-être invalider le contrôle entier. –