Win32: Comment dessiner un contrôle d'édition personnalisé?
j'ai besoin pour mettre en œuvre la fonctionnalité de EM_SETCUEBANNERoù un texte soupçon apparaît à l'intérieur d'un contrôle d'Édition:
Le hic, c'est que je ne peux pas utiliser la version 6 de la Commune de Contrôles, qui est ce qui est nécessaire pour obtenir le Microsoft fourni par la mise en œuvre d'un repère bannière.
j'ai regardé, en changeant simplement le texte de l'édition de contrôle, et le format de police à
Dark Gray Italic Text
mais qu'il va jeter Changement événements (emballage du composant fourni par la hausse de la bibliothèque de composants) que je ne peux pas trouver un moyen d'éviter.
J'ai donc été contraire à la coutume de dessiner le texte, le dessin de la queue de la Bannière de texte lorsque le contrôle est flou et vide, et de compter sur la peinture par défaut contraire.
Le contrôle d'Édition n'est pas bien exposer un dessin personnalisé mécanisme, comme ListView, TreeView et d'autres fournissent des.
D'autres personnes ont regardé dedansmais il semble être une tâche quasi impossible:
De la façon dont les choses sont à la recherche, je vais
avoir à gérer les éléments suivants
messages:
- WM_ERASEBKGND, WM_PAINT (pour des raisons évidentes)
- WM_SETFOCUS, WM_KILLFOCUS (pour éviter les
la barre blanche à partir de l'affichage --
décrit ci-dessus)- WM_CHAR (à traiter et mettre à jour les
le texte dans le contrôle)Et j'ai aussi besoin de trouver un moyen de
afficher le signe dans le contrôle, la
puisque je n'ai pas trouvé un moyen pour permettre à
Windows de le faire pour moi sans
la peinture de la barre blanche je l'ai mentionné.Cela va être amusant. :rolleyes:
Étant donné que le contrôle d'Édition Windows n'a jamais été destiné à être personnalisés: personne ne sait comment dessiner personnalisé d'un contrôle d'Édition Windows?
Note: je vais aussi accepter des réponses qui permettent de résoudre mon problème, plutôt que de répondre à ma question. Mais quelqu'un d'autre qui voudrait la coutume de dessiner un contrôle d'Édition, de venir à travers cette question, il serait probablement une réponse.
source d'informationauteur Ian Boyd
Vous devez vous connecter pour publier un commentaire.
Personnalisé dessin d'un contrôle d'Édition est essentiellement impossible. Il y a quelques cas particuliers ont été vous font si peu que peut sortir avec elle, mais vous risquez de casser mal dans la prochaine version de windows (ou quand quelqu'un exécute votre application sur une version plus ancienne, ou via les services terminal server, etc).
Prendre le contrôle WM_PAINT et WM_ERASEBKGROUND ne sont pas assez bon, parce que le contrôle sera parfois de la peinture sur les autres messages.
Vous êtes mieux l'écrire votre propre contrôle d'édition. Je sais que c'est une énorme quantité de travail, mais dans le long terme, il sera moins de travail que d'essayer de pirater votre chemin en prenant tous les contrôles d'Édition' code de dessin.
Je me souviens de retour dans le bon vieux temps où tout le monde à la sous-classe le bouton de contrôle pour ajouter de la couleur et des graphiques, etc. La chose est, un jour je me suis assis vers le bas et juste écrit mon propre bouton de la fenêtre de la classe. et il a MOINS de CODE que ce que nous avions dans notre arborescence des sources de la sous-classe et la coutume de dessiner le bouton Windows.
Créer une classe de fenêtre de votre propre qui ressemble à vide et le contrôle d'édition, qui attire le repère de texte et montre un signe et a le focus. Créer le contrôle d'édition aussi, mais en position derrière votre fenêtre. (ou le laisser caché)
Puis, quand vous obtenez le premier message WM_CHAR (ou WM_KEYDOWN?). Vous mettez votre fenêtre derrière le modifier conrol, donner le focus à la fenêtre de modification, et de passer le message WM_CHAR. À partir de là, le contrôle d'édition va prendre le dessus.
Vous pouvez écouter EN_CHANGE les notifications du contrôle d'édition si vous avez besoin de revenir à l'affichage de votre repère de texte lors de l'édition se vide. Mais je pense qu'il serait bien de revenir au repère de texte uniquement lorsque la modification perd le focus ET est vide.
Sous-classer le contrôle d'ÉDITION a bien fonctionné pour moi - nécessaire à l'affichage de certaines informations de mise en forme à l'utilisateur lors de la modification des attributs d'un objet (et certains attributs pourrait être sur plusieurs lignes). La chose importante, comme Adrian a dit dans sa réponse trop, c'est d'appeler le contrôle d'ÉDITION de la procédure avant votre propre dessin. En l'appelant par la suite ou l'émission de votre propre BeginPaint/EndPaint (avec retour à 0 ou DefWindowProc) a causé des problèmes pour moi, à partir du texte affiche pas du tout, elle affiche uniquement lors du redimensionnement, mais pas après le montage, pour quitter l'écran de la litière des restes de caret. Avec ça, je n'ai pas eu de problèmes, indépendamment de la modification du contrôle d'autres repeindre fois.
Certains d'installation:
Le rappel:
De la rédaction de votre propre contrôle d'ÉDITION (qui en fait, j'ai fait plus d'une fois, partiel des degrés d'exhaustivité par rapport à la bâtie-en-un) n'est pas beaucoup de travail si vous ne le strict minimum (peut-être uniquement en anglais avec base en signe de soutien), mais c'est BEAUCOUP de travail pour corriger si vous souhaitez signe de navigation sur des scripts complexes avec la variable de la taille des clusters, la sélection sur les gammes, les IME à l'appui, les menus contextuels avec la fonction copier et coller, haute modes de contraste, et de l'accessibilité des fonctionnalités telles que du texte à la parole. Donc, contrairement à de nombreux autres réponses, je recommande pas la mise en œuvre de votre propre contrôle d'ÉDITION simple de repère de texte de bannière.
La sous-classe le contrôle d'édition. Poignée
WM_PAINT
en appelant d'abord la procédure de fenêtre d'origine et puis, si c'est vide et pas au point, tracer le repère de texte. Passer tous les autres message à la procédure de fenêtre d'origine.Ce que j'ai fait--il fonctionne. Le problème de la CodeGuru personne a ne semble pas s'appliquer à votre situation. Je crois qu'il essaie de faire plus pour l'apparence. Pour la performance, il semble que le contrôle d'édition est en train de faire quelques mises à jour à l'extérieur de
WM_PAINT
de traitement (probablement pour la performance). Qui va la rendre presque impossible de prendre le contrôle complet de l'apparence. Mais vous POUVEZ tirer le signal d'invite.Si vous souhaitez gérer WM_PAINT par vous-même sans transférer le message à l'origine de windowproc de votre super-classe, vous ne devez pas oublier d'appeler DefWindowProc. De sorte que le curseur sera établi.
Pour éviter que la barre blanche, vous devez supprimer la classe brosse avec SetClassLongPtr.
Et d'une certaine façon de garder votre CC de la région de coupure de clip Edit controt ExtTextOut sorties.
La barre blanche peut être le résultat d'OPAQUE option passée à ExtTextOut par contrôle d'Édition.
Conclusion: Écrire votre propre contrôle. Aucune douleur, aucun gain.