DOCUMENT:Q255744 11-SEP-2001 [foxpro] TITLE :HOWTO: Obtain a Device Context Handle for a Print Device PRODUCT :Microsoft FoxPro PROD/VER:WINDOWS:3.0,3.0b,5.0,5.0a,6.0 OPER/SYS: KEYWORDS:kbprint kbAPI kbPrinting kbvfp300 kbvfp300b kbvfp500 kbvfp500a kbvfp600 kbGrpDSFox kbDS ====================================================================== ------------------------------------------------------------------------------- The information in this article applies to: - Microsoft Visual FoxPro for Windows, versions 3.0, 3.0b, 5.0, 5.0a, 6.0 ------------------------------------------------------------------------------- SUMMARY ======= When attempting to send output directly to a print device using the StartDoc API function, it is necessary to obtain a device context handle for the print device. This article explains how to obtain a device context handle for a print device. MORE INFORMATION ================ An application requires a display device context handle (hdc) before it can begin drawing in the client area of a window. Similarly, a print device requires a special printer hdc before it can begin sending output to a printer. A printer hdc is an internal data structure that defines a set of graphic objects and their associated attributes, and specifies the graphic modes that affect output. The graphic objects include a pen (for line drawing), a brush (for painting and filling), and a font (for text output). For a display device, the GetDC, GetDCEx, and GetWindowDC functions can be used to return an hdc, because those device contexts are owned by the windows management component. Unlike a display device context, printer device contexts are not owned by the windows management component, and cannot be obtained by calls to the GetDC, GetDCEx, or GetWindowDC functions. Instead, to obtain a handle to a printer device context, an application must call either the CreateDC or the PrintDlg function. The CreateDC function accepts the following parameters: +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Parameter Name | Data Passed with Parameter | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | lpszDriver | Windows NT: Pointer to a null-terminated character string that specifies either DISPLAY for a display driver, or the name of a printer driver, which is usually WINSPOOL. Windows 95 and Windows 98: This parameter is ignored and should be NULL, unless the device is specified as the null-terminated string DISPLAY. If this parameter is DISPLAY, all other parameters must be NULL. | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | lpszDevice | Pointer to a null-terminated character string that specifies the name of the specific output device being used, as shown by the Print Manager. The lpszDevice parameter must be used. | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | lpszOutput | This parameter is ignored for Win32-based applications and should be set to NULL. | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | lpInitData | The lpInitData parameter must be NULL if the device driver is to use the default initialization (if any) specified by the user. | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ The following code illustrates creating a device context handle for a print device. Please note that this code is somewhat complex, and engineers may require some time to familiarize themselves with the contents of the example. * Start of Code *!* Declare the CreateDC function DECLARE LONG CreateDC IN gdi32.DLL ; STRING @cDriver, STRING @cDevice, STRING cOutput, ; STRING cInitData *!* Declare the DeleteDC function DECLARE LONG DeleteDC IN gdi32.DLL ; LONG nDC *!* Declare the TextOut function DECLARE INTEGER TextOut IN gdi32.DLL INTEGER hDC, INTEGER xStart, INTEGER yStart, ; STRING @PrintString, INTEGER cbString *!* Declare the StartDoc function DECLARE INTEGER StartDoc IN gdi32.DLL INTEGER hDC, STRING @DocInfo *!* Declare the StartPage function DECLARE INTEGER StartPage IN gdi32.DLL INTEGER hDC *!* Declare the EndPage function DECLARE INTEGER EndPage IN gdi32.DLL INTEGER hDC *!* Declare the EndDoc function DECLARE INTEGER EndDoc IN gdi32.DLL INTEGER hDC *!* Declare the GetLastError function DECLARE INTEGER GetLastError IN kernel32.DLL *!* Allocate a buffer lcBuffer = SPACE(255) IF "5.0"$OS() *!* If the OS is 5.0, the driver is either DISPLAY or WINSPOOL lcDriver="WINSPOOL" ELSE *!* If the OS is Windows 9x, the driver is NULL lcDriver=NULL ENDIF *!* Get the name of the printer for which we want an HDC lcPrinter=GETPRINTER() hDC = CreateDC(lcDriver, lcPrinter, NULL, NULL) IF hDC = 0 MESSAGEBOX("Unable to create device context" + CHR(13) + ; "Error Code : " + ALLTRIM(STR(GetLastError())),48) RETURN ENDIF *!* Create a DOCINFO structure to pass to StartDoc lcDocInfo = Long2Str(20) + REPLICATE(CHR(0), 16) *!* Call StartDoc() retCode = StartDoc(hDC, @lcDocInfo) IF retCode <= 0 MESSAGEBOX("Error calling StartDoc" + CHR(13) + ; " Error code : " + ALLTRIM(STR(GetLastError())),48) RETURN ENDIF *!* Call StartPage() retCode = StartPage(hDC) IF retCode <= 0 MESSAGEBOX("Error calling StartPage" + CHR(13) + ; " Error code : " + ALLTRIM(STR(GetLastError())),48) RETURN ENDIF *!* Define a string to send to the print device myString = "Using API functions for printing" myLength = LEN(myString) *!* Call TextOut, first parameter is the device context handle *!* second parameter is x coordinate *!* third parameter is y coordinate *!* fourth parameter is the string, which is passed by reference *!* fifth parameter is the length of the string being passed retCode = TextOut(hDC, 10, 10, @myString, myLength) IF retCode <= 0 MESSAGEBOX("Error calling TextOut" + CHR(13) + ; " Error code : " + ALLTRIM(STR(GetLastError())),48) RETURN ENDIF *!* Done printing a page, so call EndPage() retCode = EndPage(hDC) IF retCode <= 0 MESSAGEBOX("Error calling EndPage" + CHR(13) + ; " Error code : " + ALLTRIM(STR(GetLastError())),48) RETURN ENDIF *!* Done printing a document, so call EndDoc() retCode = EndDoc(hDC) IF retCode <= 0 MESSAGEBOX("Error calling EndDoc" + CHR(13) + ; " Error code : " + ALLTRIM(STR(GetLastError())),48) RETURN ENDIF *!* Clear the DLLs from memory CLEAR DLLS FUNCTION Long2Str PARAMETERS m.longval PRIVATE i, m.retstr m.retstr = "" FOR i = 24 TO 0 STEP -8 m.retstr = CHR(INT(m.longval/(2^i))) + m.retstr m.longval = MOD(m.longval, (2^i)) NEXT RETURN m.retstr * End of Code (c) Microsoft Corporation 2000, All Rights Reserved. Contributions by John Desch, Microsoft Corporation. REFERENCES ========== MSDN Help, *Platform SDK, Graphics and Multimedia Services, Topics CreateDC, DeleteDC, TextOut, StartDoc, EndDoc, StartPage, EndPage Additional query words: ====================================================================== Keywords : kbprint kbAPI kbPrinting kbvfp300 kbvfp300b kbvfp500 kbvfp500a kbvfp600 kbGrpDSFox kbDSupport kbCodeSnippet Technology : kbVFPsearch kbAudDeveloper kbVFP300 kbVFP300b kbVFP500 kbVFP600 kbVFP500a Version : WINDOWS:3.0,3.0b,5.0,5.0a,6.0 Issue type : kbhowto ============================================================================= THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY. Copyright Microsoft Corporation 2001.