programmation d'impression avec visual basic 6

programmation d'impression avec visual basic 6 - VB/VBA/VBS - Programmation

Marsh Posté le 02-10-2002 à 17:05:39    

Je cherche le code pour pouvoir choisir le format d'impression (A4, A5, etc...)d'une Form sous Visual Basic 6.
 
Merci a toute réponse!!!

Reply

Marsh Posté le 02-10-2002 à 17:05:39   

Reply

Marsh Posté le 03-10-2002 à 11:57:08    

fo utiliser l'object printer :
 

Code :
  1. Printer.orientation = vbPRORPortrait ( portrait )
  2. Printer.orientation = vbPROPLandscap ( paysage )
  3. et pour la taille :
  4. printer.papersize = vbPRPSA3 (A3)
  5. printer.papersize = vbPRPSA4 (A4)
  6. printer.papersize = vbPRPSB5 (DINB5)


Message édité par __Oto__ le 03-10-2002 à 11:57:28
Reply

Marsh Posté le 05-10-2002 à 14:10:27    

__Oto__ a écrit a écrit :

fo utiliser l'object printer :
 

Code :
  1. Printer.orientation = vbPRORPortrait ( portrait )
  2. Printer.orientation = vbPROPLandscap ( paysage )
  3. et pour la taille :
  4. printer.papersize = vbPRPSA3 (A3)
  5. printer.papersize = vbPRPSA4 (A4)
  6. printer.papersize = vbPRPSB5 (DINB5)






 
merci pr ta réponse, mais ca me met un msg d'erreur :
run-time error '380'
invalid property value
 
alors si t'a une idée, merci de me faire signe!:) a+

Reply

Marsh Posté le 05-10-2002 à 14:33:21    

GUARO a écrit a écrit :

 
 
merci pr ta réponse, mais ca me met un msg d'erreur :
run-time error '380'
invalid property value
 
alors si t'a une idée, merci de me faire signe!:) a+




 
sorry, en fait t'a just fait une faute de frappe et g fais un copier-coller! lol! mais ca me fait kan meme une erreur:
run-time error '486'
can't print form image to this type of printer
 
alors, de nouveau, si t'a une idée, elle est la bienvenue! merci!! a+

Reply

Marsh Posté le 05-10-2002 à 19:56:29    

Par curiosité, l'imprimante installée par défaut sur le système, c'est quoi ?
On peut effectivement changer la taille du papier ? La commande indiquée gère les propriétés de l'imprimante au niveau du "système".
 
Si on veut appliquer un taux de réduction, faut le gérer in-situ (à moins que le pilote le permette).
 
Si on veut du A5 et qu'il n'y en a pas dans la bac, VB rouspète (j'essaie d'imaginer).
 
Y a pas moyen de faire pas à pas en local, ou incorporer des MessageBox() ligne après ligne dans la zone fragile pour debugger ?

Reply

Marsh Posté le 07-10-2002 à 15:47:42    

carbon_14 a écrit a écrit :

Par curiosité, l'imprimante installée par défaut sur le système, c'est quoi ?
On peut effectivement changer la taille du papier ? La commande indiquée gère les propriétés de l'imprimante au niveau du "système".
 
Si on veut appliquer un taux de réduction, faut le gérer in-situ (à moins que le pilote le permette).
 
Si on veut du A5 et qu'il n'y en a pas dans la bac, VB rouspète (j'essaie d'imaginer).
 
Y a pas moyen de faire pas à pas en local, ou incorporer des MessageBox() ligne après ligne dans la zone fragile pour debugger ?




 
l'imprimante c une hp 690c et le truc serai d'imprimer la fenetre du programme sur une taille de papier choisie, histoire ke ca donne la meme chose sur a5 ke sur a4 mais en miniature.
 
je débute en VB, en + je l'ai en version anglaise(lol) et mon boss me donne pas bcp de temps pr finir le soft..., merci d'etre le + explicite possible et merci aux réponse!:)
 
a+!

Reply

Marsh Posté le 08-10-2002 à 19:45:06    

Une chose à essayer : sous un soft commercial (Word, ou tout autre), si on choisit du papier A5 pour imprimer, que dit le soft ? S'il obéit, le pilote sait gérer du papier A5 quand y a du A4 (si on veut imprimer sur enveloppe, si on en met pas, le système attend car peut pas agir !!). Généralement on imprime sur le papier qui est ds la machine, ou il en réclame jusqu'à.
 
Je suis resté à VB3/16 bits donc vieux souvenirs.
 
