GENPRINT - Generalized Printer for VB

by Guinn Unger  
Unger Business Systems
11926 Barrett Brae
Houston, TX  77072-4004
Phone: (713) 498-8517  Fax: (713) 498-8518
Compuserve: Guinn Unger, 71053,2332

NOTE:
The GENPRINT setup routine was failing with a PostScript printer.  It
turns out that the dmout.dmDriverExtra must be set to 0 for PS printers
to initialize.  This change is hard-coded in the routine now.
(Note:  There is the potential that this could cause problems with
printer drivers which use the private data area.  This has not been
explored any further at this time.)

The GENPRINT forms and routines are designed to give the VB programmer
additional flexibility over using the VB PRINTER object.  The primary
advantages are:

	1.  The ability to abort the print job.  This is a significant
	shortcoming of the VB PRINTER object in some situations.

	2.  The ability to select/change printers without changing the
	Windows default printer.  This includes changing the printer
	orientation.

	3.  The ability to have more than one printer active.

GENPRINT consists of the following:

	1.  A form (GPRINTER.FRM) which acts as a dummy form and contains
	the CBK.VBX custom control.  This form is not actually necessary
	if the appropriate controls are present on another form.

	2.  A form (ABORTFOR.FRM) which is displayed while printing is in
	progress.  It contains a command button which is pressed to abort
	the print job.

	3.  A form (PRTSETUP.FRM) which mimics the dialog box used in 
	Microsoft Word.

	4.  A module (GPRINTER.BAS) which contains the various subs and
	functions which are called by the user.

	5.  A custom callback control (CBK.VBX) which is necessary for
	the abort function to work properly.  This custom control was
	supplied as part of Appleman's book and may be distributed
	freely.

General Procedure for using GENPRINT

	1.  The functions are called as follows:

            prhdc = GenPrinterSetup(ThisPrinter) 
		
		where prhdc is an integer which now contains the device 
		context for ThisPrinter.  ThisPrinter is a string of the
		form "HP LaserJet IIP,HPPCL,LPT1:" as stored in the
		WIN.INI file.  Note that prhdc is passed to virtually
		all of the other GENPRINT routines.  This routine as
		written call DefaultFontSetup and uses "Ariel" font in 
		10 pt size.

	    SetupDocInfo ("PROGNAME")

		This supplies the information used by Print Manager.

	    SetAbortCallback (prhdc)
		
		This sets up the abort procedure.

	    ShowAbortForm (False)  'must not be system modal

		This displays the abort form.

	    di = StartDocument(prhdc)

		This tells Print Manager that we are starting a document.

	    di = StartAPage(prhdc)

		Start a page!

	    PrintText prhdc, AString

    {There are numerous other functions which can now be called to draw
     lines, rectangles, etc.  The font can also be changed.  See the
     GPRINTER.BAS module for available functions.}

	    di = EndAPage(prhdc)

		This is called each time you want to end a page.  If
		more pages are to be printed, be sure to call StartAPage
		again.
   
	    di = EndDocument(prhdc)

		This tells Print Manager that the document is finished.
   
	    UnloadAbortForm

		Get rid of the abort form.

	   GenPrinterClose prhdc

		Clean up after printer.  After this call prhdc is no
		longer valid.

MISCELLANEOUS ROUTINES

	The ClipString and SplitLines routines were developed to allow the
user to clip or split a text string which might be too long to fit in a
given space.  The maximum length passed to each routine is in inches.  
ClipString simply trims the string to the maximum number of characters which
will fit in the given length.  Split lines parses the string into 3 separate
strings and throws away any extra.  (The number of strings could be increased
easily.)  Both routines take into account the current font size and other
characteristics.

OTHER INFORMATION

     Several routines are included which show information about the
DevMode structure, printers, fonts, etc.  Feel free to experiment
with these as you are using the routines.     

     These routines have primarily been tested with laser printers 
(300 dpi).  If you use them with other printers, be sure to test them 
carefully.  The routines seem to work fine with local and network printers.

     If would be relatively easy to add additional functions to the 
routines.  See Appleman's book for more information.
