比如打印机现在的预设纸张是A4,现有一程序需要一个用户自定义类型如A2A,那么如何在程序中把打印机预设的A4改成A2A,请大家帮忙,谢谢.

解决方案 »

  1.   

    uses
      Windows,
      WinSpool,  //一定要 uses 这玩意
      SysUtils,
      Registry,
      Classes;
    //=================================
    function TForm1.GetDeviceName():String;
    var MyReg: TRegistry;
        szDeviceName: String;
    begin
      MyReg := TRegistry.Create;
      try
        MyReg.RootKey := HKEY_CURRENT_CONFIG;
        if MyReg.OpenKey('\System\CurrentControlSet\Control\Print\Printers',False) then
          szDeviceName:=MyReg.ReadString('Default')
        else
          szDeviceName:='';
      except
        MyReg.Free;
      end;
      result:=szDeviceName;
    end;//===================================
    function TForm1.GetPortName(): String;
    var MyReg: TRegistry;
        szPortName: String;
    begin
      MyReg := TRegistry.Create;
      try
        MyReg.RootKey := HKEY_LOCAL_MACHINE;
        if MyReg.OpenKey('\System\CurrentControlSet\Control\Print\Printers\'+GetDeviceName(),False) then
          szPortName:=MyReg.ReadString('Port')
        else
          szPortName:='';
      Except
        MyReg.Free;
      end;
      result:=szPortName;
    end;
    //================================
    //nOrient  打印方向
    //nHandle  打印机的Handle
    // 调用 SetPaperSize(2000,3000,1,printer.handle);
    // 调用后,修改系统的打印机的纸张大小的设置。 
    function TForm1.SetPaperSize(var nWidth,nHeight,nOrient:Word;var nHandle: THandle):integer; 
    var
    //  szPrinterKey: array[0..99] of Char;
      szDeviceName: String;
      szPort: String;
    //  cbBuffer: DWORD;
    //  dwRV: DWORD;
      dwPapers: DWord;
      lpwPapers: array[0..255] of Word;
      fSupportUserDefind: Boolean;
      fSupportA3: Boolean;
      fSupportA4: Boolean;
      fSupportB5: Boolean;
      hDriver: THandle;
      hMem: HGLOBAL;
      lpDevMode: Pdevicemode;
      a1: Pdevicemode;
      i: integer;
    begin
      fSupportUserDefind:=FALSE;
      fSupportA3:=FALSE;
      fSupportA4:=FALSE;
      fSupportB5:=FALSE;  //取当前默认打印机设备名
      szDeviceName:=GetDeviceName();
      if szDeviceName='' then
        result:=-1;  //取打印机端口
      szPort:=GetPortName();
      if szPort='' then
        result:=-2;  //取打印机支持的全部纸型
      dwPapers:=DeviceCapabilities(PChar(szDeviceName),PChar(szPort),DC_PAPERS,@lpwPapers,nil);
      if (dwPapers<1)or(dwPapers>256) then
          result:=-3;  //判断打印机是否支持自定义、A3、A4、B5纸型
      while (dwPapers > 0) do
      begin
        case DWORD(lpwPapers[dwPapers]) of
          DMPAPER_USER: fSupportUserDefind:=TRUE;
          DMPAPER_A3: fSupportA3:=TRUE;
          DMPAPER_A4: fSupportA4:=TRUE;
          DMPAPER_B5: fSupportB5:=TRUE;
        end;
        dwPapers:=dwPapers-1;
      end;  //取打印机的DeviceMode
      a1:=nil;
      if not(OpenPrinter(PChar(szDeviceName),hDriver,nil)) then result:=-4;
      hMem:=GlobalAlloc(GPTR,DocumentPropertiesA(nHandle,hDriver,PChar(szDeviceName),a1^,a1^,0));
      lpDevMode:=GlobalLock(hMem);
      a1:=nil;
      DocumentProperties(nHandle,hDriver,PChar(szDeviceName),lpDevMode^,a1^,DM_OUT_BUFFER);  //设置纸型或大小
      i:=0;
      if ((nWidth=2970)and(nHeight=4200))and(fSupportA3) then i:=1;
      if ((nWidth=2100)and(nHeight=2970))and(fSupportA4) then i:=i+2;
      if ((nWidth=1820)and(nHeight=2570))and(fSupportB5) then i:=i+3;  case i of
        1: begin    //A3
             lpDevMode.dmFields:=DM_PAPERSIZE;
             lpDevMode.dmPaperSize:=DMPAPER_A3;
           end;
        2: begin   //A4
             lpDevMode.dmFields:=DM_PAPERSIZE;
             lpDevMode.dmPaperSize:=DMPAPER_A4;
           end;
        3: begin   //B5
             lpDevMode.dmFields:=DM_PAPERSIZE;
             lpDevMode.dmPaperSize:=DMPAPER_B5;
           end;
        else
           if fSupportUserDefind then
           begin
             lpDevMode.dmFields:=DM_PAPERSIZE or DM_PAPERWIDTH or DM_PAPERLENGTH;
    lpDevMode.dmPaperSize:=DMPAPER_USER;
    lpDevMode.dmPaperWidth:=nWidth;
    lpDevMode.dmPaperLength:=nHeight;
           end
           else
             lpDevMode.dmFields:=0;
      end;  //设置方向
      case nOrient of
        0: begin
             lpDevMode.dmFields:=lpDevMode.dmFields or DM_ORIENTATION;
    lpDevMode.dmOrientation:=DMORIENT_PORTRAIT;
           end;
        1: begin
             lpDevMode.dmFields:=lpDevMode.dmFields or DM_ORIENTATION;
      lpDevMode.dmOrientation:=DMORIENT_LANDSCAPE;
           end;
      end;  a1:=nil;
      DocumentProperties(nHandle,hDriver,PChar(szDeviceName),a1^,lpDevMode^,DM_IN_BUFFER or DM_UPDATE);
      GlobalUnlock(hMem);
      GlobalFree(hMem);
      ClosePrinter(hDriver);  result:=1;
    end;