Help and Support

文章编号: 255744 - 最后修改: 2004年7月1日 - 修订: 2.2

如何获取的打印设备的设备上下文句柄

展开全部 | 关闭全部

概要

试图将输出直接发送到打印设备使用 StartDoc API 函数时, 则需要获取设备上下文句柄为打印设备。 本文介绍如何获取打印设备的一个设备上下文句柄。

更多信息

应用程序窗口的工作区需要显示设备上下文句柄 (hdc) 开始绘图之前。 同样前可以将输出发送到打印机,,打印设备需要特殊的打印机 hdc。 打印机 hdc 是内部数据结构,它定义了一组图形对象和其关联的属性,并指定在图形模式会影响输出的。 图形对象包括笔 (对于行绘图),一个画笔 (用于绘制和填充) 和是 (用于文本输出) 的字体。

了显示设备在 GetDC GetDCEx GetWindowDC 函数可以将用于返回一个 hdc,因为这些设备上下文拥有由 Windows 管理组件。 与一个显示设备上下文不同打印机设备上下文不负责该 Windows 管理组件,并不能获得对 GetDC GetDCEx GetWindowDC 函数的调用的。 相反,to 打印机设备上下文句柄的应用程序必须调用 CreateDC PrintDlg 函数。

CreateDC 函数接受以下参数:
收起该表格展开该表格
参数名称通过使用参数的数据
lpszDriver Windows NT: 指向指定显示驱动程序的显示或通常是 WINSPOOL 一个打印机驱动程序的名称的空终止字符串的指针。

Windows 95 和 Windows 98: 此参数将被忽略,除非该设备指定为空终止字符串显示应 NULL。 如果此参数是显示,所有其他参数必须为 NULL。
lpszDevice 指向指定特定的输出设备正在使用打印管理器所示名称的空终止字符串的指针。 必须使用 lpszDevice 参数。
lpszOutput 此参数将忽略基于 Win 32 应用程序,且应设置为 NULL。
lpInitData lpInitData 参数必须为 NULL,如果设备驱动程序使用由用户指定,默认值初始化 (如果有)。


下面的代码说明了创建打印设备的一个设备上下文句柄。

请注意此代码是有些复杂,工程师需要一些时间来熟悉该示例的内容。
* 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,保留所有权利。 由 John Desch,Microsoft Corporation 供稿。

参考

MSDN 帮助 * Platform SDK、 图形和多媒体服务,主题,CreateDC DeleteDC,TextOut,StartDoc,EndDoc,StartPage,EndPage

这篇文章中的信息适用于:
  • Microsoft Visual FoxPro 3.0 标准版
  • Microsoft Visual FoxPro 3.0b 标准版
  • Microsoft Visual FoxPro 5.0 标准版
  • Microsoft Visual FoxPro 5.0a
  • Microsoft Visual FoxPro 6.0 专业版
关键字:?
kbmt kbapi kbcodesnippet kbhowto kbprint KB255744 KbMtzh
机器翻译机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。如果您发现了错误并希望帮助我们提高机器翻译技术,请完成文章末尾的在线调查。
点击这里察看该文章的英文版: 255744? (http://support.microsoft.com/kb/255744/en-us/ )
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

文章翻译