2009-04-23 4 views
0

Je travaille sur une fonction de prévisualisation avant impression pour afficher une vue d'ensemble d'une diapositive avec des zones rectangulaires de points d'échantillon. Les lames mesurent typiquement 25 x 75 mm et les échantillons ponctuels ont typiquement un diamètre de 0,1 mm. Il y a généralement un espace de 2 mm autour du périmètre de la diapositive où aucun point n'est imprimé.Implémentation des commandes de zoom dans le MFC

La distance entre les points (hauteur) est précise à 0,01 mm. Des pas de 0,20 et 0,29 mm par exemple auraient besoin de se différencier dans les pixels. Représentant les taches elles-mêmes, 100% de précision n'est probablement pas crucial à ce stade tant que les taches sont visibles et ne se chevauchent pas. J'apprécierais des conseils sur les techniques à utiliser afin de créer une représentation bitmap de la ou des diapositives et de voir la disposition des diapositives en utilisant des niveaux de grossissement arbitraires.

Cela ne doit pas être sophistiqué - une représentation 1: 1 plus un grossissement plus petit et plus grand pour commencer. Je ne peux probablement pas trop faire de zoom arrière car les spots deviendront trop petits pour être représentés.

Pour des agrandissements plus importants, je vais probablement avoir besoin de savoir comment implémenter les commandes de défilement horizontales/verticales, mais j'aborderai cela plus tard. Je voudrais connaître toutes les techniques de programmation et de mise à l'échelle dont je devrais être conscient afin de mettre en œuvre correctement un zoom. J'ai récemment joué avec la fonction StretchBlt pour modifier la taille des images et cela semble correct, mais toute autre information pertinente serait utile.

Cheers.

Répondre

1

Commençons par le début:

  • pourquoi ne vous utilisez :: AFXPrintPreview() et le reste des installations de l'aperçu avant impression de MFC?

  • Les «diapositives» et les «spots» sont spécifiques à votre secteur d'activité, je pense - sont-ils pertinents à la question ou sont-ils uniquement à des fins d'illustration? StretchBlt() ne vous fera pas beaucoup de bien car il ne vous permettra que de faire un zoom au niveau des pixels, ce dont vous avez besoin est de dessiner une certaine partie de votre contrôle avec un niveau de précision plus élevé. Même si vous n'utilisez pas l'aperçu avant impression MFC, jetez un coup d'œil pour voir comment cela peut être fait.

  • Le contrôle Windows possède toutes les fonctionnalités dont vous avez besoin pour le défilement et la mise à l'échelle. Ils se trouvent dans le contexte de périphérique: SetWindowExt(), SetViewportExt(), SetViewportOrg() etc. Regardez sous 'Fonctions de coordonnées' de la page 'Membres CDC' de MSDN. Cela étant dit, j'ai une fois mis en œuvre le zoom et le défilement «manuellement», en gardant une trace de la position de la barre de défilement, zoomer les commandes de mon contrôle, etc .. C'était douloureux et j'aurais dû utiliser Windows. Ils ne sont pas faciles à utiliser non plus, bien que, pourquoi je pensais que je pourrais le faire mieux moi-même en premier lieu - s'avère que j'avais tort :)

  • Enfin, bien que je ne peux pas dire avec certitude de votre question si vous êtes vraiment dans ce bateau, ne pensez pas en termes de distances physiques (millimètres, etc). La première chose que vous voulez obtenir est de dessiner la forme sur l'écran, avec les bonnes proportions entre les éléments. Ensuite, vous voulez faire un zoom avant/arrière. Enfin, c'est seulement lorsque vous arrivez à la partie impression que des mesures physiques entrent en jeu.La seule chose que vous devez comprendre là-bas (légèrement simplifier ici) est «quel est le rapport de zoom correct dont j'ai besoin pour obtenir la sortie requise». C'est un peu compliqué mais n'a pas grand chose à voir avec ce qui semble être la première partie de votre question (comment dessiner votre composant à l'écran).

Si vous rencontrez des problèmes, n'hésitez pas à poser des questions plus spécifiques. J'ai un aperçu avant impression et un code d'impression ici comme un exemple des parties «génériques» du processus d'impression, bien que les spécificités soient évidemment différentes pour chaque application.

Questions connexes