procedure TForm1.Button1Click(Sender: TObject);
var
  Device: Array[0..(cchDeviceName -1)] of char;
  Driver: Array[0..(MAX_PATH -1)] of char;
  Port: Array[0..32] of char;
  HDMode : THandle;
  PDMode: PDevMode;
begin
  Printer.PrinterIndex :=  Printer.PrinterIndex ;  Printer.GetPrinter(Device,Driver,Port,HDMode);  if HDMode <> 0 then
  begin
    PDMode := GlobalLock(HDMode);    if PDMode <> nil then
    begin
      case pDMode.dmPaperSize of
        DMPAPER_USER: showmessage('纸张类型:自定义');
        DMPAPER_A3: showmessage('纸张类型:A3');
        DMPAPER_A4: showmessage('纸张类型:A4');
        DMPAPER_A5: showmessage('纸张类型:A5');
        DMPAPER_B4: showmessage('纸张类型:B4');
        DMPAPER_B5: showmessage('纸张类型:B5');
        else showmessage('纸张类型:其它');
      end;
      GlobalUnLock(HDMode);
      Printer.PrinterIndex := Printer.PrinterIndex;
    end;  end;
end;

解决方案 »

  1.   

    这个问题比较复杂,但是你可以mfc的例子,具体怎么做调API
        1。用TEXTMETRIC取出当前的字体参数
        2。打开你要打印的文件计算出在当前打印机环境下文件大小
        3。调用drawtext参数hdc指向printer
      

  2.   

    我不懂VC呀!towmwhs老兄,你说的我不懂原理,不知计算文件大小及有什么关系?
    输出时HDC当然指向Printer,不过我输出不用API,只是想计算可打印区域。
      

  3.   

    纸张大小通过纸张型号得到.
    水平偏移量和垂直偏移量用DeviceCapabilities得到纸张宽度-2*水平偏移量=实际可打印宽度
    纸张高度-2*垂直偏移量=实际可打印高度很多打印预览程序是没有考虑这一点的,例如cell,
    所以能预览,但小于物理偏移量的部分打不出来.
    excel中处理了这个问题,左边界不能小于水平偏移量.
      

  4.   

    steelhorse:
    非常感谢!用DeviceCapabilities,我现在已用到的有:
    DC_PAPERNAMES
    DC_PAPERS
    DC_BINNAMES
    DC_BINS
    要获取偏移量该用哪个?我查MSDN没有找到合适的。
      

  5.   

    我现在查不到资料
    参数是一个XXXoffset的常量,具体是什么不记得了.
      

  6.   

    GetDeviceCaps(HDC hdc, PHYSICALWIDTH);//实际宽度,纸的宽度
    GetDeviceCaps(HDC hdc, PHYSICALHEIGHT);//实际高度,纸的高度
    GetDeviceCaps(HDC hdc, PHYSICALOFFSETX);//宽度的偏移,就是实际宽度与打印机可画得到的区域的X偏差,GetDeviceCaps(HDC hdc, PHYSICALWIDTH)-2*GetDeviceCaps(HDC hdc, PHYSICALOFFSETX)==hdc实际可画的宽度
    GetDeviceCaps(HDC hdc, PHYSICALOFFSETY);//高度的偏移,就是实际高度与打印机可画得到的区域的Y偏差,GetDeviceCaps(HDC hdc, PHYSICALHEIGHT)-2*GetDeviceCaps(HDC hdc, PHYSICALOFFSETY)==hdc实际可画的高度
      

  7.   

    我发现不同的打印机就Device Unit有不同的精度,因此这些函数所返回的值的换算单位是不一样的。不过按比例算可以达到目标。不知 yhlubber是怎样换算返回的尺寸的。OK,总算达到目标了。分少了点(我不知如何加分),略表心意吧。