Question

Mon problème est que j'ai créé un « étendu » contrôle RichTextBox qui utilise l'API native pour ajouter de nombreuses fonctionnalités RichEdit qui manquent de la commande standard (ex: la modification d'une seule propriété de police sur une sélection w / o changer l'autre les propriétés de police, retour à la ligne à une imprimante [comme WordPad], etc.). Dans le cadre du contrôle j'expose une PrintDocument qui est utilisé pour imprimer le contenu formaté de la RichTextBox. Lorsque wordwrap est réglé sur « Retour à la ligne imprimante » Je sendMessage le message EM_SETTARGETDEVICE à la RichTextBox et l'amener à envelopper à la longueur appropriée.

Tout cela fonctionne très bien quand quelque chose (utilisateur / code) modifie la propriété WordWrap de mon contrôle. Toutefois, si le PrintDocument est modifié après que je n'ai aucun moyen de le savoir. Ainsi, même si l'utilisateur peut avoir changé les marges sur la PrintDocument mon RichTextBoxEx ne renvoie pas le EM_SETTARGETDEVICE pour la nouvelle largeur jusqu'à ce que la propriété WordWrap est modifiée.

Je vois quelques options pour surmonter cela, mais je ne suis pas un grand fan de l'un d'eux. Voici ce que j'ai:

  1. Ajoutez une méthode UpdatePrintDocument () ou similaire qui aurait besoin d'être appelé après quelque chose d'extérieur de la commande (par exemple: un PageSetupDialog sur le formulaire parent) mis à jour les paramètres du PrintDocument. Inconvénients: Je vais distribuer les contrôle, donc je voudrais le rendre aussi convivial que possible. Alors que je me souviens d'appeler la méthode à tout moment je mettre à jour avec succès les paramètres de PrintDocument quelqu'un d'autre peut-être pas. Pro: Il est simple à mettre en œuvre

  2. .
  3. Créer une nouvelle classe PrintDocumentEx que les bases de PrintDocument et met en œuvre les nécessaires événements « CHAINE ». Inconvénients: Peut-être pas assez, peut-être besoin de créer PrintSettingsEx, PageSettingsEx, etc .. Pro:. Mettre en œuvre une fois et personne n'a à se soucier de nouveau

Je pense vraiment # 2 est l'option que je vais devoir aller avec, mais ce n'est pas très réutilisable pour l'instance suivante j'ai besoin des fonctionnalités similaire. Je suppose que ce que je suis à la recherche est un moyen de joindre un « événement PropertyChanged générique » à une propriété des classes existantes car cela serait applicable dans des situations futures. Soucieux de voir ce que les gars que vous avez pour moi: -)

Était-ce utile?

La solution 2

Pour faire suite que mon PrintDocumentEx (et associé) classés ne fonctionnent pas. En regardant dans les contrôles PrintDialog et connexes, il est parce qu'ils utilisent des méthodes natives pour mettre à jour le acctually PrintDocument. Ainsi, les événements que j'attaché aux propriétés dans mes cours « Ex » n'a jamais tiré parce que le accesseur set n'a jamais été invoqué.

Autres conseils

Si je comprends bien votre question, les informations dont vous avez besoin est envoyé lorsque la propriété WordWrap est modifiée.

Quand d'autres choses ont changé, aucun événement met à jour le document d'impression. La prochaine fois que la propriété WordWrap change toutes les informations sont envoyées.

La façon de hack pour résoudre ce problème est alors de changer la propriété WordWrap, chaque fois que vous modifiez une propriété que vous souhaitez envoyer au document d'impression. Changez-le à une valeur temporaire, puis changer à nouveau.

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