Vous n'écrivez pas sur quel OS vous avez des problèmes avec les artefacts après l'effacement. Au moins avec la composition du bureau activée, c'est une très mauvaise idée de dessiner directement sur le bureau et de faire de la peinture XOR (voir "Dessiner et lire depuis l'écran - Baaaad!" Dans this blog post). Mis à part les conséquences négatives sur les performances, vous ne pouvez pas être sûr que les autres peintures se produisent en même temps et quels effets et animations modifient le contenu affiché, un simple XOR peut donc ne pas suffire à tout effacer complètement.
Une façon possible de l'implémenter serait une fenêtre de superposition transparente de taille de bureau, et de dessiner votre sélecteur de bande élastique par-dessus. Invalider toute la fenêtre si les changements de taille devraient suffire, pas besoin d'effacer l'ancienne ligne de sélection. Si la superposition est supprimée, la ligne sera également supprimée. La composition du bureau assurera qu'aucun scintillement ne se produira. Cependant, changer d'application en sélectionnant une zone sera problématique, vous devez l'attraper et annuler immédiatement la sélection.
Edit:
Je viens de tester avec Delphi 2009, et avec l'application de test suivant:
- un formulaire avec
FormStyle
ensemble à fsStayOnTop
et AlphaBlend
ensemble à True
- avec une méthode
CreateParams()
surchargée pour ajouter le drapeau de style étendu WS_EX_TRANSPARENT
Je peux passer tous les clics de souris aux fenêtres sous-jacentes tout en étant capable de dessiner dans une fenêtre au-dessus d'eux. Cela devrait vous aider à démarrer.
Je pensais à ce sujet mais le problème est que Windows ne me rendra pas le contrôle derrière la souris alors. Ou le sera-t-il? Venez y penser, si la toile est transparente, cela pourrait faire l'affaire. Je vais essayer ça. Merci pour la réponse très détaillée et utile. – jonjbar
Eh bien, la sélection ne fonctionne pas et la fenêtre de niveau supérieur est toujours celle derrière la souris. – jonjbar
Désolé, je ne comprends pas. Commencez-vous la sélection en cliquant avec la souris sur le bureau et commencez à la faire glisser? Si oui, comment l'attraper avec un hook de souris global (bas niveau)? Ou créez-vous la superposition (dans un mode de sélection spécial) et démarrez la sélection en cliquant dessus? Peut-être pourriez-vous développer votre question avec plus de détails. – mghie