IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

Objet printer et api stretchblt()


Sujet :

VB 6 et antérieur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 002
    Par défaut Objet printer et api stretchblt()
    Bonjour,

    je suis en train de terminer la version III de CiDess.

    je programme en VB5 SP3

    J'ai rencontré pas mal de déboirres pour dessiner et imprimer du texte incliné et à l'échelle, mais j'y suis arrivé. Par contre je n'ai pas réussi à "retourner" du texte.

    j'ai donc recours à l'API StretchBlt. le code suivant ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Declare Function GetLastError Lib "kernel32" () As Long
    Const SRCCOPY = &HCC0020
    Private Declare Function StretchBlt Lib "gdi32" (ByVal HDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
     
        Dim ret As Long
        Dim PL As Long
        Dim PT As Long
        Dim PW As Long
        Dim PH As Long
        Dim HDC As Long
    ...
    ici j'imprime les textes qui doivent êtres retournés; en prenant soin bien sur de calculer leur coordonnées et angle pour qu'une fois retournés il soient à l'envers (c'est à dire lisibles par transparence de l'autre côté de la feuille) mais au bon endroit
    ...
        Printer.ScaleMode = 3
        PL = Printer.ScaleLeft
        PT = Printer.ScaleTop
        PW = Printer.ScaleWidth
        PH = Printer.ScaleHeight
        HDC = Printer.HDC
        ret = StretchBlt(HDC, PL, PT, PW, PH, HDC, PL, PT + PH, PW, -PH, SRCCOPY)
        MsgBox Format(Ret) + vbCrLf + Format(GetLastError())
        Printer.ScaleMode = 5
    ...
    ici j'imprime le reste
    ...
    Le code s'execute correctement sans erreur, mais la fonction stretchblt n'a aucun effet.

    La msgbox affiche '0' '0' pour les valeurs de ret et celle renvoyée par getlasterror

    Avez vous une piste ?

    Merci

  2. #2
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonjour,

    - Je ne cesserais de conseiller de s'entraîner avec une PictureBox avant de passer à l'objet Printer, le principe étant absolument le même.
    - tu trouves normal, toi, de définir différentes échelles d'un même objet ? (essaye avec une picturebox et tu comprendras ce que cela signifie ...)

    en résumé et pour me répéter : entraîne-toi avec une Picturebox ...

  3. #3
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 132
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        ret = StretchBlt(HDC, PL, PT, PW, PH, HDC, PL, PT + PH, PW, -PH, SRCCOPY)
    Il semblerai que tu donnes le même descripteur destination que source.
    Regardes le lien dans ma signature "dans ma page de contribution sur DVP" , la ligne Manipulations autour d'une image (20 APIs utilisées) devrait t'interesser car ton code ne fait qu'un retournement de 180°.

    Un petit bout de code pour t'aider, car comme il te l'a ete dit (Salut ucfoutu), avec des PictureBox tu peux verifier tout de suite, quand c'est bon, tu remplaces le nom du picture destination part l'objet Printer.
    1 CommandButton, 2 PictureBox, charger une image dans Picture1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Option Explicit
    Const SRCCOPY = &HCC0020
    Private Declare Function StretchBlt Lib "gdi32" (ByVal HDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
     
        Dim ret As Long
        Dim PL As Long
        Dim PT As Long
        Dim PW As Long
        Dim PH As Long
        Dim HDCSour As Long
        Dim HDCDest As Long
     
    Private Sub Form_Load()
    Picture1.ScaleMode = vbPixels
    Picture1.AutoRedraw = True
    Picture2.ScaleMode = vbPixels
    Picture2.AutoRedraw = True
    End Sub
     
    Private Sub Command1_Click()
        PL = Picture1.ScaleLeft
        PT = Picture1.ScaleTop
        PW = Picture1.ScaleWidth
        PH = Picture1.ScaleHeight
        HDCSour = Picture1.HDC
        HDCDest = Picture2.HDC
        StretchBlt HDCDest, PL, PT, PW, PH, HDCSour, PL, PT + PH, PW, -PH, SRCCOPY
        Picture2.ScaleMode = 5
    Picture2.Refresh
    End Sub
    Citation Envoyé par ucfoutu
    - tu trouves normal, toi, de définir différentes échelles d'un même objet ?
    Pour information je sais que tu parles du ScaleMode, mais il m'arrive aussi (justement pour l'impression) de passer du Pixels en Millimètre, cela ne posant pas de problème, et mon code (pour les calculs de positionnements en particulier) est plus lisible lors d'une ré intervention sur le source.
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  4. #4
    Membre chevronné Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 002
    Par défaut
    Bonjour,

    merci pour vos réponses

    - la source et la destination sont identiques, c'est normal, je veux retourner l'image après l'avoir dessinée dans printer (il ne s'agit pas de copier une image d'un contrôle vers un autre)

    - le changement de scalemode aussi est normal; mon programme travaille en pouce pour l'impression; je me place en mode pixel uniquement pour exécuter l'API

    - ce code fonctionne avec une picture box (je l'utilise ailleurs dans le programme), il permet de retourner en miroir l'image; ce code fonctionnait également très bien il y a 11 ans quand j'ai commencé à programmer sous visual basic 3.0; à l'époque j'avais fais un petit logiciel de dessin (paint amélioré + composants électroniques) et j'avais programmé deux fonctions : miroir horizontal et miroir vertical

    - avant de poster ici j'ai passé de nombreuses heures pour faire des essais et des recherches; des codes sources pour envoyer le contenu d'un picture box vers un autre ou vers l'imprimante j'en ai trouvé à la pelle, mais ce n'est pas ce que je veux;

    - beaucoup de monde m'a dit de laisser tomber et de simplement faire un "paintpicture" de l'écran vers l'imprimante mais :
    * faire une impression bitmap pour un logiciel de dessin vectoriel (circuit imprimés) ou qui plus est la qualité d'impression est primordiale c'est comment dire... dégueulasse
    * j'ai déjà réussi à surmonter pas mal de pb (notamment en ce qui concerne les textes, voir le code source que j'ai proposé ici : http://www.developpez.net/forums/sho...d.php?t=470817) il serai dommage et stupide de laisser tomber maintenant.

    Le plus étrange est la non exécution de la fonction stretchblt sans erreur !

    On va bien finir par trouver d'où ça vient, il s'agit probablement d'un autre truc à la con, comme par exemple le fait que mes API qui impriment du texte incliné ne fonctionne pas si je ne fais pas au début de ma sub d'impression un printer.print "" !

    NB : je rappelle que je suis encore sous VB5 Le programme freeware en question a été commencé sous VB5 en 2001, terminé en 2004 (cette période inclus les premières réflexions, la programmation, la recherche et saisie de tous les modèles de boitiers de composants existants, les tests). Il est très stable et fonctionne correctement aussi bien sur les PC récents que sous des machines anciennes (genre 486 sous win 95). Cela peut vous faire rire mais dans les ateliers d'électronique il reste bcp de ces vieux ordinateurs; ils servent à piloter divers appareils et machines dont la fréquence de renouvellement n'est pas celle du matériel informatique. (on balance pas à la poubelle une fraiseuse à commande numérique parce que le soft de commande ne fonctionne plus sous XP).
    Aujourd'hui je le mets à jour; je n'ai aucune raison de tout reprendre sous VB6 ou VBxxx. Autre raison : même si je le voulais je manquerais de temps pour le faire

    A+

  5. #5
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 132
    Par défaut
    - avant de poster ici j'ai passé de nombreuses heures pour faire des essais et des recherches; des codes sources pour envoyer le contenu d'un picture box vers un autre ou vers l'imprimante j'en ai trouvé à la pelle, mais ce n'est pas ce que je veux
    Je ne doute plus de tes compétances, mais de fois on vois des zozos qui nous font réagire d'une façon BASIC


    * faire une impression bitmap pour un logiciel de dessin vectoriel (circuit imprimés) .....
    Sa je veux bien te croire, je ne savais pas que l'on pouvait utiliser cette API pour un dessin vectoriel , je supose que tu passes par une image temporaire Bimap, non?
    En tous cas je vais essayer demain au pro, j'espere avoir appris encor quelque chose.
    A+
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  6. #6
    Membre chevronné Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 002
    Par défaut
    Citation Envoyé par ProgElecT Voir le message
    Je ne doute plus de tes compétances, mais de fois on vois des zozos qui nous font réagire d'une façon BASIC


    Sa je veux bien te croire, je ne savais pas que l'on pouvait utiliser cette API pour un dessin vectoriel , je supose que tu passes par une image temporaire Bimap, non?
    En tous cas je vais essayer demain au pro, j'espere avoir appris encor quelque chose.
    A+
    Salut,

    Je me suis mal exprimé. Mon logiciel est vectoriel, c'est à dire :
    - qu'il enregistre un dessin comme une liste d'objets eux même composés de lignes, de cercles, ... définits par leurs coordonnées
    - pour chaque affichage à l'écran tout est tracé
    - pour l'impression on envoie pas un bitmap ou une copie de picture box avec paintpicture mais on envoie des commandes line, circle, ect...

    Un programme bitmap (comme celui que j'avais fais en VB3) :
    - ne travaille avec des élements (lignes, cercles) que une seule et unique fois, au moment où l'utilisateur les dessine
    - pour tout le reste (sauvegarde, impression), le dessin est une manipulé comme une simple image bmp

    Mais pourquoi donc j'utilise stretchblt ?

    Parce que ni Visual Basic ni les API ne permettent d'imprimer du texte à l'envers (à l'envers, c'est comme le mot "ambulance" ou "police" imprimé à l'envers sur le capot des véhicules pour qu'on puisse le lire à l'endroit dans le rétroviseur).

    Donc pour imprimer des textes à l'envers je suis obligé de "ruser" et de retravailler avec les fonctions bitmap au moment de l'affichage :
    - j'imprime (ou je dessine) les textes à inverser normalement, mais en faisant une symétrie Y de leurs coordonnées
    - ensuite j'utilise stretchblt pour faire un miroir selon l'axe Y sur l'objet printer (ou imagebox); du coup, mes textes se retrouvent à l'envers, mais au bon endroit car le miroir Y annule la symétrie Y que j'avais appliqué précédemment.
    - enfin je continue à dessiner le reste des objets par dessus
    En fait il n'y a pas d'image temporaire, ou plutôt, l'image temporaire est le contrôle de destination.

    Je n'ai pu publier le source complet car pour rendre les objets indépendants, la fonction d'impression est découpée en cascade dans de nombreuses classes :
    - le programme appelle une fonction générale de dessin
    - la fonction appelle la fonction d'impression idoine de chaque objet du circuit
    - la fonction de chaque objet calcule les coordonnées de l'objet et file le bébé aux fonction de chaque élément graphique composant l'objet
    -...
    Les mises à jours sont plus faciles et le code plus propre mais dès qu'il faut parler du code sur un forum

    C'est pour ça que pour le problème des textes j'avais refais un petit programme indépendant.

    Lors de mes recherches sur Internet j'ai pu voir pas mal de demandes similaires à la mienne; une fois ce pb résolu ça va intéresser pas mal de monde, je complèterais la soluce précédant et tâcherais de faire une doc en anglais.

    A bientôt, bonne nuit - ya travail demain quoique moi j'ai réunion -> possibilité de dormir au fonds

Discussions similaires

  1. apercu avant impression avec l'objet printer
    Par brchokri dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 10/05/2007, 13h56
  2. [VB6] objet printer changer d'imprimante
    Par totoche dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 06/12/2006, 10h43
  3. Imprimer avec l'objet printer
    Par yaobi dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 27/11/2006, 12h32
  4. pb avec l'objet Printer
    Par reeda dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 27/09/2006, 15h43
  5. [VB6]Colorier une zone (carrée) avec l'objet printer.
    Par méphistopheles dans le forum VB 6 et antérieur
    Réponses: 14
    Dernier message: 24/05/2006, 21h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo