如何修改使用 DocumentProperties() 函数的打印机设置

DEVMODE 结构如记录由 Win 32 SDK 包含公共或"设备独立数据"和专用或"设备相关数据。 在 DEVMODE 的专用部分存在紧跟公共由 DEVMODE 结构的内存的连续缓冲区中定义的部分。

程序不能预测此缓冲区的大小,因为它是打印机驱动程序的不同打印机并从版本的打印机。 此外,一个程序只是声明的 DEVMODE 结构没有足够空间的专用设备数据。 如果缺少专用数据的 DEVMODE 缓冲区传递给函数 (如 CreateDC() ResetDC() DocumentProperties() ,可能会失败,函数。

若要可靠地的设备驱动程序中使用一个 DEVMODE,创建,并按以下步骤修改:

  1. 确定所需从该的设备缓冲区的大小,并且然后会为其分配足够的内存。

    DocumentProperties() 返回最后一个参数设置为 0 时所需的 DEVMODE 缓冲区字节的数。 本文中的示例代码使用此技术确定正确缓冲区的大小。 然后,示例代码使用 C 运行时内存分配函数的 malloc() 分配足够大的缓冲区。 因为 DocumentProperties() 和功能 (如 ResetDC() CreateDC() 采取作为参数的 DEVMODE 的指针,大多数应用程序可以分配的指针的内存。

    但是,函数如常见 PrintDlg() 接受所需为全局内存的句柄参数。 如果程序使用最终的 DEVMODE 缓冲区为这些函数的参数,它应分配使用 GlobalAlloc() 的内存,并获取指向使用 GlobalLock() 的缓冲区指针。
  2. 要求设备驱动程序初始化 DEVMODE 缓冲区使用默认设置。

    该示例代码将调用 DocumentProperties() 第二次初始化分配的缓冲区使用当前的默认设置。 DocumentProperties() 填充称为 pDevModeOutput 参数了打印机的当前设置 fMode 参数中传递 DM_OUT_BUFFER 命令时的缓冲区。
  3. 对在 DEVMODE 的公共部分进行更改请求设备驱动程序通过调用 DocumentProperties() 所做的更改合并在 DEVMODE 的专用部分。

    在初始化了在步骤 2 中的当前设置缓冲区后的代码示例对在 DEVMODE 的公共部分进行更改。 请参阅 Win32 SDK 文档的 DEVMODE 成员的说明。 此示例代码来确定是否可以使用方向和双面打印 (双面) 设置打印机,并相应地更改它们。

    注意 : 在 DEVMODE 的 dmFields 成员 A 标志并只表示打印机使用相关的结构成员。 打印机具有各种不同的物理特征,因此,可能只支持 DEVMODE 的记录功能的子集。 若要确定 DEVMODE 的字段的受支持的设置,应用程序应使用 DeviceCapabilities()

    该示例代码然后使第三个调用 DocumentProperties() ,pDevModeInput 和 pDevModeOutput 参数中传递 DEVMODE 缓冲区。 它还使用 OR("|") 运算符传递 DM_IN_BUFFER 和 DM_OUT_BUFFER fMode 参数中合并的命令。 这些命令告诉函数需要输入缓冲区中包含任何设置,并合并它们使用当前设置为该设备。 然后它会结果写入到输出参数中指定的缓冲区。

注意 DocumentProperties() 指向特定打印机的打印机句柄: hPrinter。 从 OpenPrinter() ,它还阐释了示例代码获取此句柄。 OpenPrinter() 需要一个打印机通常是友好名称打印机的操作系统的外壳程序中显示的名称。 从 EnumPrinters() 、 返回 PrintDlg() DEVNAMES 结构或默认打印机,可以获取此名称。

有关默认打印机单击下面的文章编号,以查看 Microsoft 知识库中的相应:

246772  (http://support.microsoft.com/kb/246772/EN-US/ ) 如何检索并在 Windows 中设置默认打印机

注意 : 在这篇文章,分配缓冲区的正确的大小和初始化该缓冲区的前两个步骤执行与 DocumentProperties() 。 您也可以使用 GetPrinter() 按照这些步骤。 有关其他信息和这种示例,请单击下面该文章编号,以查看 Microsoft 知识库中相应:

140285  (http://support.microsoft.com/kb/140285/EN-US/ ) 如何使用 SetPrinter 修改打印机设置

示例代码

<script type="text/javascript"></script> 示例代码遵循以下三个的步骤,有关获得和更改 DEVMODE 缓冲区。 该函数采用指定的打印机,并配置它支持这些功能的情况下打印双面和以横向方向的 DEVMODE。 返回到调用方的该结果 DEVMODE 是适用于使用 DEVMODE 缓冲区如 CreateDC() SetPrinter() PrintDlg() ResetDC() 的其他 API 调用。 当调用方完成使用 DEVMODE 缓冲区时, 调用方负责释放内存。

   LPDEVMODE GetLandscapeDevMode(HWND hWnd, char *pDevice)
   {

   HANDLE      hPrinter;
   LPDEVMODE   pDevMode;
   DWORD       dwNeeded, dwRet;

   /* Start by opening the printer */ 
   if (!OpenPrinter(pDevice, &hPrinter, NULL))
       return NULL;

   /*
    * Step 1:
    * Allocate a buffer of the correct size.
    */ 
   dwNeeded = DocumentProperties(hWnd,
       hPrinter,       /* Handle to our printer. */ 
       pDevice,        /* Name of the printer. */ 
       NULL,           /* Asking for size, so */ 
       NULL,           /* these are not used. */ 
       0);             /* Zero returns buffer size. */ 
   pDevMode = (LPDEVMODE)malloc(dwNeeded);

   /*
    * Step 2:
    * Get the default DevMode for the printer and
    * modify it for your needs.
    */ 
   dwRet = DocumentProperties(hWnd,
       hPrinter,
       pDevice,
       pDevMode,       /* The address of the buffer to fill. */ 
       NULL,           /* Not using the input buffer. */ 
       DM_OUT_BUFFER); /* Have the output buffer filled. */ 
   if (dwRet != IDOK)
   {
       /* If failure, cleanup and return failure. */ 
       free(pDevMode);
       ClosePrinter(hPrinter);
       return NULL;
   }

   /*
        * Make changes to the DevMode which are supported.
    */ 
   if (pDevMode->dmFields & DM_ORIENTATION)
   {
       /* If the printer supports paper orientation, set it.*/ 
       pDevMode->dmOrientation = DMORIENT_LANDSCAPE;
   }

   if (pDevMode->dmFields & DM_DUPLEX)
    {
       /* If it supports duplex printing, use it. */ 
       pDevMode->dmDuplex = DMDUP_HORIZONTAL;
   }

   /*
    * Step 3:
    * Merge the new settings with the old.
    * This gives the driver an opportunity to update any private
    * portions of the DevMode structure.
    */ 
    dwRet = DocumentProperties(hWnd,
       hPrinter,
       pDevice,
       pDevMode,       /* Reuse our buffer for output. */ 
       pDevMode,       /* Pass the driver our changes. */ 
       DM_IN_BUFFER |  /* Commands to Merge our changes and */ 
       DM_OUT_BUFFER); /* write the result. */ 

   /* Finished with the printer */ 
   ClosePrinter(hPrinter);

   if (dwRet != IDOK)
   {
       /* If failure, cleanup and return failure. */ 
       free(pDevMode);
       return NULL;
   }

   /* Return the modified DevMode structure. */ 
   return pDevMode;

   }
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
API之网络函数1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同一个网络资源的连接 WNetCancelConnection 结束一个网络连接 WNetCancelConnection2 结束一个网络连接 WNetCloseEnum 结束一次枚举操作 WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接 WNetDisconnectDialog 启动一个标准对话框,以便断开同网络资源的连接 WNetEnumResource 枚举网络资源 WNetGetConnection 获取本地或已连接的一个资源的网络名称 WNetGetLastError 获取网络错误的扩展错误信息 WNetGetUniversalName 获取网络中一个文件的远程名称以及/或者UNC(统一命名规范)名称 WNetGetUser 获取一个网络资源用以连接的名字 WNetOpenEnum 启动对网络资源进行枚举的过程 2. API之消息函数 BroadcastSystemMessage 将一条系统消息广播给系统中所有的顶级窗口 GetMessagePos 取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置 GetMessageTime 取得消息队列中上一条消息处理完毕时的时间 PostMessage 将一条消息投递到指定窗口的消息队列 PostThreadMessage 将一条消息投递给应用程序 RegisterWindowMessage 获取分配给一个字串标识符的消息编号 ReplyMessage 答复一个消息 SendMessage 调用一个窗口的窗口函数,将一条消息发给那个窗口 SendMessageCallback 将一条消息发给窗口 SendMessageTimeout 向窗口发送一条消息 SendNotifyMessage 向窗口发送一条消息 3. API之文件处理函数 CloseHandle 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等 CompareFileTime 对比两个文件的时间 CopyFile 复制文件 CreateDirectory 创建一个新目录 CreateFile 打开和创建文件、管道、邮槽、通信服务、设备以及控制台 CreateFileMapping 创建一个新的文件映射对象 DeleteFile 删除指定文件 DeviceIoControl 对设备执行指定的操作 DosDateTimeToFileTime 将DOS日期和时间值转换成一个 win32 FILETIME 值 FileTimeToDosDateTime 将一个 win32 FILETIME 值转换成DOS日期和时间值 FileTimeToLocalFileTime 将一个FILETIME结构转换成本地时间 FileTimeToSystemTime 根据一个FILETIME结构的内容,装载一个SYSTEMTIME结构 FindClose 关闭由FindFirstFile函数创建的一个搜索句柄 FindFirstFile 根据文件名查找文件 FindNextFile 根据调用FindFirstFile函数时指定的一个文件名查找下一个文件 FlushFileBuffers 针对指定的文件句柄,刷新内部文件缓冲区 FlushViewOfFile 将写入文件映射缓冲区的所有数据都刷新到磁盘 GetBinaryType 判断文件是否可以执行 GetCompressedFileSize 判断一个压缩文件在磁盘上实际占据的字节数 GetCurrentDirectory 在一个缓冲区中装载当前目录 GetDiskFreeSpace 获取与一个磁盘的组织有关的信息,以及了解剩余空间的容量 GetDiskFreeSpaceEx 获取与一个磁盘的组织以及剩余空间容量有关的信息 GetDriveType 判断一个磁盘驱动器的类型 GetExpandedName 取得一个压缩文件的全名 GetFileAttributes 判断指定文件的属性 GetFileInformationByHandle 这个函数提供了获取文件信息的一种机制 GetFileSize 判断文件长度 GetFileTime 取得指定文件的时间信息 GetFileType 在给出文件句柄的前提下,判断文件类型 GetFileVersionInfo 从支持版本标记的一个模块里获取文件版本信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值