VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 696|回复: 2

打印机设置纸张的函数,运行后没有作用

[复制链接]

1

主题

3

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-1-20 14:40:02 | 显示全部楼层 |阅读模式
{X=2290,Y=2970 每次运行后打印机就定位到了Letter纸张,甚是郁闷,希望大家指点!!!}
procedure SetPaperSize(X, Y: Integer);
var
  Device: array[0..255] of char;
  Driver: array[0..255] of char;
  Port: array[0..255] of char;
  hDMode: THandle;
  PDMode: PDEVMODE;
begin
    Printer.PrinterIndex := Printer.PrinterIndex;
    Printer.GetPrinter(Device,Driver,Port,hDMode);
    // 获取打印机DevMode 结构的句柄值,存放在hDMode 中
    if hDMode<>0 then begin
       pDMode := GlobalLock(hDMode);
       // 获取指向打印机DevMode 结构的// 指针
       if pDMode <> nil then begin
          pDMode^.dmPaperSize := 256;
          // 如果要将当前打印机纸张变为自定义,dmPaperSize 必须设置成256
          pDMode^.dmPaperLength := X;
          pDMode^.dmPaperWidth := Y;
          pDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE;
          pDMode^.dmFields := pDMode^.dmFields or DM_PAPERLENGTH;
          pDMode^.dmFields := pDMode^.dmFields or DM_PAPERWIDTH;
          {以上三条语句是对相应的dmFields 成员进行置位。}
          ResetDC(Printer.Handle,pDMode^);

          // 设置打印机设备环境句柄的值
          GlobalUnlock(hDMode);
          //以下开始打印
       end;
    end;
    Printer.PrinterIndex := Printer.PrinterIndex;
end;
回复

使用道具 举报

1

主题

3

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2020-7-30 00:15:01 | 显示全部楼层
自定义纸张我用的API。但是发现Textout(x,y,str)打印函数在打印效果上,有些差异:
   同样的x,y,str参数,用A3打印的位置和我用自己定义的纸张打印的位置上下相差5毫米的样子。是不是纸张自定义的时候还要设置它的上边距阿(纸张有上边距的说法吗?)?
回复

使用道具 举报

1

主题

3

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2020-7-30 06:45:02 | 显示全部楼层
如果自定义纸张实在是不行,那能不能用代码动态选中A3的纸张去打印呢?
网上快找遍了,都没有动态选纸类型的代码!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表