Bonjour,
j'ai des problèmes pour imprimer un fichier JPG sur les machines XP (SP3).
Sur toutes les machines Vista, ce code fonctionne sans problème.
J'utilise le code suivant
Sous Vista, ce code semble appeler WIA ou je peux alors m'occuper de de choisir l'imprimante, le format et puis confirmer. -> No problem
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 //--------------------------------------------------------------------------- //# Void TForm1::PrintFile(Filename) // Print A File to default printer //--------------------------------------------------------------------------- void __fastcall TVisdrawForm1::PrintFile(String FileName) { SHELLEXECUTEINFO execinfo; // Structure ShellExecute(Ex) info //typedef struct _SHELLEXECUTEINFO { // DWORD cbSize; // ULONG fMask; // HWND hwnd; // LPCTSTR lpVerb; // LPCTSTR lpFile; // LPCTSTR lpParameters; // LPCTSTR lpDirectory; // int nShow; // HINSTANCE hInstApp; // LPVOID lpIDList; // LPCTSTR lpClass; // HKEY hkeyClass; // DWORD dwHotKey; // union { // HANDLE hIcon; // HANDLE hMonitor; // } DUMMYUNIONNAME; // HANDLE hProcess; //} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO; String action; // action to run String params = ""; action = "print"; memset(&execinfo, 0, sizeof(execinfo)); execinfo.lpFile = FileName.c_str(); // programme execinfo.cbSize = sizeof(execinfo); execinfo.lpVerb = action.c_str(); // Action = Open execinfo.fMask = SEE_MASK_NOCLOSEPROCESS; execinfo.nShow = SW_SHOWDEFAULT; execinfo.lpParameters = params.c_str(); // Parms // Show Process or not execinfo.nShow = SW_SHOW; ShellExecuteEx(&execinfo);
Sous XP, ce code appelle le "Windows Pictures and fax Viewer", ou je peux également choisir l'imprimante et le format. Quand je confirme le print, le Windows Pictures and fax viewer tourne indéfiniment, jsuqu'à ce que je le tue.
J'ai essayé en remplaçant
par
Code : Sélectionner tout - Visualiser dans une fenêtre à part execinfo.fMask = SEE_MASK_NOCLOSEPROCESS;
même résultat sous Vista.
Code : Sélectionner tout - Visualiser dans une fenêtre à part execinfo.fMask = SEE_MASK_INVOKEIDLIST;
Sous XP, nouvelle fenêtre "Welcome to Photo printing Wizard" où le sablier est permanent et il est impossible de continuer.
sans toucher à .fmask, c'est pareil à SEE_MASK_NOCLOSEPROCESS
j'ai fouillé partout.
J'ai trouvé cette technique dans la FAQ.
Cela fonctionne parfaitement sous Vista, mais sous XP, le bouton d'appel produit un bong et plus rien d'autre après.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Variant wzd, vct; wzd = Variant::CreateObject("WIA.CommonDialog"); vct = Variant::CreateObject("WIA.Vector"); vct.OleProcedure("Add", FileName.c_str()); wzd.OleProcedure("ShowPhotoPrintingWizard", vct); wzd = Unassigned; vct = Unassigned;
Quelqu'un peut-il m'aider ?
NB ; j'ai également trouvé et lu le guide "Impression Avec C++ Builder" traduit par Jean-Pierre Blondelle mais j'y perd un peu mon latin.
En finalité, une autre technique que je voudrais essayer est celle ci-dessous trouvée sur le forum, mais mon fichier est un .jpg au lieu de .BMP et cela plante direct.
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 Graphics::TBitmap* Bitmap = new Graphics::TBitmap(); Bitmap ->LoadFromFile("C:\\TestCCQ.bmp"); Printer()->BeginDoc(); int XPixelsParPouce = GetDeviceCaps(Printer()->Handle, LOGPIXELSX); int YPixelsParPouce = GetDeviceCaps(Printer()->Handle, LOGPIXELSY); int NomImprimableHorizPixels = GetDeviceCaps(Printer()->Handle, PHYSICALOFFSETX); int NomImprimableVertiPixels = GetDeviceCaps(Printer()->Handle, PHYSICALOFFSETY); int Marge_Gauche = 15; int Marge_Haute = 85; int Marge_Droite = 195; int Marge_Basse = 280; int Millimetres2PixelsGauche = Marge_Gauche / (25.4 / XPixelsParPouce); int Millimetres2PixelsHaute = Marge_Haute / (25.4 / YPixelsParPouce); int Millimetres2PixelsDroite = Marge_Droite / (25.4 / XPixelsParPouce); int Millimetres2PixelsBasse = Marge_Basse / (25.4 / YPixelsParPouce); TRect rect; rect.Top = Millimetres2PixelsHaute - NomImprimableVertiPixels; rect.Left = Millimetres2PixelsGauche - NomImprimableHorizPixels; rect.Right = Millimetres2PixelsDroite - NomImprimableHorizPixels; rect.Bottom = Millimetres2PixelsBasse - NomImprimableVertiPixels; Printer()->Canvas->StretchDraw(rect, Bitmap); Printer()->EndDoc();
Partager