本人可用分不多,只要是有建设性的答案,一定给分!
最近在搞一段设置打印机分辨率的代码。我们有一个自己的虚拟打印机,其实就是一个Unidrv打印机。这个打印机只支持
一系列固定的分辨率,例如:90*90, 120*120, 400*400, 900*900 等等我用SetPrinter API通过修改DEVMODE中的dmPrintQuality和dmYResolution两个字段来动态设置打印机分辨率。
不过,在程序中发现一个奇怪的现象:如果待设置进去的DPI值,不在上面那个“合法的”分辨率值范围内,例如:18,
SetPrinter居然也是返回成功的。并且,在SetPrinter之后,如果再次调用OpenPrinter去检查打印机的分辨率的话,
居然也是刚刚设置进去的那个值:18。但从打印机打印结果来看,它实际使用的分辨率肯定不是刚才设置进去的那个值。我查了MSDN,根本没有这样的解释。
我很想知道,(1) 如果我通过SetPrinter设置了不在打印机驱动程序支持之列的DPI值,打印机内部到底是怎么处理的?
                  会不会找一个最接近的值来代替?            (2) 既然设置进去的DPI值,不在驱动程序支持的范围内,为什么调用SetPrinter能成功;并且再次读取
                  打印机分辨率的话,居然也就是刚才设置进去的那个值?
                  SetPrinter的时候,其内部不会对分辨率的值做检查吗?
不知道上面的内容是否能说明问题。了解的朋友给想想办法,谢谢啊!

解决方案 »

  1.   

    没做过基于unidrv的打印机驱动。
    一般来说,应该检查你的打印机的DrvEnablePDEV函数,这个函数会根据DEVMODEW的设定,去初始化DEVINFO和GDIINFO两个结构,记录下surface的尺寸和DPI,在DrvEnableSurface的时候会根据这些参数去创建surface。
    如果DEVMODEW的设置,不在硬件的能力范围之内,一般会做一些转换,转换到最相近的参数上去,并不一定会报错。
      

  2.   

    你是直接用API吗?你设置的默认打印机对不对?
    建议用CPageSetupDialog或者CPrintDialog看一下,你系统选定的是不是你的虚拟打印机?
    用的CPageSetupDialog的话,选择了某一个打印机,则打印页面设置参数里只显示它所支持的页面大小。
      

  3.   


    是不是默认打印机没关系的,我不通过UI来设置。我在OpenPrinter的时候直接指定我们的虚拟打印机的名字,然后再用打开的Printer Handle去调用
    GetPrinter API,这样得到的DEVMODE里面就是我想要的那个打印机的信息了。
      

  4.   

    你们的打印机驱动是自己写的代码,还是仅仅写了一个gpd文件定制了一下?
      

  5.   


    差不多就是定制了,不过也不是整一个gpd文件就能搞定的。