Impression personnalisée [Résolu]

Signaler
Messages postés
24
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
18 octobre 2014
-
Messages postés
24
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
18 octobre 2014
-
Bonjour,





J'ai déjà fait pas mal de choses pour créer une boîte d'impression personnalisée.


But : imprimer plusieurs images du disque dur (choix du nombre d'images et impression des images choisies)


Il faudrait alors pouvoir choisir combien mettre d'images par page, leur disposition, leur taille, etc.





**J'ai récupéré la boîte de ressources standard 1538 que j'ai modifiée
un peu (Boutons radio "Toutes les images" ou je garde les champs
standards "de n°xx à n°xx") et je lui ai associé une classe CMyPrintDlg
dérivée de CPrintDialog





**J'ai OnPreparePrinting(CPrintInfo* pInfo) qui ouvre cette boîte et initialise des éléments de champs de la boîte standard
(il faudra que je récupère les images de début et de fin entrées dans la boîte, je n'y arrive pas encore)




-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------





A ce stade-là (qui m'a déjà pris une éternité vu mon niveau), voilà ce que ça donne :


j'ai ma boîte personnalisée et le bouton imprimer imprime l'image à l'écran en petit en haut à gauche de ma feuille.


L'aperçu avant impression correspond bien à ce que j'obtiens.








Donc il reste:


-->Définir les actions de mes boutons ajoutés dans la boîte de dialogue (mais là, comment faire pour agir sur pInfo qu'on ne trouve que dans des fonctions standard de la View comme OnPreparePrinting(CPrintInfo* pInfo)

De plus, si des événements EnChange fonctionnent pour mes EDIT, je
ne peux pas leur associer de variable comme d'habitude (aucun des
éléments que j'ajoute dans cette boîte n'a le même comportement que
d'habitude).

-->Où indiquer l'image à imprimer, où faire la boucle? (en imprimant
les images demandées à partir de leur emplacement sur le disque dur
directement où en les envoyant à la vue par la fonction Load, peut-être
plus simple puisque ça utilise déjà le code de la fonction OnDraw).


-->Où imprimer les images sur la feuille (disposition)?





Pouvez-vous m'indiquer la marche à suivre ?


Merci.

9 réponses

Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,

Je viens de déposer le code source. J'espère qu'il te sera utile:

http://www.cppfrance.com/code.aspx?ID=33749
Messages postés
24
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
18 octobre 2014

S'il vous plaît, au moins est-ce que quelqu'un sait comment je peux imprimer plusieurs images sur une page (on va commencer par une question à la fois car j'ai l'impression que ça décourage tout le monde cette question).



-->où fait-on la boucle, comment on définit la zone de la feuille dans laquelle on imprime l'image, etc.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Seulement MFC qui n'intéresse pas grand-monde ici.
Féfinis tes RECT et fais des StretBlt de tes images selon coordonnées de ces Rect, ne change pas grand chose que soit un hdc imprimante ou écran.

ciao...
BruNews, MVP VC++
Messages postés
24
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
18 octobre 2014

"Seulement MFC qui n'intéresse pas grand-monde ici."

Mouais... ben c'est dommage qu'on ne trouve aucun code qui montre comment se dépatouiller avec ça :-(



Peu importe, grâce à un autre forum, j'ai avancé; je ne tenterai plus ici.
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
thxoptimizer >> Je te conseille de ne pas rester toujours
dépendant des MFC. Pense à passer à la programmation en API. Tu ne le
regrettras jamais. Ca te permettra de mieux maitriser tes programmes et
mieux comprendre le fonctionnement de Windows. Tu découvriras que ce
truc que tu veux faire est tellement simple en API. Comme l'a précisé
BruNews, la feuille de l'imprimante est considérée comme un écran sur
lequel on peut directement écrire, dessiner ou mettre des images selon
la disposition désirée etc...Il suffit d'avoir quelques bases en C et
consulter la documentation des différentes fonctions API à utiliser. Tu
découvriras la puissance des APIs et tu n'aimeras plus toucher aux MFC.
:)
Messages postés
24
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
18 octobre 2014

L'histoire c'est que certains faisaient "de la prose sans le savoir",
je dois faire un mélange de MFC et d'API sans la savoir car je sais pas
trop quand j'utilise ce que je trouve ce que c'est.

Sans m'exposer comment résoudre complètement mon problème, peux-tu me
donner plus ou moins ce que ça donnerait en "API" (des noms de
fonctions).
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Ok, je vais faire un code source qui imprime des images. Je le déposerai ici dès qu'il est prêt.
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,

Désolé pour ce retard dû à des imprévus. J'avais déja commencé le
projet du programme d'impression d'images en API. Il ne manque
maintenant que la mise en page permettant de définir les marges non
imprimables de la feuille. J'ai préféré perfectionner un peu le
programme en espérant qu'il intéressera d'autres membres du site.

En attendant, voici les fonctions API utilisées juste pour l'impression d'une image:

-LoadImage() pour charger l'image d'un fichier ou d'une ressource. Le 6ème paramètre doit être LR_CREATEDIBSECTION.

- Déclarer un pointeur LPBITMAPINFO puis lui allouer de la mémoire comme ceci:

LPBITMAPINFO pBmi=(LPBITMAPINFO)GlobalAlloc(GMEM_FIXED,sizeof(BITMAPINFO));

- Récupérer les informations sur le BitMap chargé comme ceci:

BITMAP bm;

GetObject(hBitmap, sizeof(BITMAP), (LPVOID) &bm);

- Initialiser les membres de notre structure BITMAPINFO comme ceci:

pBmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

pBmi->bmiHeader.biWidth = bm.bmWidth;

pBmi->bmiHeader.biHeight = bm.bmHeight;

pBmi->bmiHeader.biPlanes = 1;

pBmi->bmiHeader.biBitCount = bm.bmBitsPixel * bm.bmPlanes;

pBmi->bmiHeader.biCompression = BI_RGB;

pBmi->bmiHeader.biSizeImage = bm.bmWidthBytes * bm.bmHeight;

pBmi->bmiHeader.biXPelsPerMeter = 0;

pBmi->bmiHeader.biYPelsPerMeter = 0;

pBmi->bmiHeader.biClrUsed = 0;

pBmi->bmiHeader.biClrImportant = 0;

- Obtenir le HDC de l'imprimate puis au milieu du bloc StartDoc StartPage EndPage EndDoc tu mets ceci:

StretchDIBits(pdc,posx,posy,larg,haut, 0, 0, bm.bmWidth, bm.bmHeight, bm.bmBits, pBmi, DIB_RGB_COLORS, SRCCOPY);

pdc est le HDC de l'imprimante, posx et posy la position de l'image en
points (600 par pouce) . larg et haut sont les dimensions de l'image en
points.

- Libérer la mémoire déja allouée en faisant GlobalFree(pBmi);

Voilà, ceci est un exemple simple, j'espère terminer le programme
complet dans quelques jours après l'avoir testé sur différentes
imprimantes.
Messages postés
24
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
18 octobre 2014

Je suis extrêmement impressionné!



Si pour tout avouer, entre temps j'ai du me débrouiller tout seul et
faire quelque chose de totalement différent, plus artisanal et tout:



-1°/ Il n'existe rien du même genre ailleurs donc sois sûr que ton code
servira à d'autres personnes; moi, je n'ai plus le temps pour ça au
sein de mon projet et ce que j'ai fait me convient (même si le code est
sûrement atroce pour quelqu'un qui sait bien programmer en API).



-2°/ Même moi je vais regarder ton code pour des petites choses
graphiques que je ne savais pas faire jusqu'ici (le rectangle en
pointillé, avec la souris pour le redimensionner, je vais voir si je
peux utiliser ça à d'autres fins).