Pour le debuggage, je proposais de fonctionner en points d'arrêt (F9 ? ss VB dans le code) ou en dynamique, on met une ligne messagebox (c'est une API, en VB sais plus MsgBox ?) avant la ligne de printer.machin, une autre après et avant le prochain appel à printer.bidule etc pour essayer de savoir QUELLE EST LA LIGNE QUI PROVOQUE cette erreur. Si on a messages "ligne 0", "ligne 1", "ligne 2", on sait ensuite ds le code quelle est la "mauvaise" ligne, celle où code pose pb.
 
Voir quelles sont les propriétés de l'object printer. Y a peut-être un coeff prévu (?). Ca permettrait de gérer directement la réduction. Faut pas rêver. Je suis passé au BC => ai pas de VB récent => aide limitée :(.
 
Un moyen "détourné" si personne n'a d'idée serait de réduire dynamiquement la taille de la feuille à imprimer, mais faut alors INDEXER les positions (donc la taille) de TOUS LES CONTRÔLES pour qu'ils soient encore bien positionnés à l'impression. Quand imprime, on change taille feuille (et contrôles) puis lui redonne taille normale ensuite, mais ça ferait bizarre.
 
Sur sites VB, peut-être infos ?
http://www.vbfrance.com/ ou autres ?
 
? http://www.siteduzero.com/vb/controles.php (Google, réduction, pas encore trouvé ds quel chapitre)
Les API sous VB pour imprimer comme on veut
http://bidou.developpez.com/Impression_vb.pdf
 
Google sur réduct
http://www.google.com/search?q=VB+ [...] %A9duction


Message édité par Carbon_14 le 08-10-2002 à 19:53:53
Reply

Marsh Posté le 09-10-2002 à 10:38:31    

carbon_14 a écrit a écrit :

Une chose à essayer : sous un soft commercial (Word, ou tout autre), si on choisit du papier A5 pour imprimer, que dit le soft ? S'il obéit, le pilote sait gérer du papier A5 quand y a du A4 (si on veut imprimer sur enveloppe, si on en met pas, le système attend car peut pas agir !!). Généralement on imprime sur le papier qui est ds la machine, ou il en réclame jusqu'à.
 
Je suis resté à VB3/16 bits donc vieux souvenirs.
 
Pour le debuggage, je proposais de fonctionner en points d'arrêt (F9 ? ss VB dans le code) ou en dynamique, on met une ligne messagebox (c'est une API, en VB sais plus MsgBox ?) avant la ligne de printer.machin, une autre après et avant le prochain appel à printer.bidule etc pour essayer de savoir QUELLE EST LA LIGNE QUI PROVOQUE cette erreur. Si on a messages "ligne 0", "ligne 1", "ligne 2", on sait ensuite ds le code quelle est la "mauvaise" ligne, celle où code pose pb.
 
Voir quelles sont les propriétés de l'object printer. Y a peut-être un coeff prévu (?). Ca permettrait de gérer directement la réduction. Faut pas rêver. Je suis passé au BC => ai pas de VB récent => aide limitée :(.
 
Un moyen "détourné" si personne n'a d'idée serait de réduire dynamiquement la taille de la feuille à imprimer, mais faut alors INDEXER les positions (donc la taille) de TOUS LES CONTRÔLES pour qu'ils soient encore bien positionnés à l'impression. Quand imprime, on change taille feuille (et contrôles) puis lui redonne taille normale ensuite, mais ça ferait bizarre.
 
Sur sites VB, peut-être infos ?
http://www.vbfrance.com/ ou autres ?
 
? http://www.siteduzero.com/vb/controles.php (Google, réduction, pas encore trouvé ds quel chapitre)
Les API sous VB pour imprimer comme on veut
http://bidou.developpez.com/Impression_vb.pdf
 
