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

Turbo Pascal Discussion :

[BPW] Impression d'une image BMP


Sujet :

Turbo Pascal

  1. #1
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut [BPW] Impression d'une image BMP
    Bonjour à tous et toutes !

    Mon programme doit imprimer des documents composés d'une image de fond (bitmap) sur laquelle j'écris du texte à certains endroits.
    Le problème est que seul le texte est imprimé...

    Pour résumer ce que je fais :
    - Je charge l'image dans mes ressources (LoadBitmap);
    - Je crée un contexte de périphérique compatible avec l'imprimante (CreateCompatibleDC);
    - J'effectue les réglages nécessaires (système de mesure, etc);
    - Je crée un contexte de périphérique virtuel en mémoire (CreateDC);
    - Je sélectionne la bitmap dans ce contexte (SelectObject);
    - J'effectue une copie de l'image depuis le contexte virtuel vers le contexte d'impression (BitBlt);
    - J'écris mon texte aux endroits voulus (TextOut);
    - J'imprime.

    Quelqu'un aurait-il une idée de ce qui ne va pas dans ce qui précède ?

    Merci à ceux (ou celles) qui voudront bien se pencher sur la question !
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  2. #2
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Il est fort probable que l'erreur se situe à l'étape 6 (copie).

    néanmoins, je n'y connais rien, et tu ferais mieux de poser ta question sur le forum Dév Windows, car c'est loin d'être spécifique au Pascal

    A+
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  3. #3
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Merci pour ta réponse !

    Je vais attendre l'avis de Wormful_Sickfoot (à moins qu'il soit en vacances 8) ) avant de re-poster ma question sur l'autre forum.

    A+
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  4. #4
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    C'est trop d'honneur que tu me fais Alcatîz !
    Non, je suis pas en vacances, mais mon disque dur a grillé alors je serais pas souvent là
    Selon MSDN, il semblerait que le problème vienne plutôt de SelectObject. D'après ce que j'ai compris, SelectObject associe un bitmap au DC, mais il faut que le format du bitmap soit compatible avec le format du DC ( monochrome, couleurs 16 bits, 32 bits, etc... ). Or il serait possible que le Bitmap que tu sélectionnes ne soit pas compatible, ce qui pourrait l'empêcher d'être associé au DC lors de SelectObject...
    Tu as en parti contourné le problème en créant un deuxième DC puis en chargeant le Bitmap dans ce DC mais je crains que ca ne soit suffisant, car la fonction LoadBitmap "crée" un Bitmap destiné à l'affichage ( c'est-à-dire compatible avec le DC de l'écran ) mais pas forcément compatible avec n'importe quel DC ( et peut-être pas forcément compatible avec celui que tu crées avec CreateDC ).
    Pour éviter ça, Billou nous dit d'utiliser la fonction LoadImage ( encore elle ) qui permet de charger des bitmaps compatibles à un type de DC particulier ( écran, imprimante, ...). Pour résumer, si ton Bitmap ne doit être qu'imprimé, il vaudra mieux utiliser LoadImage, mais si il doit être à la fois affiché et imprimé, alors il faudra le charger deux fois car le DC de l'écran et le DC de l'imprimante sont incompatibles !!
    J'ai cru avoir compris que tu tenais à utiliser LoadBitmap plutôt que LoadImage, et dans ce cas-ci je ne vois pas de solution immédiatement désolé ! Mais je continuerais à chercher
    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  5. #5
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Regarde aussi du côté de CreateCompatibleBitmap. Qui sait, tu vas peut-être finir par trouver ton bonheur !

    A+
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  6. #6
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Rââââh comme tout est compliquéééé !
    Tiens, je suis surpris que personne ne m'ait encore proposé de passer à Delphi !

    Mais non, je vais m'accrocher et continuer à chercher . Et puis, je ne vais pas abandonner près du but (j'en suis à 14.000 lignes de code et je commence à voir la fin du tunnel).

    Je me méfie un peu des informations trouvées sur MSDN, par exemple, car ce qui s'applique à l'API 32 bits n'est pas toujours vrai pour l'API 16 bits.

    Merci mille fois pour vos recherches et... profitez bien du soleil !
    A+
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  7. #7
    Membre émérite

    Homme Profil pro
    Urbaniste
    Inscrit en
    Mars 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mars 2002
    Messages : 255
    Points : 2 717
    Points
    2 717
    Par défaut
    Citation Envoyé par Alcatîz
    Tiens, je suis surpris que personne ne m'ait encore proposé de passer à Delphi ! :wink:
    T'as raison : passe à Delphi :D :D :D

    La VCL est une surcouche à l'immonde API Win32 qui simplifie ENORMEMENT la vie du programmeur. Je dis ça parce que je DOIS programmer avec Visual C++ et les MFC ... Hé ben, c'est de la merde !

    Exemple : pour les boutons "radios" (sélection entre plusieurs choix), tu dois dire que si le radio 1 est sélectionné, les autres ne le sont pas (un seul choix possible). En gros : il faut TOUT faire à la main ... Passons ce petit paragraphe anti-gro$oft.
    ---
    Question bête : arrives-tu à imprimer une image seule ? Si non, demande sur le forum Delphi un bout de code !

    @+ Haypo

  8. #8
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Si LoadImage n'est pas compatible 16 bits, et ben je crois que tu auras beaucoup de difficultés pour faire ce que tu veux... Le problème semble venir d'une incompatibilité de Device Context ( écran <> imprimante ), mais je ne vois pas comment résoudre ce problème sans passer par LoadImage !! Désolé !
    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  9. #9
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Salut !

    Je crois que j'approche de la solution : lorsque j'ai obtenu une handle pour ma bitmap, j'utilise la fonction StretchDIBits pour transférer le contenu de la bitmap directement sur le contexte de périphérique d'impression. La fonction GetObject retourne les informations nécessaires sur la bitmap.

    J'avance... tout doucement...
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  10. #10
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    J'ai réussi !

    J'ai sué sang et eau, mais ça y est : mon image s'imprime.

    Le secret était d'utiliser la fonction SetDIBitsToDevice, qui transfère le contenu de la bitmap directement dans le contexte d'impression, ce qui est complètement différent du travail avec un contexte d'affichage.

    Par contre, je ne suis jamais parvenu à utiliser une image stockée dans les ressources du programme : il me faut charger l'image directement dans son fichier BMP. La cause est assez bête : je ne parviens pas à aller rechercher la table des couleurs dans la ressource. Peut-être quelqu'un sait-il comment faire ?

    Quoi qu'il en soit, voici quelques extraits de code qui pourraient être utiles à d'autres.

    Pour la bonne compréhension, l'image à imprimer est un document administratif vierge appelé "F119" stocké dans le fichier F119.BMP (image monochrome non compressée). Mais le code qui suit convient à tout type de bitmaps non compressées (2, 4, 16, 256 couleurs et couleurs 24 bits).

    1. Déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Type tF119 = Record
                   EnTete : pBitmapInfo;   (* STRUCTURE D'INFORMATIONS *)
                   TailleEnTete : Word;    (* TAILLE DE LA STRUCTURE *)
                   Handle : tHandle;       (* HANDLE BLOC MEMOIRE CONTENANT BITMAP *)
                 end;
    2. Routines de base de lecture de fichier
    (supporte les noms longs de fichiers)
    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
    Function OUVERTURE_FICHIER (NomFichier : pChar; Mode : Integer; var hFichier : Integer) : Boolean;
    (* OUVERTURE DE FICHIER *)
    Begin
      hFichier:=_lOpen(NomFichier,Mode);
      OUVERTURE_FICHIER:=(hFichier <> -1);
    End;
     
    Function LECTURE_FICHIER (hFichier : Integer; Buffer : pChar; Taille : Integer) : Word;
    (* LECTURE DE FICHIER *)
    Begin
      LECTURE_FICHIER:=_lRead(hFichier,Buffer,Taille);
    End;
     
    Function DEPLACEMENT_POSITION_FICHIER (hFichier : Integer; Position : LongInt) : Boolean;
    (* DEPLACE LA POSITION COURANTE DANS UN FICHIER *)
    Begin
      DEPLACEMENT_POSITION_FICHIER:=(_llSeek(hFichier,Position,0) = Position);
    End;
     
    Function FERMETURE_FICHIER (hFichier : Integer) : Boolean;
    (* FERMETURE D'UN FICHIER *)
    Begin
      FERMETURE_FICHIER:=(_lClose(hFichier) <> -1);
    End;
     
    Function EXISTENCE_FICHIER (NomFichier : pChar) : Boolean;
    (* INDIQUE SI UN FICHIER EXISTE *)
    Var Buffer : tOFStruct;   (* DONNEES RETOURNEES PAR LA FONCTION OPENFILE *)
    Begin
      EXISTENCE_FICHIER:=(OpenFile(NomFichier,Buffer,of_Exist) <> -1);
    End;

    3. Lecture du fichier BMP
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    Function CHARGEMENT_IMAGE_F119 (hWindow : hWnd) : Boolean;
    (* CHARGEMENT DE L'IMAGE DU DOCUMENT F-119 DANS LE FICHIER F119.bmp *)
    Var AncienCurseur : hCursor;          (* ANCIEN CURSEUR *)
        HandleFichier : Integer;          (* HANDLE DU FICHIER *)
        NbBytesLus : Word;                (* NOMBRE DE BYTES LUS DANS LE FICHIER LORS DE LA DERNIERE OPERATION *)
        OkOuverture : Boolean;            (* RESULTAT DE L'OUVERTURE DU FICHIER *)
        OkLecture : Boolean;              (* RESULTAT DE LA LECTURE DU FICHIER *)
        OkTypeFichier : Boolean;          (* INDIQUE S'IL S'AGIT BIEN D'UN FICHIER BITMAP *)
        OkAllocation : Boolean;           (* RESULTAT DES ALLOCATIONS DYNAMIQUES *)
        FinFichier : Boolean;             (* INDIQUE QUE LA FIN DE FICHIER EST ATTEINTE *)
        OkFermeture : Boolean;            (* RESULTAT DE LA FERMETURE DU FICHIER *)
        NbBitsParPixel : Word;            (* NOMBRE DE BITS PAR PIXEL *)
        NbCouleurs : Word;                (* NOMBRE D'ENTREES DANS LA TABLE DE COULEURS *)
        AdresseBitmap : Pointer;          (* ADRESSE DU BLOC DE MEMOIRE CONTENANT LA BITMAP *)
        AdresseTemp : Pointer;            (* ADRESSE TEMPORAIRE DANS LE BLOC DE MEMOIRE (CAR > TAILLE D'UN SEGMENT) *)
        DC : hDC;                         (* CONTEXTE DE PERIPHERIQUE TEMPORAIRE *)
        l : LongInt;                      (* SIGNATURE BITMAP *OU* COMPTEUR *)
        t : LongInt;                      (* TAILLE DU BLOC DE BITS A LIRE DANS LE FICHIER *)
        Titre : Array [0..100] of Char;   (* TITRE DE LA BOITE A MESSAGES *)
        Texte : Array [0..255] of Char;   (* TEXTE DE LA BOITE A MESSAGES *)
        OptionMessage : Word;             (* CHOIX DE L'ICONE ET DES BOUTONS DU MESSAGE D'ERREUR *)
    Begin
      AncienCurseur:=SetCursor(LoadCursor(0,idc_Wait));
      OkOuverture:=OUVERTURE_FICHIER(NomFichierF119,of_ReadWrite or of_Share_Exclusive,HandleFichier);
      if OkOuverture
         then
           begin
             OkLecture:=True;
             OkTypeFichier:=True;
             OkAllocation:=True;
             (* TEST S'IL S'AGIT DU BON TYPE DE FICHIER *)
             if DEPLACEMENT_POSITION_FICHIER(HandleFichier,14)
                then
                  begin
                    NbBytesLus:=LECTURE_FICHIER(HandleFichier,pChar(@l),SizeOf(l));
                    if (NbBytesLus = -1) or (NbBytesLus < SizeOf(l))
                       then
                         OkLecture:=False
                       else
                         OkTypeFichier:=(l = $28);
                  end
                else
                  OkLecture:=False;
             (* CHARGEMENT DE L'EN-TETE DE LA BITMAP *)
             if OkLecture and OkTypeFichier
                then   (* LECTURE DU NOMBRE DE BITS PAR PIXEL *)
                  begin
                    if DEPLACEMENT_POSITION_FICHIER(HandleFichier,28)
                       then
                         begin
                           NbBytesLus:=LECTURE_FICHIER(HandleFichier,pChar(@NbBitsParPixel),SizeOf(NbBitsParPixel));
                           if (NbBytesLus = -1) or (NbBytesLus < SizeOf(NbBitsParPixel))
                              then
                                OkLecture:=False;
                         end
                       else
                         OkLecture:=False;
                  end;
             if OkLecture and OkTypeFichier
                then   (* CHARGEMENT DE L'EN-TETE DE LA BITMAP *)
                  begin
                    NbCouleurs:=1 shl NbBitsParPixel;
                    if NbCouleurs > 256
                       then   (* LES BITMAPS 24 BITS N'ONT PAS DE TABLE DE COULEURS *)
                         NbCouleurs:=0;
                    F119.TailleEnTete:=SizeOf(tBitmapInfoHeader) + (NbCouleurs * SizeOf(tRGBQuad));
                    GetMem(F119.EnTete,F119.TailleEnTete);
                    if F119.EnTete <> Nil
                       then
                         begin
                           if DEPLACEMENT_POSITION_FICHIER(HandleFichier,SizeOf(tBitmapFileHeader))
                              then
                                begin
                                  NbBytesLus:=LECTURE_FICHIER(HandleFichier,pChar(F119.EnTete),F119.TailleEnTete);
                                  if (NbBytesLus = -1) or (NbBytesLus < F119.TailleEnTete)
                                     then
                                       OkLecture:=False;
                                end
                              else
                                OkLecture:=False;
                         end
                       else
                         OkAllocation:=False;
                  end;
             (* CHARGEMENT DE LA BITMAP *)
             if OkLecture and OkTypeFichier and OkAllocation
                then
                  if DEPLACEMENT_POSITION_FICHIER(HandleFichier,SizeOf(tBitmapFileHeader) + F119.TailleEnTete)
                     then
                       begin
                         (* CALCUL DE LA TAILLE DU BLOC MEMOIRE A ALLOUER *)
                         if F119.EnTete^.BMIHeader.BISizeImage = 0
                            then
                              F119.EnTete^.BMIHeader.BISizeImage:=F119.EnTete^.BMIHeader.BIWidth *
                                                                  (F119.EnTete^.BMIHeader.BIBitCount + 7) div 8 *
                                                                  Abs(F119.EnTete^.BMIHeader.BIHeight);
                         F119.Handle:=GlobalAlloc(gmem_Moveable or gmem_ZeroInit,F119.EnTete^.BMIHeader.BISizeImage);
                         if F119.Handle <> 0
                            then
                              begin
                                AdresseBitmap:=GlobalLock(F119.Handle);
                                if AdresseBitmap <> Nil
                                   then
                                     begin
                                       AdresseTemp:=AdresseBitmap;
                                       l:=F119.EnTete^.BMIHeader.BISizeImage;
                                       while (l > 0) and OkLecture and not FinFichier do
                                         begin
                                           if l >= $8000
                                              then
                                                t:=$8000
                                              else
                                                t:=l;
                                           NbBytesLus:=LECTURE_FICHIER(HandleFichier,pChar(AdresseTemp),t);
                                           if NbBytesLus = -1
                                              then
                                                OkLecture:=False
                                              else
                                                if NbBytesLus < t
                                                   then
                                                     FinFichier:=True
                                                   else   (* ADAPTATION DE L'ADRESSE DANS LE BLOC MEMOIRE *)
                                                     if Ofs(AdresseTemp^) = $8000
                                                        then
                                                          AdresseTemp:=Ptr(Seg(AdresseTemp^) + 8,0)
                                                        else
                                                          AdresseTemp:=Ptr(Seg(AdresseTemp^),$8000);
                                           Dec(l,t);
                                         end;
                                       GlobalUnlock(F119.Handle);
                                     end
                                   else
                                     OkAllocation:=False;
                              end
                            else
                              OkAllocation:=False;
                       end
                     else
                       OkLecture:=False;
             OkFermeture:=FERMETURE_FICHIER(HandleFichier);
           end;
      (* MESSAGE D'ERREUR EVENTUEL *)
      SetCursor(AncienCurseur);
      if not OkOuverture
         then
           begin
             StrCopy(Texte,'Impossible d''ouvrir le fichier'#10#13);
             StrCat(Texte,NomFichierF119);
           end
         else
           if not OkLecture
              then
                begin
                  StrCopy(Texte,'Erreur de lecture du fichier'#10#13);
                  StrCat(Texte,NomFichierF119);
                end
              else
                if not OkFermeture
                   then
                     begin
                       StrCopy(Texte,'Erreur lors de la fermeture du fichier'#10#13);
                       StrCat(Texte,NomFichierF119);
                     end
                   else
                     if not OkAllocation
                        then
                          StrCopy(Texte,'Mémoire insuffisante pour charger l''image du document')
                        else
                          if not OkTypeFichier
                             then
                               begin
                                 StrCopy(Texte,'Le fichier ');
                                 StrCat(Texte,NomFichierF119);
                                 StrCopy(Titre,' est incompatible avec ce programme.'#10#13);
                                 StrCat(Texte,Titre);
                                 StrCopy(Titre,'Seules les "bitmaps indépendantes du périphérique" sont gérées.'#10#13);
                                 StrCat(Texte,Titre);
                               end;
      if (not OkOuverture) or (not OkLecture) or (not OkFermeture) or (not OkAllocation) or (not OkTypeFichier)
         then
           begin
             StrCopy(Titre,'Chargement de l''image du document F-119');
             if not OkFermeture
                then   (* L'ERREUR DE FERMETURE N'EST PAS FATALE *)
                  OptionMessage:=mb_IconExclamation or mb_Ok
                else
                  OptionMessage:=mb_IconHand or mb_Ok;
             MessageBox(hWindow,Texte,Titre,OptionMessage);
           end;
      (* RESULTAT DE LA FONCTION *)
      CHARGEMENT_IMAGE_F119:=OkOuverture and OkLecture and OkAllocation and OkTypeFichier;
    End;
    4. Impression
    (objet descendant directement de tObject)
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    Constructor tImpression.INIT;
    (* CREATION DU CONTEXTE DE PERIPHERIQUE D'IMPRESSION - INITIALISATION DES CHAMPS *)
    Var c : Array [0..255] of Char;              (* CHAINE "device=" DANS LE FICHIER WIN.INI *)
        NomDriver, NomDevice, NomPort : pChar;   (* NOMS DU DRIVER, DU PERIPHERIQUE ET DU PORT DE SORTIE *)
    Begin
      tObject.INIT;
      (* DETERMINATION DE L'IMPRIMANTE PAR DEFAUT *)
      StrCopy(SectionIni,'Windows');
      StrCopy(EntreeIni,'device');
      GetProfileString(SectionIni,EntreeIni,',,',c,SizeOf(c));
      NomDevice:=c;
      NomDriver:=StrPos(c,','); NomDriver[0]:=#0; Inc(NomDriver);
      NomPort:=StrPos(NomDriver,','); NomPort[0]:=#0; Inc(NomPort);
      (* CREATION DU CONTEXTE DE PERIPHERIQUE *)
      DC:=CreateDC(NomDriver,NomDevice,NomPort,Nil);
      (* CALCUL DU NOMBRE DE PIXELS PAR POUCE *)
      if DC <> 0
         then
           dy:=GetDeviceCaps(DC,LogPixelsY);
    End;
     
    Function tImpression.IMPRIMER_F119 (hWindow : hWnd) : Boolean;
    (* IMPRESSION DU F-119 *)
    Var AncienCurseur : hCursor;          (* ANCIEN CURSEUR *)
        AncienMode : Integer;             (* ANCIENNE UNITE D'ECRAN *)
        AncienAlignement : Word;          (* ANCIEN ALIGNEMENT DU TEXTE *)
        DI : tDocInfo;                    (* INFORMATIONS UTILES A LA FONCTION StartDoc *)
        AdresseBitmap : Pointer;          (* ADRESSE DU CONTENU DE LA BITMAP *)
        Erreur : Integer;                 (* RESULTAT DE FONCTION DE COMMANDE D'IMPRESSION *)
        Titre : Array [0..255] of Char;   (* TITRE DU MESSAGE D'ERREUR *)
        Texte : Array [0..255] of Char;   (* TEXTE DU MESSAGE D'ERREUR *)
        c : Array [0..255] of Char;       (* CHAINE DE TRAVAIL *)
    Begin
      IMPRIMER_F119:=True;
      if DC <> 0
         then
           begin
             if F119.Handle = 0
                then   (* CHARGEMENT DE L'IMAGE DU F-119 *)
                  CHARGEMENT_IMAGE_F119(hWindow);
              if F119.Handle <> 0
                then
                  begin
                    AncienCurseur:=SetCursor(LoadCursor(0,idc_Wait));
                    (* STRUCTURE DE DEMARRAGE DE LA SESSION D'IMPRESSION *)
                    DI.cbSize:=SizeOf(tDocInfo);
                    DI.lpszDocName:=NomApplication;
                    DI.lpszOutput:=nil;
                    (* INITIALISATION DU CONTEXTE DE PERIPHERIQUE *)
                    AncienMode:=SetMapMode(DC,mm_LoMetric);
                    AncienAlignement:=SetTextAlign(DC,ta_Left or ta_BaseLine or ta_NoUpdateCP);
                    (* SESSION D'IMPRESSION *)
                    if (StartDoc(DC,DI) > 0) and (StartPage(DC) > 0)
                       then
                         begin
                           (* IMAGE DU DOCUMENT *)
                           AdresseBitmap:=GlobalLock(F119.Handle);
                           SetDIBitsToDevice(DC,0,0,F119.EnTete^.BMIHeader.BIWidth,F119.EnTete^.BMIHeader.BIHeight,
                                             0,0,0,F119.EnTete^.BMIHeader.BIHeight,
                                             AdresseBitmap,F119.EnTete^,DIB_RGB_Colors);
                           (* DONNEES ECRITES *)
                           {Bla bla bla}
                           (* IMPRESSION DE LA PAGE *)
                           Erreur:=EndPage(DC);
                           if Erreur >= 0
                              then
                                begin
                                  Erreur:=0;
                                  EndDoc(DC);
                                end
                              else   (* ERREUR RENVOYEE PAR L'IMPRIMANTE *)
                                begin
                                  case Erreur of
                                    sp_Error : StrCopy(Texte,'Erreur générale de l''imprimante');
                                    sp_AppAbort,sp_UserAbort : StrCopy(Texte,'Impression stoppée');
                                    sp_OutOfDisk : StrCopy(Texte,'Espace disque insuffisant pour l''impression d''arrière-plan');
                                    sp_OutOfMemory : StrCopy(Texte,'Mémoire insuffisante pour l''impression d''arrière-plan');
                                  end;
                                  AbortDoc(DC);
                                  StrCopy(Titre,'Erreur d''impression du F-119');
                                  MessageBox(hWindow,Texte,Titre,mb_IconHand or mb_Ok);
                                  IMPRIMER_F119:=False;
                                end;
                           GlobalUnlock(F119.Handle);
                         end
                       else   (* ERREUR D'INITIALISATION DE L'IMPRIMANTE *)
                         begin
                           AbortDoc(DC);
                           StrCopy(Texte,'Erreur d''initialisation de l''imprimante');
                           StrCopy(Titre,'Erreur d''impression du F-119');
                           MessageBox(hWindow,Texte,Titre,mb_IconHand or mb_Ok);
                           IMPRIMER_F119:=False;
                         end;
                    (* RESTAURATION DU CONTEXTE DE PERIPHERIQUE *)
                    SetMapMode(DC,AncienMode);
                    SetTextAlign(DC,AncienAlignement);
                    SetCursor(AncienCurseur);
                  end
                else   (* IMAGE DU F-119 NON CHARGEE *)
                  IMPRIMER_F119:=False;
           end
         else   (* CONTEXTE DE PERIPHERIQUE NON CREE *)
           begin
             StrCopy(Texte,'Contexte de périphérique non créé.'#10#10#13);
             StrCopy(Titre,'Cela peut provenir d''un manque de mémoire ou bien de l''absence d''imprimante définie par défaut.');
             StrCat(Texte,Titre);
             StrCopy(Titre,'Erreur d''impression du F-119');
             MessageBox(hWindow,Texte,Titre,mb_IconHand or mb_Ok);
             IMPRIMER_F119:=False;
           end;
    End;
     
    Destructor tImpression.DONE;
    (* DESTRUCTION DU CONTEXTE DE PERIPHERIQUE D'IMPRESSION ET DES FONTES *)
    Begin
      if DC <> 0
         then
           DeleteDC(DC);
      tObject.DONE;
    End;
    Honnêtement, j'ai dû éplucher une quinzaine de sites pour trouver tous les éléments nécessaires. Pour la lecture du fichier BMP, j'ai trouvé dans la bonne vieille SWAG !
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  11. #11
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Mais c'est que ça m'à l'air tout simple ça !

    Honnêtement, t'es sûr qu'il n'y a pas une solution plus simple ?
    Parce que là, on frôle la folie...

    Enfin, merci pour les autres !

    Question bête : as-tu penser à regarder l'unité OPrinter.pas ???

    A+
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  12. #12
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Je pense que l'unité OPrinter n'apporte aucune aide particulière au niveau de la manipulation des bitmaps indépendantes du périphérique (ce qui constitue la grosse difficulté en fait). Cela ne changerait pas grand chose.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  13. #13
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Si tu le dis ! C'est toi le "pro" dans ce domaine après tout... Donc je te fais entièrement confiance.

    A+
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  14. #14
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Pfiouuu !

    Quel grand honneur tu me fais là !
    Venant de toi, c'est un sacré compliment !!!
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 21/01/2007, 19h31
  2. Réponses: 2
    Dernier message: 19/11/2004, 08h54
  3. Enlever le boutton impression sur une image !
    Par Gab-Gab dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/11/2004, 23h30
  4. [C#] Comment convertir une image bmp en jpg !!!
    Par vandeyy dans le forum Windows Forms
    Réponses: 5
    Dernier message: 13/07/2004, 20h37
  5. inserer une image BMP dans un fichier rtf
    Par Alice9 dans le forum MFC
    Réponses: 17
    Dernier message: 06/07/2004, 10h31

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