IMPRIMEUR D'IMAGES BMP (API)

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 - 11 sept. 2005 à 19:43
CChargy Messages postés 126 Date d'inscription samedi 24 avril 2004 Statut Membre Dernière intervention 6 janvier 2008 - 18 oct. 2006 à 20:43
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/33749-imprimeur-d-images-bmp-api

CChargy Messages postés 126 Date d'inscription samedi 24 avril 2004 Statut Membre Dernière intervention 6 janvier 2008
18 oct. 2006 à 20:43
Bonjour,

Je crois que j'ai la réponse à cette question, mais je vérifie. Cette fonction est-elle compatible avec Linux ou est-ce une source uniquement pour Windows ?
Voila si vous connaissez un moyen d'imprimmer des images sur Windows ET Linux ???
Merci d'avance

Colin CHARGY
jpiquemal Messages postés 3 Date d'inscription mercredi 20 avril 2005 Statut Membre Dernière intervention 11 septembre 2008
17 oct. 2006 à 14:30
Bonjour
Code très utile :-)
Une amélioration: pour avoir à l'écran une imagette parfaite (enfin... presque) il faut ajouter, avant le StretchBlt, la ligne suivante:

SetStretchBltMode(hdc, COLORONCOLOR);

Jean
wxccxw Messages postés 755 Date d'inscription samedi 15 mai 2004 Statut Membre Dernière intervention 30 janvier 2011
24 août 2006 à 18:03
vraiment cool, je chercher sa !
sinon, sympa la photo dans le screen, je ne te connaisait pas sous cette angles ^^
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
28 avril 2006 à 02:43
Salut,
jul41 > Pour Dev C++ tu dois ajouter -lgdi32 aux options de l'éditeur de lien.
Pour Visual C++ 6, le #define _WIN32_WINNT 0x0500 permet justement au compilateur de reconnaitre cette fonction qui n'est supportée que dans Windows 2000 et supérieur. Si malgré ce define ton compilateur refuse de la reconnaitre alors tu dois télécharger le dernier Platform SDK pour avoir les fichiers include récents.
jul41 Messages postés 14 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 1 mai 2006
27 avril 2006 à 17:55
Salut Racpp!
j'ai plein d'erreurs en compilant sous Dev-C++ 4.9.9.2, du genre:

[Linker error] undefined reference to 'GetObjectA@12'
[Linker error] undefined reference to 'CreateCompatibleDC@4'
...

J'ai aussi essayé avec Visual C++6.0 mais il me met:

error C2065: 'GetDefaultPrinter' : undeclared identifier

Sais-tu comment les corriger?
merci d'avance.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
27 janv. 2006 à 13:49
Salut,
Désolé pour ce retard car j'étais occupé par un projet.
INDDZEN >> Pour imprimer sans laisser de marges, je pense qu'il est possible de faire comme ceci:
- Donner une valeur négative au 2e paramètre de la fonction StretchDIBits() pour que l'impression commence à gauche de la zone imprimable.
- Donner une valeur négative au 3e paramètre pour que l'impression commence au dessus de la zone imprimable.
- Donner une valeur supérieure à la largeur de la zone imprimable au 4e paramètre pour que l'impression dépasse horizontalement le cadre d'impression.
- Donner une valeur supérieure à la hauteur de la zone imprimable au 5e paramètre pour que l'impression dépasse verticalement le cadre d'impression.
A toi de faire les tests nécessaires pour trouver les bonnes valeurs.
VICTORCOASNE >> Pour imprimer en mode paysage, je pense qu'il est également possible de jouer sur les 2e,3e,4e et 5e paramètres de la fonction StretchDIBits().
Tu peux ajouter dans ton code une fonction qui se charge de la conversion des coordonnées normales en coordonnées pour mode paysage.
victorcoasne Messages postés 1101 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 23 juillet 2023 7
14 janv. 2006 à 12:23
Re,

Cette source vaut bien un 10/10 sans doute !

Comment passer en mode paysage ?

Bonne prog,
@++
inddzen Messages postés 2 Date d'inscription vendredi 3 décembre 2004 Statut Membre Dernière intervention 29 octobre 2005
29 oct. 2005 à 18:45
Très bonne ressource, j'ai déjà developpé un code similaire mais moins consistant :)
Il y a cependant une question qui turlupine :
Supposons que l'on veuille imprimer une bitmap sur une page sans laisser de marges, comment faire?
J'ai fais plusieurs tests mais j'y arrive pas; alors si quelqu'un a une idee ;)
cs_bilal Messages postés 87 Date d'inscription dimanche 2 février 2003 Statut Membre Dernière intervention 4 mars 2010
24 oct. 2005 à 23:18
personne m'a repondu !! ben je fairai une option de calibrage alors, comme une page de teste pour configuration.

