我用PRINTER打印
开发环境是DELPHI4+XP+网络打印机代码入下procedure TForm1.Button1Click(Sender: TObject);
var
Device : array[0..255] of char;
Driver : array[0..255] of char;
Port : array[0..255] of char;
hDMode : THandle;
PDMode : PDEVMODE;
i:integer;
begin
i:=0;
  i:=GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX);{页左边距X}  i:=GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY);{页上边距y}  i:=GetDeviceCaps(Printer.Handle, PHYSICALWIDTH); {物理页宽度}  i:=GetDeviceCaps(Printer.Handle, PHYSICALHEIGHT); {物理页高度}Printer.PrinterIndex := Printer.PrinterIndex;
Printer.GetPrinter(Device, Driver, Port, hDMode);
if hDMode <> 0 then begin
pDMode := GlobalLock(hDMode);
if pDMode <> nil then begin{Set to legal}
pDMode^.dmFields := pDMode^.dmFields or dm_PaperSize;
pDMode^.dmPaperSize := DMPAPER_LEGAL;{Set to custom size}
pDMode^.dmFields := pDMode^.dmFields or
DM_PAPERSIZE or
DM_PAPERWIDTH or
DM_PAPERLENGTH;
pDMode^.dmPaperSize := DMPAPER_USER;
pDMode^.dmPaperWidth := 1000 {SomeValueInTenthsOfAMillimeter};
pDMode^.dmPaperLength := 1000 {SomeValueInTenthsOfAMillimeter};{Set the bin to use}
pDMode^.dmFields := pDMode^.dmFields or DMBIN_MANUAL;
pDMode^.dmDefaultSource := DMBIN_MANUAL;GlobalUnlock(hDMode);
end;
end;
Printer.PrinterIndex := Printer.PrinterIndex;
Printer.BeginDoc;
Printer.Canvas.TextOut(800,800, 'Test 8000');
Printer.Canvas.TextOut(1500,2500, 'Test 2500');
Printer.EndDoc;
end;照理说应该一个字打的出来一个字打不出来,不过2个字都打的出来,不清楚是为什么。
顺便问一句,如果我要自定义页边距,那又该怎么办呢,谢谢了

解决方案 »

  1.   

    在VC中PRINTDLG pd;
    ZeroMemory(&pd, sizeof(PRINTDLG));
    AfxGetApp()->GetPrinterDeviceDefaults(&pd);DEVMODE* pDevMode = (LPDEVMODE) ::GlobalLock(pd.hDevMode);
      // HDEVMODE实际上就是指向DEVMODE结构的一个指针。pDevMode->dmOrientation = DMORIENT_LANDSCAPE;
    pDevMode->dmPaperSize   = 0;
      // 有许多定定好的纸型:
      // DMPAPER_LETTER  Letter, 8 1/2- by 11-inches
      // DMPAPER_LEGAL   Legal, 8 1/2- by 14-inches
      // DMPAPER_A4      A4 Sheet, 210- by 297-millimeters
      // 等等等等pDevMode->dmPaperLength = xxxx (in millimeters);
    pDevMode->dmPaperWidth  = xxxx (in millimeters);GlobalUnlock(pd.hDevMode);当然,DEVMODE里还有好多可以设定的成员,取得了pDevMode,想改什么就改什么吧。typedef struct _devicemode {    // dvmd  
        BCHAR  dmDeviceName[CCHDEVICENAME]; 
        WORD   dmSpecVersion; 
        WORD   dmDriverVersion; 
        WORD   dmSize; 
        WORD   dmDriverExtra; 
        DWORD  dmFields; 
        short  dmOrientation; 
        short  dmPaperSize; 
        short  dmPaperLength; 
        short  dmPaperWidth; 
        short  dmScale; 
        short  dmCopies; 
        short  dmDefaultSource; 
        short  dmPrintQuality; 
        short  dmColor; 
        short  dmDuplex; 
        short  dmYResolution;     short  dmTTOption; 
        short  dmCollate; 
        BCHAR  dmFormName[CCHFORMNAME]; 
        WORD  dmLogPixels; 
        DWORD  dmBitsPerPel; 
        DWORD  dmPelsWidth; 
        DWORD  dmPelsHeight; 
        DWORD  dmDisplayFlags; 
        DWORD  dmDisplayFrequency; 
    #if(WINVER >= 0x0400) 
        DWORD  dmICMMethod;         // Windows 95 only 
        DWORD  dmICMIntent;         // Windows 95 only 
        DWORD  dmMediaType;         // Windows 95 only 
        DWORD  dmDitherType;        // Windows 95 only     DWORD  dmReserved1;         // Windows 95 only 
        DWORD  dmReserved2;         // Windows 95 only 
    #endif /* WINVER >= 0x0400 */ 
    } DEVMODE;