Google sur réduct
http://www.google.com/search?q=VB+ [...] %A9duction




 
Merci pr ta réponse, g lancé d forum sur les site ke tu m'a dis, et je continue a chercher, mai j'commence a peter un cable!!:( lol!  
a+

Reply

Marsh Posté le 09-10-2002 à 14:41:57    

Y a peut-être des gens qui ont la solution en VB, mais ils ne semblent pas être dans le coin.
 
En regardant un peu http://bidou.developpez.com/Impression_vb.pdf  
je me demandais si on peut pas simplement jouer sur ScaleLeft, ScaleTop, ScaleHeight, ScaleWidth de l'imprimante.  
Si on peut les imposer (et non uniquement les lire), ça permet (??) de mettre à sa guise la mise en page voulue (sous réserve, à essayer). Tout dépend de si c'est la zone non imprimable de l'imprimante, ou la mise en page choisie par l'utilisateur.
 
Si on fait  
LargNale% = printer.ScaleWidth
et puis  
printer.ScaleWidth = LargNale% / 1.4142
on peut espérer que la largeur imprimable sera réduite. Peut-être que la Feuille "rentrera" dans cette zone, donc sera plus petite. CQFD.
 
En fait, ça serait du redimensionnement de zone d'impression destination que de la taille de la feuille source.
 
A tester, je divague/rêve peut-être.
 
Si c'est bon, en sortie du prog, faudrait restorer les param par défaut. :)

Reply

Marsh Posté le 09-10-2002 à 16:04:16    

comment tu as declarer l'object printer ?? tu peut mettre le code plz ?

Reply

Marsh Posté le 09-10-2002 à 16:04:16   

Reply

Marsh Posté le 09-10-2002 à 16:33:50    

__Oto__ a écrit a écrit :

comment tu as declarer l'object printer ?? tu peut mettre le code plz ?




 
ben l'truc c ke j'suis tellement débutant ke j'c pas si je l'ai bien défini!! lol! :heink:  
mais le code ke g mis le concernant c'est:
 
Printer.PaperSize = 9
Printer.Orientation = 2
Form1.PrintForm
 
 
et si g bien suivi l'aide(en anglais), avec cette méthode, j'imprime pas le contenu de l'object printer. Pour faire ca, il faudrai ke j'utilise la commande:  
 
printer.print Form1
printer.endDoc
 
et a ce moment là, il m'imprime rien ou me met un msg d'erreur.  
G ptetre fait qqch de complétement faux ki vous parait evident, dans ce k, dites moi, laissez moi pas mourrir idiot! lol!
merci encore pr vos réponse!
a+
 
 
 
 

Reply

Marsh Posté le 09-10-2002 à 17:42:18    

g essayé de paramétrer la taille de la form de sorte a ce kel corresponde a la taille d'une feuille A4, mais VB ne veux pas parcequ'après la form dépasse la taille de l'écran!! et j'suis en 1024/768!!! c l'horreur!:((

Reply

Marsh Posté le 09-10-2002 à 21:11:34    

Quand on fait Form1.PrintForm, je pense qu'il imprime les pixels de la feuille à la résolution de l'imprimante. A vérifier..
 
Si on veut imprimer, il me semble qu'il faut tout d'abord faire Printer.StartDoc
 
on envoie les trucs
 
Printer.Enddoc
 
Printer, c'est l'objet imprimante du système. Il a des propriétés et on applique des "méthodes".
 
Je dîne, j'allume mon vieux PC (il le faut de toute façon pour modifier code pour une manip) et je regarde sous VB3 ce que donne form.print. Pour l'objet Printer, suis pas sûr pouvoir sous Win 3.11. J'explore.
 
NB : une feuille ne peut pas dépasser la taille de l'écran. Interdit. Quand la méthode est bonne, on peut imprimer un timbre poste en A4. Y a la taille de l'objet à imprimer, et la taille de la trace imprimée.
 
 

Reply

Marsh Posté le 09-10-2002 à 21:32:58    

Printer.StartDoc semble n'exister qu'en C. Sous VB3, y a bien printer mais je regarde tt à l'heure, après dessert.
 

Reply

Marsh Posté le 09-10-2002 à 21:56:28    

Ca y est, ai fini.
Ai fouillé dans ma boîte de pandore VB3/API. Y a article Krosoft sur ça. Cf ce qui peut être utile.
 
How to Print Entire VB Form and Control the Printed Size
Article ID: Q84066
 
----------------------------------------------------------------------
The information in this article applies to:
 
- Standard and Professional Editions of Microsoft Visual Basic for
  Windows, versions 2.0 and 3.0 (et sans doute les autres ?)
- Microsoft Visual Basic programming system for Windows, version 1.0
----------------------------------------------------------------------
 
SUMMARY
=======
 
The Visual Basic for Windows PrintForm method provides a way to print
the client area of a form. However, PrintForm does not allow you to
control the size or proportion of the printed output, or to print the
non-client area (the caption and border) of the form.
 
The following code example uses Windows API functions to print the
entire form, and provides a method to control the size of the output.
This method can also be used to print only the client area to a
specific size and to control the position of the printed form to allow
text or other graphics to be printed on the same page as the image of
the form. The method is also applicable to printing all the forms in a
project.
 
NOTE: This example will not work correctly on PostScript printers.
 
For the example to work correctly, the printer must use a standard
non-PostScript laser printer configuration (such as PCL/HP).
 
MORE INFORMATION
================
 
Combining the Windows API functions BitBlt, StretchBlt,
CreateCompatibleDC, DeleteDC, SelectObject, and Escape allows greater
control over the placement and size of the printed form than the
PrintForm method. In a two-part process, the image of the entire form
is captured by using BitBlt to make an invisible picture, and is
turned into a persistent bitmap using the AutoRedraw property. Then
the picture is printed using the method of printing a picture control
(outlined in a separate article, found by querying for the following
word in the Microsoft Knowledge Base):
 
   CreateCompatibleDC
 
 
This method works on maximized forms as well as any smaller forms.
The use of GetSystemMetrics allows a general procedure to handle
different window border styles passed to it by querying the video
driver for the size of windows standard borders in pixels.
 
The example below requires a single form with an invisible picture
control.
 
Example
-------
 
1. Add the following code to the general Declarations level of the
   form in a new project:
 
   NOTE: All Declare statements below must be on one line each.
 
DefInt A-Z
Declare Function BitBlt Lib "gdi" (ByVal hDestDC, ByVal X, ByVal Y,
         ByVal nWidth, ByVal nHeight, ByVal hSrcDC, ByVal XSrc,
         ByVal YSrc, ByVal dwRop&)
Declare Function CreateCompatibleDC Lib "GDI" (ByVal hDC)
 
Declare Function SelectObject Lib "GDI" (ByVal hDC, ByVal hObject)
Declare Function StretchBlt Lib "GDI" (ByVal hDC, ByVal X, ByVal Y,
         ByVal nWidth, ByVal nHght, ByVal hSrcDC, ByVal XSrc,
         ByVal YSrc, ByVal nSrcWidth, ByVal nSrcHeight, ByVal dwRop&)
Declare Function DeleteDC Lib "GDI" (ByVal hDC)
Declare Function Escape Lib "GDI" (ByVal hDC, ByVal nEscape,
         ByVal nCount, lplnData As Any, lpOutData As Any)
Declare Function GetSystemMetrics Lib "User" (ByVal nIndex)
 
Const SM_CYCAPTION = 4
Const SM_CXBORDER = 5
Const SM_CYBORDER = 6
Const SM_CXDLGFRAME = 7
Const SM_CYDLGFRAME = 8
Const SM_CXFRAME = 32
Const SM_CYFRAME = 33
 
Const TWIPS = 1
 
Const PIXEL = 3
Const NILL = 0&
Const SRCCOPY = &HCC0020
Const NEWFRAME = 1
 
Dim ModeRatio, XOffset, YOffset As Integer
 
2. Set the following properties at design time:
 
   Control         Property      Setting
   -------         --------      -------
   Form1           Name          Form1 (default)
   Form1.Picture1  Name          Picture1 (default)
   Form1.Picture2  Name          Picture2 (default)
   Form1.File1     Name          File1 (default)
 
   (In Visual Basic version 1.0 for Windows, set the CtlName/FormName
    Property for the above objects instead of the Name property.)
 
You can add any other control(s) to the form to print. If a picture
 
control is drawn at run time, be sure to set its AutoRedraw property
to True so that the graphics will be transferred by the Windows API
call BitBlt and eventually printed by StretchBlt.
 
3. Add the following code to the Form_Load procedure of Form1:
 
Sub Form_Load ()
' Size the form explicitly to match parameters of StretchBlt.
' Or use design time size to set coordinates.
        Form1.Move 1095, 1200, 8070, 5280
 
' Size two example controls.
        File1.Move 4080, 120, 2775, 2535
        Picture1.Move 240, 120, 2775, 2535
 
' Put up a caption to indicate how to print the form.
    Form1.Caption = "Double Click to Print Form And Text"
 
 
' The following *optional* code illustrates creating a persistent
' bitmap that will successfully StretchBlt to the printer.
    Picture1.AutoRedraw = -1  ' Create persistent bitmap of picture
                              ' contents.
    Picture1.Line (0, 0)-(Picture1.ScaleWidth / 2,
    Picture1.ScaleHeight / 2), , BF
    Picture1.AutoRedraw = 0   ' Toggle off.
 
' Make sure the temporary workspace picture is invisible.
    Picture2.visible = 0
End Sub
 
4. Add the following code to the general procedure level of the form:
 
Sub FormPrint (localname As Form)
' Display cross.
    screen.MousePointer = 2
' Calculate ratio between ScaleMode twips and ScaleMode pixel.
 
    localname.ScaleMode = PIXEL
    ModeRatio = localname.height \ localname.ScaleHeight
    localname.ScaleMode = TWIPS
 
XOffset = (localname.width - localname.ScaleWidth) \ ModeRatio
YOffset = (localname.height - localname.ScaleHeight) \ ModeRatio
CapSize% = GetSystemMetrics(SM_CYCAPTION) ' The height of the caption.
 
  ' The size of the fixed single border:
FudgeFactor% = GetSystemMetrics(SM_CYBORDER)
' The fudgefactor is due to inevitable mapping errors when converting
' logical pixels to screen pixels. This example is coded for 640X480
' screen resolution. For 800X600, remove the fudgefactor.
 
' For other resolutions, tweak for perfection!
 
Select Case localname.BorderStyle
Case 0      ' None.
        XOffset = 0
        YOffset = 0
Case 1      ' Fixed Single.
        XOffset = GetSystemMetrics(SM_CXBORDER)
        YOffset = GetSystemMetrics(SM_CYBORDER) + CapSize% - FudgeFactor%
Case 2      ' Sizeable.
        XOffset = GetSystemMetrics(SM_CXFRAME)
        YOffset = GetSystemMetrics(SM_CYFRAME) + CapSize% - FudgeFactor%
Case 3      ' Fixed Double.
        XOffset = GetSystemMetrics(SM_CXDLGFRAME) + FudgeFactor%
        YOffset = GetSystemMetrics(SM_CYDLGFRAME) + CapSize%
 
End Select
 
' Size the picture to the size of the form's non-client (complete)
' area.
   Picture2.Move 0, 0, localname.Width, localname.Height
 
' NOTE: Bitblt requires coordinates in pixels.
   Picture2.ScaleMode = PIXEL
' Clear Picture property of any previous BitBlt image.
   Picture2.Picture = LoadPicture("" )
' -1 equals true: Must Have This!!!
   Picture2.AutoRedraw = -1
' Assign information of the destination bitmap.
   hDestDC% = Picture2.hDC
        X% = 0: Y% = 0
        nWidth% = Picture2.ScaleWidth
        nHeight% = Picture2.ScaleHeight
 
' Assign information of the source bitmap.
 
' Source is entire client area of form (plus non-client area)
' XOffset and YOffset settings depend on the BorderStyle chosen for
' the form.
        hSrcDC% = localname.hDC
        XSrc% = -XOffset: YSrc% = -YOffset
' Show transition to BitBlt by changing MousePointer.
   Screen.MousePointer = 4
' Assign the SRCCOPY constant to the Raster operation.
   dwRop& = SRCCOPY
   ' The following statement must appear on one line.
   Suc% = BitBlt(hDestDC%, X%, Y%, nWidth%, nHeight%, hSrcDC%, XSrc%,
                YSrc%, dwRop&)
 
' Start the StretchBlt process now.
 
' Assign persistent bitmap to Picture property:
   Picture2.Picture = Picture2.Image
' StretchBlt requires pixel coordinates.
       Picture2.ScaleMode = PIXEL
       Printer.ScaleMode = PIXEL
' * The following is an example of mixing text with StretchBlt.
       Printer.Print "This is a test of adding text and bitmaps "
       Printer.Print "This is a test of adding text and bitmaps "
       Printer.Print "This is a test of adding text and bitmaps "
' * If no text is printed in this procedure,
' * then you must add minimum: Printer.Print " "
' * to initialize Printer.hDC.
 
' Now display hour glass for the StretchBlt to printer.
 
   screen.MousePointer = 11
 
   hMemoryDC% = CreateCompatibleDC(Picture2.hDC)
   hOldBitMap% = SelectObject(hMemoryDC%, Picture2.Picture)
' You adjust the vertical stretch factor of the form in the
' argument "Printer.ScaleHeight - 1000":
   ApiError% = StretchBlt(Printer.hDC, 0, 192,
               Printer.ScaleWidth - 300, Printer.ScaleHeight - 1000,
               hMemoryDC%, 0, 0, Picture2.ScaleWidth,
               Picture2.ScaleHeight, SRCCOPY)  ' concatenate above
' The second parameter above allows for text already printed: modify
' accordingly.
 
   hOldBitMap% = SelectObject(hMemoryDC%, hOldBitMap%)
   ApiError% = DeleteDC(hMemoryDC%)
' * The following is an example of mixing text with StretchBlt.
' Set the printer currentY to allow for the size of the StretchBlt
' image. (This is relative to size of form and stretch factors chosen)
       Printer.currentY = 2392 ' In Twips.
       Printer.Print "This is for text after the StretchBlt"
       Printer.Print "This is for text after the StretchBlt"
       Printer.Print "This is for text after the StretchBlt"
   Printer.EndDoc
   ApiError% = Escape(Printer.hDC, NEWFRAME, 0, NILL, NILL)
 
 
' Reset MousePointer to default.
   Screen.MousePointer = 1
End Sub
 
5. Add the following code to the Double_Click event:
 
Sub Form_DblClick ()
   FormPrint Form1
End Sub
 
6. After saving the project, run the example.
 
Double-click the form to invoke the FormPrint procedure. Any form
passed as a parameter to FormPrint will be printed. BitBlt will
transfer the image to the Picture control, then StretchBlt transfers
it to the printer DC, which will print the image that was transferred
by BitBlt.
 
Optionally, you could place text or graphics in the picture
(Form1.Picture2) before printing with StretchBlt or print directly
to the page using Printer.Print or Printer.Line. If you choose the
latter method, by adjusting the second and third parameters of
 
StretchBlt, you can make the already printed content be followed by
the image of the form on the same page.
 
REFERENCES
==========
 
"Microsoft Windows Programmer's Reference Book and Online Resource"
(Add-on kit number 1-55615-413-5)
 
Additional reference words: 1.00 2.00 3.00
KBCategory: kbprint kbprg kbcode
KBSubcategory: APrgPrint
 
Copyright 1993 Microsoft Corporation. All rights reserved.
 

Reply

Marsh Posté le 12-10-2002 à 13:55:46    

carbon_14 a écrit a écrit :

Ca y est, ai fini.
Ai fouillé dans ma boîte de pandore VB3/API. Y a article Krosoft sur ça. Cf ce qui peut être utile.
 
How to Print Entire VB Form and Control the Printed Size
Article ID: Q84066
 
----------------------------------------------------------------------
The information in this article applies to:
 
- Standard and Professional Editions of Microsoft Visual Basic for
  Windows, versions 2.0 and 3.0 (et sans doute les autres ?)
- Microsoft Visual Basic programming system for Windows, version 1.0
----------------------------------------------------------------------
 
SUMMARY
=======
 
The Visual Basic for Windows PrintForm method provides a way to print
the client area of a form. However, PrintForm does not allow you to
control the size or proportion of the printed output, or to print the
non-client area (the caption and border) of the form.
 
The following code example uses Windows API functions to print the
entire form, and provides a method to control the size of the output.
This method can also be used to print only the client area to a
specific size and to control the position of the printed form to allow
text or other graphics to be printed on the same page as the image of
the form. The method is also applicable to printing all the forms in a
project.
 
NOTE: This example will not work correctly on PostScript printers.
 
For the example to work correctly, the printer must use a standard
non-PostScript laser printer configuration (such as PCL/HP).
 
MORE INFORMATION
================
 
Combining the Windows API functions BitBlt, StretchBlt,
CreateCompatibleDC, DeleteDC, SelectObject, and Escape allows greater
control over the placement and size of the printed form than the
PrintForm method. In a two-part process, the image of the entire form
is captured by using BitBlt to make an invisible picture, and is
turned into a persistent bitmap using the AutoRedraw property. Then
the picture is printed using the method of printing a picture control
(outlined in a separate article, found by querying for the following
word in the Microsoft Knowledge Base):
 
   CreateCompatibleDC
 
 
This method works on maximized forms as well as any smaller forms.
The use of GetSystemMetrics allows a general procedure to handle
different window border styles passed to it by querying the video
driver for the size of windows standard borders in pixels.
 
The example below requires a single form with an invisible picture
control.
 
Example
-------
 
1. Add the following code to the general Declarations level of the
   form in a new project:
 
   NOTE: All Declare statements below must be on one line each.
 
DefInt A-Z
Declare Function BitBlt Lib "gdi" (ByVal hDestDC, ByVal X, ByVal Y,
         ByVal nWidth, ByVal nHeight, ByVal hSrcDC, ByVal XSrc,
         ByVal YSrc, ByVal dwRop&)
Declare Function CreateCompatibleDC Lib "GDI" (ByVal hDC)
 
Declare Function SelectObject Lib "GDI" (ByVal hDC, ByVal hObject)
Declare Function StretchBlt Lib "GDI" (ByVal hDC, ByVal X, ByVal Y,
         ByVal nWidth, ByVal nHght, ByVal hSrcDC, ByVal XSrc,
         ByVal YSrc, ByVal nSrcWidth, ByVal nSrcHeight, ByVal dwRop&)
Declare Function DeleteDC Lib "GDI" (ByVal hDC)
Declare Function Escape Lib "GDI" (ByVal hDC, ByVal nEscape,
         ByVal nCount, lplnData As Any, lpOutData As Any)
Declare Function GetSystemMetrics Lib "User" (ByVal nIndex)
 
Const SM_CYCAPTION = 4
Const SM_CXBORDER = 5
Const SM_CYBORDER = 6
Const SM_CXDLGFRAME = 7
Const SM_CYDLGFRAME = 8
Const SM_CXFRAME = 32
Const SM_CYFRAME = 33
 
Const TWIPS = 1
 
Const PIXEL = 3
Const NILL = 0&
Const SRCCOPY = &HCC0020
Const NEWFRAME = 1
 
Dim ModeRatio, XOffset, YOffset As Integer
 
2. Set the following properties at design time:
 
   Control         Property      Setting
   -------         --------      -------
   Form1           Name          Form1 (default)
   Form1.Picture1  Name          Picture1 (default)
   Form1.Picture2  Name          Picture2 (default)
   Form1.File1     Name          File1 (default)
 
   (In Visual Basic version 1.0 for Windows, set the CtlName/FormName
    Property for the above objects instead of the Name property.)
 
You can add any other control(s) to the form to print. If a picture
 
control is drawn at run time, be sure to set its AutoRedraw property
to True so that the graphics will be transferred by the Windows API
call BitBlt and eventually printed by StretchBlt.
 
3. Add the following code to the Form_Load procedure of Form1:
 
Sub Form_Load ()
' Size the form explicitly to match parameters of StretchBlt.
' Or use design time size to set coordinates.
        Form1.Move 1095, 1200, 8070, 5280
 
' Size two example controls.
        File1.Move 4080, 120, 2775, 2535
        Picture1.Move 240, 120, 2775, 2535
 
' Put up a caption to indicate how to print the form.
    Form1.Caption = "Double Click to Print Form And Text"
 
 
' The following *optional* code illustrates creating a persistent
' bitmap that will successfully StretchBlt to the printer.
    Picture1.AutoRedraw = -1  ' Create persistent bitmap of picture
                              ' contents.
    Picture1.Line (0, 0)-(Picture1.ScaleWidth / 2,
    Picture1.ScaleHeight / 2), , BF
    Picture1.AutoRedraw = 0   ' Toggle off.
 
' Make sure the temporary workspace picture is invisible.
    Picture2.visible = 0
End Sub
 
4. Add the following code to the general procedure level of the form:
 
Sub FormPrint (localname As Form)
' Display cross.
    screen.MousePointer = 2
' Calculate ratio between ScaleMode twips and ScaleMode pixel.
 
    localname.ScaleMode = PIXEL
    ModeRatio = localname.height \ localname.ScaleHeight
    localname.ScaleMode = TWIPS
 
XOffset = (localname.width - localname.ScaleWidth) \ ModeRatio
YOffset = (localname.height - localname.ScaleHeight) \ ModeRatio
CapSize% = GetSystemMetrics(SM_CYCAPTION) ' The height of the caption.
 
  ' The size of the fixed single border:
FudgeFactor% = GetSystemMetrics(SM_CYBORDER)
' The fudgefactor is due to inevitable mapping errors when converting
' logical pixels to screen pixels. This example is coded for 640X480
' screen resolution. For 800X600, remove the fudgefactor.
 
' For other resolutions, tweak for perfection!
 
Select Case localname.BorderStyle
Case 0      ' None.
        XOffset = 0
        YOffset = 0
Case 1      ' Fixed Single.
        XOffset = GetSystemMetrics(SM_CXBORDER)
        YOffset = GetSystemMetrics(SM_CYBORDER) + CapSize% - FudgeFactor%
Case 2      ' Sizeable.
        XOffset = GetSystemMetrics(SM_CXFRAME)
        YOffset = GetSystemMetrics(SM_CYFRAME) + CapSize% - FudgeFactor%
Case 3      ' Fixed Double.
        XOffset = GetSystemMetrics(SM_CXDLGFRAME) + FudgeFactor%
        YOffset = GetSystemMetrics(SM_CYDLGFRAME) + CapSize%
 
End Select
 
' Size the picture to the size of the form's non-client (complete)
' area.
   Picture2.Move 0, 0, localname.Width, localname.Height
 
' NOTE: Bitblt requires coordinates in pixels.
   Picture2.ScaleMode = PIXEL
' Clear Picture property of any previous BitBlt image.
   Picture2.Picture = LoadPicture("" )
' -1 equals true: Must Have This!!!
   Picture2.AutoRedraw = -1
' Assign information of the destination bitmap.
   hDestDC% = Picture2.hDC
        X% = 0: Y% = 0
        nWidth% = Picture2.ScaleWidth
        nHeight% = Picture2.ScaleHeight
 
' Assign information of the source bitmap.
 
' Source is entire client area of form (plus non-client area)
' XOffset and YOffset settings depend on the BorderStyle chosen for
' the form.
        hSrcDC% = localname.hDC
        XSrc% = -XOffset: YSrc% = -YOffset
' Show transition to BitBlt by changing MousePointer.
   Screen.MousePointer = 4
' Assign the SRCCOPY constant to the Raster operation.
   dwRop& = SRCCOPY
   ' The following statement must appear on one line.
   Suc% = BitBlt(hDestDC%, X%, Y%, nWidth%, nHeight%, hSrcDC%, XSrc%,
                YSrc%, dwRop&)
 
' Start the StretchBlt process now.
 
' Assign persistent bitmap to Picture property:
   Picture2.Picture = Picture2.Image
' StretchBlt requires pixel coordinates.
       Picture2.ScaleMode = PIXEL
       Printer.ScaleMode = PIXEL
' * The following is an example of mixing text with StretchBlt.
       Printer.Print "This is a test of adding text and bitmaps "
       Printer.Print "This is a test of adding text and bitmaps "
       Printer.Print "This is a test of adding text and bitmaps "
' * If no text is printed in this procedure,
' * then you must add minimum: Printer.Print " "
' * to initialize Printer.hDC.
 
' Now display hour glass for the StretchBlt to printer.
 
   screen.MousePointer = 11
 
   hMemoryDC% = CreateCompatibleDC(Picture2.hDC)
   hOldBitMap% = SelectObject(hMemoryDC%, Picture2.Picture)
' You adjust the vertical stretch factor of the form in the
' argument "Printer.ScaleHeight - 1000":
   ApiError% = StretchBlt(Printer.hDC, 0, 192,
               Printer.ScaleWidth - 300, Printer.ScaleHeight - 1000,
               hMemoryDC%, 0, 0, Picture2.ScaleWidth,
               Picture2.ScaleHeight, SRCCOPY)  ' concatenate above
' The second parameter above allows for text already printed: modify
' accordingly.
 
   hOldBitMap% = SelectObject(hMemoryDC%, hOldBitMap%)
   ApiError% = DeleteDC(hMemoryDC%)
' * The following is an example of mixing text with StretchBlt.
' Set the printer currentY to allow for the size of the StretchBlt
' image. (This is relative to size of form and stretch factors chosen)
       Printer.currentY = 2392 ' In Twips.
       Printer.Print "This is for text after the StretchBlt"
       Printer.Print "This is for text after the StretchBlt"
       Printer.Print "This is for text after the StretchBlt"
   Printer.EndDoc
   ApiError% = Escape(Printer.hDC, NEWFRAME, 0, NILL, NILL)
 
 
' Reset MousePointer to default.
   Screen.MousePointer = 1
End Sub
 
5. Add the following code to the Double_Click event:
 
Sub Form_DblClick ()
   FormPrint Form1
End Sub
 
6. After saving the project, run the example.
 
Double-click the form to invoke the FormPrint procedure. Any form
passed as a parameter to FormPrint will be printed. BitBlt will
transfer the image to the Picture control, then StretchBlt transfers
it to the printer DC, which will print the image that was transferred
by BitBlt.
 
Optionally, you could place text or graphics in the picture
(Form1.Picture2) before printing with StretchBlt or print directly
to the page using Printer.Print or Printer.Line. If you choose the
latter method, by adjusting the second and third parameters of
 
StretchBlt, you can make the already printed content be followed by
the image of the form on the same page.
 
REFERENCES
==========
 
"Microsoft Windows Programmer's Reference Book and Online Resource"
(Add-on kit number 1-55615-413-5)
 
Additional reference words: 1.00 2.00 3.00
KBCategory: kbprint kbprg kbcode
KBSubcategory: APrgPrint
 
Copyright 1993 Microsoft Corporation. All rights reserved.
 
 




 
 
ok, alors j'v essayé ca! merci! juste une question, c koi scaleheight? ou plutot, c koi la différence entre height et scaleheight? height c la taille réel de la fenêtre et scaleheight c la taille imprimée, c un truc kom ca?
a+!

Reply

Marsh Posté le 12-10-2002 à 22:24:44    

J'ai pas trop regardé les détails, because des tas de trucs sur le feu. Ca doit être qq chose comme ça. Faut essayer de faire des variations voir ce que ça change ... :D  
 
Mon module d'impression en C date d'au moins deux ans => j'ai plus les détails en mémoire. Si moment un jour :(, je regarde.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed