CChargy
Messages postés126Date d'inscriptionsamedi 24 avril 2004StatutMembreDerniè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és3Date d'inscriptionmercredi 20 avril 2005StatutMembreDernière intervention11 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és755Date d'inscriptionsamedi 15 mai 2004StatutMembreDernière intervention30 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és1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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és14Date d'inscriptionlundi 24 avril 2006StatutMembreDerniè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:
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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és1101Date d'inscriptionjeudi 24 avril 2003StatutMembreDernière intervention23 juillet 20237 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és2Date d'inscriptionvendredi 3 décembre 2004StatutMembreDernière intervention29 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és87Date d'inscriptiondimanche 2 février 2003StatutMembreDerniè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és6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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és6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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és1101Date d'inscriptionjeudi 24 avril 2003StatutMembreDernière intervention23 juillet 20237 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
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'
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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és1101Date d'inscriptionjeudi 24 avril 2003StatutMembreDernière intervention23 juillet 20237 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és1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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és87Date d'inscriptiondimanche 2 février 2003StatutMembreDerniè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és298Date d'inscriptionjeudi 12 juin 2003StatutMembreDernière intervention 9 juillet 20081 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és1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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és298Date d'inscriptionjeudi 12 juin 2003StatutMembreDernière intervention 9 juillet 20081 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és2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDerniè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és1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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és6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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
18 oct. 2006 à 20:43
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
17 oct. 2006 à 14:30
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
24 août 2006 à 18:03
sinon, sympa la photo dans le screen, je ne te connaisait pas sous cette angles ^^
28 avril 2006 à 02:43
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.
27 avril 2006 à 17:55
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.
27 janv. 2006 à 13:49
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.
14 janv. 2006 à 12:23
Cette source vaut bien un 10/10 sans doute !
Comment passer en mode paysage ?
Bonne prog,
@++
29 oct. 2005 à 18:45
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 ;)
24 oct. 2005 à 23:18
merci ;-)
8 oct. 2005 à 11:42
8 oct. 2005 à 11:41
8 oct. 2005 à 11:02
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
7 oct. 2005 à 20:15
4 oct. 2005 à 22:06
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
21 sept. 2005 à 16:24
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().
20 sept. 2005 à 22:19
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.
19 sept. 2005 à 16:07
19 sept. 2005 à 15:54
19 sept. 2005 à 15:08
une idée juste une idée
14 sept. 2005 à 10:21
Le code a l'air bien. Il est vrai que ce genre de source se font rare sur le site.
11 sept. 2005 à 19:51
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
11 sept. 2005 à 19:43
Merci