merci ;-)
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
8 oct. 2005 à 11:42
Et puis les warnings peuvent dépendre de la version de mingw, mais pas de celle de Dev-C++ évidemment
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
8 oct. 2005 à 11:41
On n'a pas a tenir compte de ces warnings car on sait que les champs non initialisés sont mis a zéro, ce qu'on veut effectivement faire ici
victorcoasne Messages postés 1101 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 23 juillet 2023 7
8 oct. 2005 à 11:02
J'ai la 4.9.9.2 .
Voici les logs :
Compilateur: Default compiler
Building Makefile: "D:\C++\astuces\ImprimeurBMP\Makefile.win"
Exécution de make clean
rm -f ImprimeurBMP.o ImprimeurBMP.exe

g++.exe -c ImprimeurBMP.cpp -o ImprimeurBMP.o -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Dev-Cpp/include/c++/3.4.2" -I"C:/Dev-Cpp/include" -D__GNUWIN32__ -W -DWIN32 -DNDEBUG -D_WINDOWS -D_MBCS

ImprimeurBMP.cpp: In function `LRESULT WndProc(HWND__*, UINT, WPARAM, LPARAM)':
ImprimeurBMP.cpp:138: warning: missing initializer for member `tagBITMAP::bmWidth'
ImprimeurBMP.cpp:138: warning: missing initializer for member `tagBITMAP::bmHeight'
ImprimeurBMP.cpp:138: warning: missing initializer for member `tagBITMAP::bmWidthBytes'
ImprimeurBMP.cpp:138: warning: missing initializer for member `tagBITMAP::bmPlanes'
ImprimeurBMP.cpp:138: warning: missing initializer for member `tagBITMAP::bmBitsPixel'

ImprimeurBMP.cpp:138: warning: missing initializer for member `tagBITMAP::bmBits'

ImprimeurBMP.cpp:139: warning: missing initializer for member `tagRECT::top'
ImprimeurBMP.cpp:139: warning: missing initializer for member `tagRECT::right'
ImprimeurBMP.cpp:139: warning: missing initializer for member `tagRECT::bottom'

g++.exe ImprimeurBMP.o -o "ImprimeurBMP.exe" -L"C:/Dev-Cpp/lib" -mwindows -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32

Exécution terminée
Compilation OK
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
7 oct. 2005 à 20:15
Victorcoasne >> Tu as quelle version de Dev-C++ ? Moi j'ai la version 4.9.9.2 et je n'ai aucun warning.
victorcoasne Messages postés 1101 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 23 juillet 2023 7
4 oct. 2005 à 22:06
Bonjour,
J'ai pas eu le temps de regarder mais Warnings sous Dev :

ImprimeurBMP.cpp: In function `LRESULT WndProc(HWND__*, UINT, WPARAM, LPARAM)':
ImprimeurBMP.cpp:138: warning: missing initializer for member `tagBITMAP::bmWidth'
ImprimeurBMP.cpp:138: warning: missing initializer for member `tagBITMAP::bmHeight'
ImprimeurBMP.cpp:138: warning: missing initializer for member `tagBITMAP::bmWidthBytes'
ImprimeurBMP.cpp:138: warning: missing initializer for member `tagBITMAP::bmPlanes'
ImprimeurBMP.cpp:138: warning: missing initializer for member `tagBITMAP::bmBitsPixel'

ImprimeurBMP.cpp:138: warning: missing initializer for member `tagBITMAP::bmBits'
ImprimeurBMP.cpp:139: warning: missing initializer for member `tagRECT::top'
ImprimeurBMP.cpp:139: warning: missing initializer for member `tagRECT::right'
ImprimeurBMP.cpp:139: warning: missing initializer for member `tagRECT::bottom'

