目前打印机的默认纸张始终为A4,我想改变为的自定义的纸张AAA(AAA为我自定义的纸张类型25cmX36cm)

解决方案 »

  1.   

    打开开始程序,进入设置选择打印机设置项,在打印机设置项中点右键,选择服务器属性,里面有个创建新格式,在格式描述中写入你的纸张格式AAA,然后设置你要的长和宽,然后保存!设置好了以后,在你的打印机属性中选择打印首选页,里面有个格式选择,你就可以选择你刚刚上面所设置的纸张类型!
      

  2.   

    环境:win2000 professional/delphi7
    要求:本地打印机/管理员权限登陆
    ----------------------------------------------
    var
      hP : Thandle;
      cReturned: DWORD;
    Const
      CustomFormName ='Self_FormName';
    ....Function TryOpenPrinter :Boolean;  //取得当前默认打印机句柄
    var
      PrintName : string;
      pPDef : PPrinterDefaults;
    begin
      Result:=False;
      GetMem(pPDef,SizeOf(_PRINTER_DEFAULTSA));
      pPDef^.pDatatype := nil;
      pPDef^.pDevMode := nil;
      pPDef^.DesiredAccess := PRINTER_ALL_ACCESS;
      PrintName := Printer.Printers[Printer.PrinterIndex];
      if WinSpool.OpenPrinter(PChar(PrintName),hP,pPDef) then
      Result:=True;
      FreeMem(pPdef);
    end;
    function TryAddForm(hPrinter : THandle; FormName : string;FormSize : TPoint) : Boolean;  //添加自定义CustomFormName 纸张类型
    var
      FormInfo : TFormInfo1;
      pForm: Pointer;
      cbNeeded: DWORD;
    begin
      Result := False;
      pForm := nil;
      EnumForms(hPrinter, 1, pForm, 0, cbNeeded, cReturned);
      GetMem(pForm, cbNeeded); //取pForm的大小并分配内存
      if EnumForms(hPrinter, 1, pForm, cbNeeded, cbNeeded, cReturned) then
      begin
        if DeleteForm(hPrinter, PChar(CustomFormName)) then
         Dec(cReturned); //删除旧的Form
      end;  FormInfo.Flags := 0;
      FormInfo.pName := Pchar(FormName);
      FormInfo.Size := TSize(FormSize);
      FormInfo.ImageableArea := Rect(0,0,FormSize.X,FormSize.Y);
      if AddForm(hPrinter,1,@FormInfo) then
        Result := True;
    end;Function TrySetPrinter:Boolean; //设置打印机
    var
      PInfo2 : Pointer;
      Need : DWORD;
    begin
      result:=False;
      WinSpool.GetPrinter(hP,2,nil,0,@Need);
      if Need>0 then
      begin
        GetMem(PInfo2,Need);
        if WinSpool.GetPrinter(hP,2,PInfo2,Need,@Need) then
        begin      TPrinterInfo2(PInfo2^).pDevMode.dmFields :=TPrinterInfo2(PInfo2^).pDevMode.dmFields or DM_FORMNAME or DM_PAPERSIZE;
       TPrinterInfo2(PInfo2^).pDevMode.dmPaperSize:=cReturned+1;
       if WinSpool.SetPrinter(hP,2,PInfo2,0) then
            result:=True;
        end else
        Result:=false;
        FreeMem(PInfo2);
      end;
    end;调用示范----------------------------------------------
    procedure TForm1.Button1Click(Sender: TObject);
    begin
       if Not TryOpenPrinter then Exit;
       if Not TryAddForm(hP,CustomFormName,Point(Width*100,Height*100)) then Exit;
       if Not TrySetPrinter then Exit;
       WinSpool.ClosePrinter(hp);
    end;