Sinon c'est bien de parler d'impression
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
21 sept. 2005 à 16:24
Salut,
BOUMARCEL >> Je ne connaissais pas ce "Acrobat Distiller". Après des recherches sur le net j'ai appris qu'il permet effectivement de créer des fichier PDF en imprimant sur une imprimante virtuelle. Il parait qu'il est excellent. Malheureusement, il n'est pas gratuit. Je le trouve même cher car il semble être destiné aux professionnels qui créent des documents PDF de grande qualité. Il n'existe pas de version gratuite?
BILAL >> Le nombre de points d'une page est beaucoup plus grand que le nombre de pixels de l'écran. Pour le format A4 européen avec une résolution de 600dpi, la page a une largeur de 4960 points et une hauteur de 7015 points. Les coordonnées d'une image ou autre doivent donc être calculés en points et non en pixels. La zone imprimable est toujours inférieure à la taille de la page réelle car il y'a des marges non imprimables de chaque coté de la feuille. Et ces marges diffèrent d'une imprimante à l'autre. La fonction API GetDeviceCaps() nous permet de retrouver tous les paramètres d'une page d'une imprimante. Elle retourne un int qui contient la valeur cherchée en points. Son premier paramètre est le HDC de l'imprimante. Son deuxième paramètre spécifie ce qu'on cherche. Exemples:
int resolutionx=GetDeviceCaps(pDC,LOGPIXELSX);
int resolutiony=GetDeviceCaps(pDC,LOGPIXELSY);
En génaral, la résolution horizontale et certicale sont les mêmes (600 points par pouce).
int largeurpage=GetDeviceCaps(pDC,PHYSICALWIDTH);
int hauteurpage=GetDeviceCaps(pDC,PHYSICALHEIGHT);
int largeurimprimable=GetDeviceCaps(pDC,HORZRES);
int hauteurimprimable=GetDeviceCaps(pDC,VERTRES);
int margegauche=GetDeviceCaps(pDC,PHYSICALOFFSETX);
int margehaute=GetDeviceCaps(pDC,PHYSICALOFFSETY);
Les marges droite et basse sont déterminées par la largeur et la hauteur de la zone imprimable.
Grâce à toutes ces valeurs, tu peux calculer correctement les dimensions et les emplacements de tes images sur le papier. Je n'ai jamais utilisé de canvas mais je pense qu'il doit avoir une méthode du genre GetDeviceCaps().
cs_bilal Messages postés 87 Date d'inscription dimanche 2 février 2003 Statut Membre Dernière intervention 4 mars 2010
20 sept. 2005 à 22:19
salut,

voila j'ai develloper un soft sous builder 5.0 c,c++

je crée un genre de coupon avec uniquement des textes a l'interieur, on va dire genre carte de visite; jai fait une option qui me permet de choisir le nombre de carte que je veux imprimer sur une meme feuille , max 14 par feuilles , la tout va bien, en imprimant je voyai comme resultat que c'est trop petit ou trop grand donc j'ai fini par trouver les bonnes coordonnées pour l'impression "x1 y1 x2 y2" , ca sort impec sur mon imprimante mais des que je passe sur une autre imprimante !! tout es decallés , faut ke je mette chaque fois des coordonné propre a l'impprimante qui sera utilisé ! ya surment un moyen pour redimenssionner comme dans cette exemple de RACPP; j'utilise les canvas et sous builder , qqn serais m'aider ? je le retrouve

merci d'avance
les prog.
boumarsel Messages postés 298 Date d'inscription jeudi 12 juin 2003 Statut Membre Dernière intervention 9 juillet 2008 1
19 sept. 2005 à 16:07
c'est ce que j'utilisais quand je developpais une application de gestion pour une entreprise et ça a ete tres pratique et economique et j'obtenais les meme resultats quand je fais les tests par une impression reel en format A4.le composant qui s'installe c'est acrobat distiller si je me rappelle bien.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
19 sept. 2005 à 15:54
BOUMARSEL >> Oui, j'avais fait les premiers tests avec "PDF printer" mais ce n'était pas bon car il ne prend pas en compte le format A4 européen. En plus, il ne comporte pas de marges non imprimables et ne fonctionne pas correctement avec certaines fonctions API. C'est pour cela que j'ai préféré une imprimante. Merci quand-même.
boumarsel Messages postés 298 Date d'inscription jeudi 12 juin 2003 Statut Membre Dernière intervention 9 juillet 2008 1
19 sept. 2005 à 15:08
au lieu d'utiliser ton imprimante pour faire les tests, suffit d'installer adobe acrobat qui installe une imprimante vertuelle, ainsi tes fichiers seront imprimés en fichier pdf que tu peux visualiser.
une idée juste une idée
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
14 sept. 2005 à 10:21
Interressant ton source.
Le code a l'air bien. Il est vrai que ce genre de source se font rare sur le site.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
11 sept. 2005 à 19:51
Je viens de remarquer que j'ai oublié de supprimer l'objet (PEN) "pointilles" avant de quitter le programme. Il est donc préférable de d'ajouter ceci dans le traitement du message WM_CLOSE:
case WM_CLOSE:
//.....
DeleteObject(pointilles);
//...
return 0;
J'aimerais aussi préciser que le nombre maximal d'images à mettre dans une seule page est limité à 5 dans le programme. Vous pouvez le modifier bien sûr:
#define nombre 10 // par exemple
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
11 sept. 2005 à 19:43
Enfin une source qui traite de l'impression. Je crois bien que c'est la seule ici. Pas le temps de regarder le source pour le moment, mais je prendrai le temps de le faire plus tard
Merci
Rejoignez-nous