精华内容
下载资源
问答
  • 自动打印机

    2012-01-03 14:03:02
    机械产品的设计是对产品的功能、工作原理、系统运动方案、机构的运动与动力设计、机构的结构尺寸、力和能量的传递方式、各个零件的材料和形状尺寸、润滑方法等进行构思分析与计算,并将其转化为具体的描述以作为制造...
  • Windows下打印学习笔记

    千次阅读 2006-03-10 12:47:00
    很明显,要实现打印,必须清楚两点:1) 设备(打印机)能够支持多大的打印尺寸2) 打印尺寸和逻辑尺寸的映射关系 例如打印机打印尺寸为200mm X 200mm,映射关系为1mm=1逻辑单位,那么在逻辑设备上绘制以
          在Windows下对打印的处理和对屏幕的处理是一致的,都使用了在逻辑设备上绘制,然后映射到物理设备上,从而最大程度保证了代码与设备的关联最小。
    		 
    	很明显,要实现打印,必须清楚两点:
    1)	设备(打印机)能够支持多大的打印尺寸
    2)	打印尺寸和逻辑尺寸的映射关系
    	例如打印机的打印尺寸为200mm X  200mm,映射关系为1mm=1逻辑单位,那么在逻辑设备上绘制以(100,100)为圆心,100为半径的圆,将最大限度地充满整个逻辑设备,打印出来也就将以(100mm,100mm) 为圆心,100mm为半径,也即最大限度地充满整张打印纸。
    	对上面两点,Windows提供了这样的API:
    1)	GetDeviceCaps,提供不同参数来获得设备(这里是打印机)的各种尺寸
    2)	SetMapMode,设置映射关系
    
          下面结合Delphi来说明API的使用――
    例如GetDeviceCaps(Printer.Canvas.Handle, PHYSICALWIDTH)将得到打印机的宽度(以
    点为单位),GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSX)将得到打印机每英寸的打印点数。上述两个值相除就可以得到打印机的宽度(以英寸为单位)。
    	下列代码
    SetMapMode(Printer.Canvas.Handle, MM_LOMETRIC) ;
    VertSize:= GetDeviceCaps(Printer.Canvas.Handle, PHYSICALWIDTH) /
        GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSX) * 2.54 * 10 * 10;
      HorzSize:= GetDeviceCaps(Printer.Canvas.Handle, PHYSICALHEIGHT) /
        GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSY) * 2.54 * 10 * 10;
    将逻辑坐标的最大宽度计算得到后放在HorzSize中,逻辑坐标的最大长度放在VertSize中。任何超出这个范围的绘制操作都无法最终打印出来。仔细的注释如下:
    GetDeviceCaps(Printer.Canvas.Handle, PHYSICALWIDTH) /
        GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSX)
    得到宽度(以英寸为单位),SetMapMode(Printer.Canvas.Handle, MM_LOMETRIC)决定了从逻辑单位到物理单位的关系为:1逻辑单位=0.1mm(即1mm=10逻辑单位),而1英寸=2.54cm。所以应该将宽度乘以2.54得到以厘米为单位的宽度,再乘以10转换为以毫米为单位,最后再乘以10转换为基于逻辑单位的宽度。
    另外在MM_LOMETRIC映射下,逻辑页左上角为(0,0),x轴水平向右,y轴垂直向上,依次在逻辑坐标中,可以绘制(能够体现在打印页上)的范围为(0,0)-(HorzSize,-VertSize)。
    
    展开全文
  • 这些打印机具有固定的结构特征和操作尺寸,尤其是在打印头上,限制了可以分配的材料范围。 本工作的目的是设计和制造开源压电喷墨打印头,针对生物打印领域进行优化。 这种低成本、可重复、可靠、多功能和生物相容...
  • 近日因项目需要接触了打印机,自定义纸张的大小问题困扰了...如果用程序强制设置打印的话,它会按A4的标准走纸,比如我用的Epson LQ-300K+这款打印机最小纸张是10CM*10.16CM,而我要的宽度正好小于10CM,后来我改...

    近日因项目需要接触了打印机,自定义纸张的大小问题困扰了我一个多星期,还以为XP系统无法自定义纸张,后来在网上搜索时无意中发现,打印机都有最小纸张的标准,如果小于或大于这个标准,就算自定义好了页面,都无法选择它(不会显示出来),如果用程序强制设置打印的话,它会按A4的标准走纸,比如我用的Epson LQ-300K+这款打印机,最小纸张是10CM*10.16CM,而我要的宽度正好小于10CM,后来我改成10CM后,就能正常打印了。使用下面第一段例子就可以搞定了!  

    在 WindowsNT/200 環境下要自訂紙張尺寸所使用的方法與 Win9x 不同,

    你必須先為目前的印表機定義一個自訂的 "Form"(呼叫 API: AddForm,

    此 API 宣告於 WinSpool 單元中),然後把這個 Form 的名稱設定給

    DEVMODES 結構中的 dmFormName 欄位。以下的函式可以直接拿來使用:

    uses Windows, WinSpool, Printers;

    (*------------------------------------------------------

    Define a new Form (WinNT/2000 only).

    If FormName already exists, do nothing and return.

    If failed, an exception will be raised.

    ------------------------------------------------------*)

    procedure PrnAddForm(const FormName: string; PaperWidth, PaperLength: integer);

    var

    PrintDevice, PrintDriver, PrintPort : array[0..255] of Char;

    hDMode : THandle;

    hPrinter: THandle;

    FormInfo: TFormInfo1;

    PaperSize: TSize;

    PaperRect: TRect;

    errcode: integer;

    s: string;

    begin

    Printer.GetPrinter(PrintDevice, PrintDriver, PrintPort, hDMode);

    OpenPrinter(PrintDevice, hPrinter, nil);

    if hPrinter = 0 then

    raise Exception.Create('Failed to open printer!');

    FormInfo.Flags := FORM_USER;

    FormInfo.pName := PChar(FormName);

    PaperSize.cx := PaperWidth;

    PaperSize.cy := PaperLength;

    PaperRect.Left := 0;

    PaperRect.Top := 0;

    PaperRect.Right := PaperWidth;

    PaperRect.Bottom := PaperLength;

    FormInfo.Size := PaperSize;

    FormInfo.ImageableArea := PaperRect;

    if not AddForm(hPrinter, 1, @FormInfo) then

    begin

    errcode := GetLastError;

    if errcode <> ERROR_FILE_EXISTS then // Form name exists?

    begin

    case errcode of

    ERROR_ACCESS_DENIED: s := 'Access is denied';

    ERROR_INVALID_HANDLE: s := 'The handle is invalid';

    ERROR_NOT_READY: s := 'The device is not ready';

    ERROR_CALL_NOT_IMPLEMENTED:

    s := 'Function "AddForm" is not supported on this system';

    else

    s := 'Failed to add a Form (paper) name!';

    end;

    raise Exception.Create(s);

    end;

    end;

    ClosePrinter(hPrinter);

    end;

    (*

    Set custom paper size for WinNT/2000.

    Make sure FormName is supported by current printer,

    You can call PrnAddForm to define a new Form.

    *)

    procedure PrnSetPaperSizeNT(FormName: string; PaperWidth, PaperLength: integer);

    var

    Device, Driver, Port: array[0..80] of Char;

    DevMode: THandle;

    pDevmode: PDeviceMode;

    begin

    // Get printer device name etc.

    Printer.GetPrinter(Device, Driver, Port, DevMode);

    // force reload of DEVMODE

    Printer.SetPrinter(Device, Driver, Port, 0) ;

    // get DEVMODE handle

    Printer.GetPrinter(Device, Driver, Port, DevMode);

    if DevMode <> 0 then

    begin

    // lock it to get pointer to DEVMODE record

    pDevMode := GlobalLock( DevMode );

    if pDevmode <> nil then

    try

    with pDevmode^ do

    begin

    // modify form

    StrLCopy( dmFormName, PChar(FormName), CCHFORMNAME-1 );

    // tell printer driver that dmFormname field contains

    // data it needs to inspect.

    dmPaperWidth := PaperWidth;

    dmPaperLength := PaperLength;

    dmFields := dmFields or DM_FORMNAME or DM_PAPERWIDTH or DM_PAPERLENGTH;

    end;

    finally

    GlobalUnlock( Devmode ); // unlock devmode handle.

    end;

    end; { If }

    end;

    procedure TForm1.Button1Click(Sender: TObject);

    begin

    PrnAddForm(

    edFormName.Text,

    StrToInt(edPaperWidth.Text),

    StrToInt(edPaperLength.Text)

    );

    PrnSetPaperSizeNT(

    edFormName.Text,

    StrToInt(edPaperWidth.Text),

    StrToInt(edPaperLength.Text)

    );

    Printer.BeginDoc;

    Printer.Canvas.TextOut(10, 10, 'Printer test!');

    Printer.EndDoc;

    end;

    在Delphi帮助中,AddForm定义如下:

    BOOL AddForm(

    HANDLE hPrinter, // handle to printer object

    DWORD Level, // data-structure level

    LPBYTE pForm // pointer to form info. data structure

    );

    下面是我在Delphi中定义的自定义函数AddPaper():

    function AddPaper(PaperName: PChar;fPaperWidth,fPaperHeigth: Double): String;

    var

    PrintDevice, PrintDriver, PrintPort : array[0..255] of Char;

    hDMode : THandle;

    hPrinter: THandle;

    FormInfo: TForminfo1;

    PaperSize: TSize;

    PaperRect: TRect;

    PaperWidth,PaperHeigth: Integer;

    function Zlxs(S: String;nWs: Integer): String; //整理小数位,并转化成厘米

    begin

    Try

    Result:=FloatToStr(StrToFloat(S));

    If pos('.',Result)>0 then

    Result:=Copy(Result,1,pos('.',Result)+2);

    Result:=FloatToStr(StrToFloat(Result)*10000);

    Except

    Result:='0';

    end;

    end;

    begin

    PaperWidth:=StrToInt(Zlxs(FloatToStr(fPaperWidth),3));

    Paperheigth:=StrToInt(Zlxs(FloatToStr(fPaperheigth),3));

    //判断是否安装打印机,并得到默认打印机的句柄

    Printer.GetPrinter(PrintDevice, PrintDriver, PrintPort, hDMode);

    OpenPrinter(PrintDevice, hPrinter, nil);

    if hPrinter=0 then

    begin

    Result:='没有安装打印机!';

    Exit;

    end;

    //定义结构

    FormInfo.Flags:=FORM_USER;

    FormInfo.pName:=PChar(PaperName);

    PaperSize.cx:=PaperWidth;

    PaperSize.cy:=PaperHeigth;

    PaperRect.Left:=0;

    PaperRect.Top:=0;

    PaperRect.Right:=PaperSize.cx;

    PaperRect.Bottom:=PaperSize.cy;

    FormInfo.Size:=PaperSize;

    FormInfo.ImageableArea:=PaperRect;

    AddForm(hPrinter,1,@FormInfo); //添加纸张

    ClosePrinter(hPrinter);

    end;

    3个参数:PaperName:你给纸张命的名(操作系统中叫描述格式),fPaperWidth:纸张宽度,fPaperHeigth:纸张高度。如果没有安装打印机,返回提示信息。如果已经有同样名称的纸张,函数不起作用,建议大家最好在名称中加入“_”,因为很少有这样命名的纸张,你的程序用你的专用纸张也不为过吧(谁叫Windows不提供,而我们偏偏又要用呢)?里面还有一个函数:Zlxs,这是用来整理小数的,经过试验,加入的纸张采用的单位是厘米时宽度用10000时只有1厘米,大家输入的往往是以厘米为单位的,且带小数,所以得用一个函数来将浮点数转换成整数。当然首先还得在uses段中加入Printers,winspool引用。以上代码在D5,D6+ Win 2000中运行通过。将这个函数加入管理系统中,在打印之前调用生成专用纸张,省时又省力。

    这种方法应该是处理自定义纸张问题的正解,通用性强,也不会浪费打印机的链式(牵引)走纸功能。大家可以根据各自编程工具的方法进行定义,也可以做成.dll文件,这样不支持结构的编程工具,如VFP等也能使用了。

    4、其他小技巧:

    在使用OKI打印机时,我们有时会想把一行比较长的数据打在一张“US Std Fanfold”纸上,但“US Std Fanfold”宽度37.78cm,象OKI5330之类的打印机宽度有限,这么宽的纸放不下啊。我们可以采用自定义的方法实现,首先定义新格式,然后将“US Std Fanfold”的宽和高反过来,命个名:“US Std Fanfold(纵向)”,然后在报表设计中使用这张纸并采用横向打印就行了。

    procedure UpdatePrint(Awidth,Aheight:integer);

    const CustomFormName = 'ZJ Defined';

    function Win95SetForm(PDevMode: PDeviceMode): Boolean;

    begin

    Printer.PrinterIndex := Printer.PrinterIndex;

    PDevMode.dmFields := PDevMode.dmFields or DM_PAPERSIZE;

    PDevMode.dmPaperSize := 256;

    PDevMode.dmFields := PDevMode.dmFields or DM_PAPERWIDTH;

    PDevMode.dmPaperWidth := AWidth;

    PDevMode.dmFields := PDevMode.dmFields or DM_PAPERLENGTH;

    PDevMode.dmPaperLength := AHeight;

    Printer.PrinterIndex := Printer.PrinterIndex;

    Result := True;

    end;

    function WinNTSetForm(PDevMode: PDeviceMode;

    Device: PChar; Port: PChar): Boolean;

    var

    hPrinter: THandle;

    pForm: Pointer;

    cbNeeded: DWORD;

    cReturned: DWORD;

    FormInfo1: TFormInfo1;

    begin

    Result := False;

    if OpenPrinter(Device, hPrinter, nil) then

    begin

    pForm := nil;

    EnumForms(hPrinter, 1, pForm, 0, cbNeeded, cReturned);

    GetMem(pForm, cbNeeded); //pForm的大小并分配内存

    try

    if EnumForms(hPrinter, 1, pForm, cbNeeded, cbNeeded, cReturned) then

    begin

    if DeleteForm(hPrinter, PChar(CustomFormName)) then

    Dec(cReturned); //删除旧的Form

    with FormInfo1 do

    begin

    Flags := 0;

    pName := PChar(CustomFormName);

    Size.cx := AWidth * 100;

    Size.cy := AHeight * 100;

    with ImageAbleArea do

    begin

    Left := 0;

    Top := 0;

    Right := Size.cx;

    Bottom := Size.cy;

    end;

    end;

    if AddForm(hPrinter, 1, @FormInfo1) then

    begin

    Printer.PrinterIndex := Printer.PrinterIndex;

    PDevMode.dmFields := PDevMode.dmFields or DM_PAPERSIZE;

    PDevMode.dmPaperSize := cReturned + 1;

    Printer.PrinterIndex := Printer.PrinterIndex;

    Result := True;

    end;

    end;

    finally

    FreeMem(pForm);

    end;

    end;

    end;

    var

    Device, Driver, Port: array[0..127] of char;

    hDevMode: THandle;

    PDevMode: PDeviceMode;

    begin

    Printer.GetPrinter(Device, Driver, Port, hDevMode);

    if hDevMode <> 0 then

    begin

    PDevMode := GlobalLock(hDevMode);

    try

    if (Win32Platform = VER_PLATFORM_WIN32s) or

    (Win32Platform = VER_PLATFORM_WIN32_WINDOWS) then

    Win95SetForm(PDevMode)

    else if Win32Platform = VER_PLATFORM_WIN32_NT then

    WinNTSetForm(PDevMode, Device, Port);

    finally

    GlobalUnlock(hDevMode);

    end;

    end

    end;

    将《Delphi中票据凭证的精确打印》一文中关于设置打印纸张长、宽的内容贴上来,供你参考

    file://设置纸张高度-单位:mm

    procedure SetPaperHeight(Value: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

    file://自定义纸张最小高度127mm

    if Value < 127 then Value := 127;

    file://自定义纸张最大高度432mm

    if Value > 432 then Value := 432;

    Printer.PrinterIndex := Printer.PrinterIndex;

    Printer.GetPrinter(Device, Driver, Port, hDMode);

    if hDMode <> 0 then

    begin

    pDMode := GlobalLock(hDMode);

    if pDMode <> nil then

    begin

    pDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE or

    DM_PAPERLENGTH;

    pDMode^.dmPaperSize := DMPAPER_USER;

    pDMode^.dmPaperLength := Value * 10;

    pDMode^.dmFields := pDMode^.dmFields or DMBIN_MANUAL;

    pDMode^.dmDefaultSource := DMBIN_MANUAL;

    GlobalUnlock(hDMode);

    end;

    end;

    Printer.PrinterIndex := Printer.PrinterIndex;

    end;

    file://设置纸张宽度:单位--mm

    Procedure SetPaperWidth(Value: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

    file://自定义纸张最小宽度76mm

    if Value < 76 then Value := 76;

    file://自定义纸张最大宽度216mm

    if Value > 216 then Value := 216;

    Printer.PrinterIndex := Printer.PrinterIndex;

    Printer.GetPrinter(Device, Driver, Port, hDMode);

    if hDMode <> 0 then

    begin

    pDMode := GlobalLock(hDMode);

    if pDMode <> nil then

    begin

    pDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE or

    DM_PAPERWIDTH;

    pDMode^.dmPaperSize := DMPAPER_USER;

    file://将毫米单位转换为0.1mm单位

    pDMode^.dmPaperWidth := Value * 10;

    pDMode^.dmFields := pDMode^.dmFields or DMBIN_MANUAL;

    pDMode^.dmDefaultSource := DMBIN_MANUAL;

    GlobalUnlock(hDMode);

    end;

    end;

    Printer.PrinterIndex := Printer.PrinterIndex;

    end;

    设定纸张大小

    Procedure PrintPapersize(Width,Length:integer);

    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.GetPrinter(Device,Driver,Port,hDMode);

    if hDMode <> 0 then

    begin

    pDMode := GlobalLock(hDMode);

    if pDMode <> nil then

    begin

    pDMode^.dmPaperSize := 256;

    pDMode^.dmPaperLength :=Length ;

    pDMode^.dmPaperWidth := Width;

    pDMode^.dmFields :=pDMode^.dmFields or DM_PAPERSIZE;

    pDMode^.dmFields :=pDMode^.dmFields or DM_PAPERLENGTH;

    pDMode^.dmFields :=pDMode^.dmFields or DM_PAPERWIDTH;

    ResetDC(Printer.Handle,pDMode^);

    GlobalUnlock(hDMode);

    end;

    end;

    end;

    uses WinSpool, Printers, Windows;

    function CustomAddForm (const Name:String; const Width, Height:Double; const PrinterName:String):Boolean;

    var

    FormInfo1: TFormInfo1;

    pFormInfo: PFormInfo1;

    hPrinter : THandle;

    begin

    Result := False;

    if OpenPrinter(PChar(PrinterName),hPrinter,NIL) then

    begin

    with FormInfo1 do

    begin

    Flags := 0;

    pName := PAnsiChar(Name);

    Size.cx := Trunc(Width*1000);

    Size.cy := Trunc(Height*1000);

    ImageableArea.Left := 0;

    ImageableArea.Top := 0;

    ImageableArea.Bottom := Size.cy;

    ImageableArea.Right := Size.cx;

    end;

    pFormInfo := @FormInfo1;

    Result := AddForm(hPrinter,1,pFormInfo);

    ClosePrinter(hPrinter);

    end;

    end;

    有两个方法可以在win2000中设置自定义纸张:

    1、手工添加

    在“控制面板”、“打印机和传真”中选中一台打印机,在“文件”菜单的“服务器属性”中创建新格式即可。

    2、程序动态修改

    procedure SetPaperSize(X, Y: Integer);

    // 单位是0.1mm

    //改变devicemode结构

    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);

    if hDMode <> 0 then

    begin

    pDMode := GlobalLock(hDMode);

    if pDMode <> nil then

    begin

    if (x = 0) or (y = 0) then

    begin

    {Set to legal}

    pDMode^.dmFields := pDMode^.dmFields or dm_PaperSize;

    {pDMode^.dmPaperSize := DMPAPER_LEGAL; changed by wulianmin}

    pDMode^.dmPaperSize := DMPAPER_FANFOLD_US;

    end

    else

    begin

    {Set to custom size}

    pDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE or DM_PAPERWIDTH or DM_PAPERLENGTH;

    pDMode^.dmPaperSize := DMPAPER_USER;

    pDMode^.dmPaperWidth := x {SomeValueInTenthsOfAMillimeter};

    pDMode^.dmPaperLength := y {SomeValueInTenthsOfAMillimeter};

    end;

    {Set the bin to use}

    pDMode^.dmFields := pDMode^.dmFields or DMBIN_MANUAL;

    pDMode^.dmDefaultSource := DMBIN_MANUAL;

    GlobalUnlock(hDMode);

    end;

    end;

    end;

    我曾经用Delphi 5.0的Printer对象编写打印程序,在许多打印机上使用都没问题

    (包括一些其他EPSON打印机),但是在EPSON 460上使用时不能打印,结果发现在这种

    环境下,必须给Printer的Title属性赋值后,打印机才会真正去打印,具体方法如下:

    Printer.BeginDoc;

    Printer.Title := '在这里给打印文档起个名字';

    {打印的内容};

    Printer.EndDoc;

    转载于:https://www.cnblogs.com/moon25/archive/2010/01/25/1655542.html

    展开全文
  • 近日因项目需要接触了打印机,自定义纸张的大小问题困扰了我一...如果用程序强制设置打印的话,它会按A4的标准走纸,比如我用的Epson LQ-300K+这款打印机最小纸张是10CM*10.16CM,而我要的宽度正好小于10CM,后来我改

    近日因项目需要接触了打印机,自定义纸张的大小问题困扰了我一个多星期,还以为XP系统无法自定义纸张,后来在网上搜索时无意中发现,打印机都有最小纸张的标准,如果小于或大于这个标准,就算自定义好了页面,都无法选择它(不会显示出来),如果用程序强制设置打印的话,它会按A4的标准走纸,比如我用的Epson LQ-300K+这款打印机,最小纸张是10CM*10.16CM,而我要的宽度正好小于10CM,后来我改成10CM后,就能正常打印了。使用下面第一段例子就可以搞定了!  

    转自:http://delphi.ktop.com.tw/board.php?cid=30&fid=100&tid=75503

    WindowsNT/200 環境下要自訂紙張尺寸所使用的方法與 Win9x 不同,
    你必須先為目前的印表機定義一個自訂的 "Form"(呼叫 API: AddForm
    API 宣告於 WinSpool 單元中),然後把這個 Form 的名稱設定給
    DEVMODES 結構中的 dmFormName 欄位。以下的函式可以直接拿來使用:
     
    uses Windows, WinSpool, Printers;
     
    (*------------------------------------------------------
    Define a new Form (WinNT/2000 only).
    If FormName already exists, do nothing and return.
    If failed, an exception will be raised.
    ------------------------------------------------------*)
    procedure PrnAddForm(const FormName: string; PaperWidth, PaperLength: integer);
    var
    PrintDevice, PrintDriver, PrintPort : array[0..255] of Char;
    hDMode : THandle;
    hPrinter: THandle;
    FormInfo: TFormInfo1;
    PaperSize: TSize;
    PaperRect: TRect;
    errcode: integer;
    s: string;
    begin
    Printer.GetPrinter(PrintDevice, PrintDriver, PrintPort, hDMode);
    OpenPrinter(PrintDevice, hPrinter, nil);
    if hPrinter = 0 then
    raise Exception.Create('Failed to open printer!');
    FormInfo.Flags := FORM_USER;
    FormInfo.pName := PChar(FormName);
    PaperSize.cx := PaperWidth;
    PaperSize.cy := PaperLength;
    PaperRect.Left := 0;
    PaperRect.Top := 0;
    PaperRect.Right := PaperWidth;
    PaperRect.Bottom := PaperLength;
    FormInfo.Size := PaperSize;
    FormInfo.ImageableArea := PaperRect;
    if not AddForm(hPrinter, 1, @FormInfo) then
    begin
    errcode := GetLastError;
    if errcode <> ERROR_FILE_EXISTS then // Form name exists?
    begin
    case errcode of
    ERROR_ACCESS_DENIED: s := 'Access is denied';
    ERROR_INVALID_HANDLE: s := 'The handle is invalid';
    ERROR_NOT_READY: s := 'The device is not ready';
    ERROR_CALL_NOT_IMPLEMENTED:
    s := 'Function "AddForm" is not supported on this system';
    else
    s := 'Failed to add a Form (paper) name!';
    end;
    raise Exception.Create(s);
    end;
    end;
    ClosePrinter(hPrinter);
    end;
     
    (*
    Set custom paper size for WinNT/2000.
    Make sure FormName is supported by current printer,
    You can call PrnAddForm to define a new Form.
    *)
    procedure PrnSetPaperSizeNT(FormName: string; PaperWidth, PaperLength: integer);
    var
    Device, Driver, Port: array[0..80] of Char;
    DevMode: THandle;
    pDevmode: PDeviceMode;
    begin
    // Get printer device name etc.
    Printer.GetPrinter(Device, Driver, Port, DevMode);
    // force reload of DEVMODE
    Printer.SetPrinter(Device, Driver, Port, 0) ;
    // get DEVMODE handle
    Printer.GetPrinter(Device, Driver, Port, DevMode);
    if DevMode <> 0 then
    begin
    // lock it to get pointer to DEVMODE record
    pDevMode := GlobalLock( DevMode );
    if pDevmode <> nil then
    try
    with pDevmode^ do
    begin
    // modify form
    StrLCopy( dmFormName, PChar(FormName), CCHFORMNAME-1 );
    // tell printer driver that dmFormname field contains
    // data it needs to inspect.
    dmPaperWidth := PaperWidth;
    dmPaperLength := PaperLength;
    dmFields := dmFields or DM_FORMNAME or DM_PAPERWIDTH or DM_PAPERLENGTH;
    end;
    finally
    GlobalUnlock( Devmode ); // unlock devmode handle.
    end;
    end; { If }
    end;
     
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    PrnAddForm(
    edFormName.Text,
    StrToInt(edPaperWidth.Text),
    StrToInt(edPaperLength.Text)
    );
    PrnSetPaperSizeNT(
    edFormName.Text,
    StrToInt(edPaperWidth.Text),
    StrToInt(edPaperLength.Text)
    );
    Printer.BeginDoc;
    Printer.Canvas.TextOut(10, 10, 'Printer test!');
    Printer.EndDoc;
    end;
     
     
     
     
     
    Delphi帮助中,AddForm定义如下:
    BOOL AddForm(
    HANDLE hPrinter, // handle to printer object
    DWORD Level, // data-structure level
    LPBYTE pForm // pointer to form info. data structure
    );
    下面是我在Delphi中定义的自定义函数AddPaper()
    function AddPaper(PaperName: PChar;fPaperWidth,fPaperHeigth: Double): String;
    var
    PrintDevice, PrintDriver, PrintPort : array[0..255] of Char;
    hDMode : THandle;
    hPrinter: THandle;
    FormInfo: TForminfo1;
    PaperSize: TSize;
    PaperRect: TRect;
    PaperWidth,PaperHeigth: Integer;
    function Zlxs(S: String;nWs: Integer): String; //整理小数位,并转化成厘米
    begin
    Try
    Result:=FloatToStr(StrToFloat(S));
    If pos('.',Result)>0 then
    Result:=Copy(Result,1,pos('.',Result)+2);
    Result:=FloatToStr(StrToFloat(Result)*10000);
    Except
    Result:='0';
    end;
    end;
    begin
    PaperWidth:=StrToInt(Zlxs(FloatToStr(fPaperWidth),3));
    Paperheigth:=StrToInt(Zlxs(FloatToStr(fPaperheigth),3));
    //判断是否安装打印机,并得到默认打印机的句柄
    Printer.GetPrinter(PrintDevice, PrintDriver, PrintPort, hDMode);
    OpenPrinter(PrintDevice, hPrinter, nil);
    if hPrinter=0 then
    begin
    Result:='没有安装打印机!';
    Exit;
    end;
    //定义结构
    FormInfo.Flags:=FORM_USER;
    FormInfo.pName:=PChar(PaperName);
    PaperSize.cx:=PaperWidth;
    PaperSize.cy:=PaperHeigth;
    PaperRect.Left:=0;
    PaperRect.Top:=0;
    PaperRect.Right:=PaperSize.cx;
    PaperRect.Bottom:=PaperSize.cy;
    FormInfo.Size:=PaperSize;
    FormInfo.ImageableArea:=PaperRect;
    AddForm(hPrinter,1,@FormInfo); //添加纸张
    ClosePrinter(hPrinter);
    end;
    3个参数:PaperName:你给纸张命的名(操作系统中叫描述格式),fPaperWidth:纸张宽度,fPaperHeigth:纸张高度。如果没有安装打印机,返回提示信息。如果已经有同样名称的纸张,函数不起作用,建议大家最好在名称中加入“_”,因为很少有这样命名的纸张,你的程序用你的专用纸张也不为过吧(谁叫Windows不提供,而我们偏偏又要用呢)?里面还有一个函数:Zlxs,这是用来整理小数的,经过试验,加入的纸张采用的单位是厘米时宽度用10000时只有1厘米,大家输入的往往是以厘米为单位的,且带小数,所以得用一个函数来将浮点数转换成整数。当然首先还得在uses段中加入Printers,winspool引用。以上代码在D5,D6+ Win 2000中运行通过。将这个函数加入管理系统中,在打印之前调用生成专用纸张,省时又省力。
    这种方法应该是处理自定义纸张问题的正解,通用性强,也不会浪费打印机的链式(牵引)走纸功能。大家可以根据各自编程工具的方法进行定义,也可以做成.dll文件,这样不支持结构的编程工具,如VFP等也能使用了。
    4其他小技巧:
    在使用OKI打印机时,我们有时会想把一行比较长的数据打在一张“US Std Fanfold”纸上,但“US Std Fanfold”宽度37.78cm,象OKI5330之类的打印机宽度有限,这么宽的纸放不下啊。我们可以采用自定义的方法实现,首先定义新格式,然后将“US Std Fanfold”的宽和高反过来,命个名:“US Std Fanfold(纵向)”,然后在报表设计中使用这张纸并采用横向打印就行了。
     
     
     
     
    procedure UpdatePrint(Awidth,Aheight:integer);
    const CustomFormName = 'ZJ Defined';
     
    function Win95SetForm(PDevMode: PDeviceMode): Boolean;
    begin
    Printer.PrinterIndex := Printer.PrinterIndex;
    PDevMode.dmFields := PDevMode.dmFields or DM_PAPERSIZE;
    PDevMode.dmPaperSize := 256;
    PDevMode.dmFields := PDevMode.dmFields or DM_PAPERWIDTH;
    PDevMode.dmPaperWidth := AWidth;
    PDevMode.dmFields := PDevMode.dmFields or DM_PAPERLENGTH;
    PDevMode.dmPaperLength := AHeight;
    Printer.PrinterIndex := Printer.PrinterIndex;
    Result := True;
    end;
     
    function WinNTSetForm(PDevMode: PDeviceMode;
    Device: PChar; Port: PChar): Boolean;
    var
    hPrinter: THandle;
    pForm: Pointer;
    cbNeeded: DWORD;
    cReturned: DWORD;
    FormInfo1: TFormInfo1;
    begin
    Result := False;
    if OpenPrinter(Device, hPrinter, nil) then
    begin
    pForm := nil;
    EnumForms(hPrinter, 1, pForm, 0, cbNeeded, cReturned);
    GetMem(pForm, cbNeeded); //pForm的大小并分配内存
    try
    if EnumForms(hPrinter, 1, pForm, cbNeeded, cbNeeded, cReturned) then
    begin
    if DeleteForm(hPrinter, PChar(CustomFormName)) then
    Dec(cReturned); //删除旧的Form
    with FormInfo1 do
    begin
    Flags := 0;
    pName := PChar(CustomFormName);
    Size.cx := AWidth * 100;
    Size.cy := AHeight * 100;
    with ImageAbleArea do
    begin
    Left := 0;
    Top := 0;
    Right := Size.cx;
    Bottom := Size.cy;
    end;
    end;
    if AddForm(hPrinter, 1, @FormInfo1) then
    begin
    Printer.PrinterIndex := Printer.PrinterIndex;
    PDevMode.dmFields := PDevMode.dmFields or DM_PAPERSIZE;
    PDevMode.dmPaperSize := cReturned + 1;
    Printer.PrinterIndex := Printer.PrinterIndex;
    Result := True;
    end;
    end;
    finally
    FreeMem(pForm);
    end;
    end;
    end;
    var
    Device, Driver, Port: array[0..127] of char;
    hDevMode: THandle;
    PDevMode: PDeviceMode;
    begin
    Printer.GetPrinter(Device, Driver, Port, hDevMode);
    if hDevMode <> 0 then
    begin
    PDevMode := GlobalLock(hDevMode);
    try
    if (Win32Platform = VER_PLATFORM_WIN32s) or
    (Win32Platform = VER_PLATFORM_WIN32_WINDOWS) then
    Win95SetForm(PDevMode)
    else if Win32Platform = VER_PLATFORM_WIN32_NT then
    WinNTSetForm(PDevMode, Device, Port);
    finally
    GlobalUnlock(hDevMode);
    end;
    end
    end;
     
     
     
     
    将《Delphi中票据凭证的精确打印》一文中关于设置打印纸张长、宽的内容贴上来,供你参考
    file://设置纸张高度-单位:mm
    procedure SetPaperHeight(Value: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
    file://自定义纸张最小高度127mm
    if Value < 127 then Value := 127;
     file://自定义纸张最大高度432mm
     if Value > 432 then Value := 432;
      Printer.PrinterIndex := Printer.PrinterIndex;
      Printer.GetPrinter(Device, Driver, Port, hDMode);
      if hDMode <> 0 then
       begin
        pDMode := GlobalLock(hDMode);
        if pDMode <> nil then
        begin
         pDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE or
                   DM_PAPERLENGTH;
         pDMode^.dmPaperSize := DMPAPER_USER;
         pDMode^.dmPaperLength := Value * 10;
         pDMode^.dmFields := pDMode^.dmFields or DMBIN_MANUAL;
         pDMode^.dmDefaultSource := DMBIN_MANUAL;
         GlobalUnlock(hDMode);
        end;
       end;
       Printer.PrinterIndex := Printer.PrinterIndex;
    end;
     
    file://设置纸张宽度:单位--mm
    Procedure SetPaperWidth(Value: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
    file://自定义纸张最小宽度76mm
    if Value < 76 then Value := 76;
     file://自定义纸张最大宽度216mm
     if Value > 216 then Value := 216;
      Printer.PrinterIndex := Printer.PrinterIndex;
      Printer.GetPrinter(Device, Driver, Port, hDMode);
      if hDMode <> 0 then
      begin
       pDMode := GlobalLock(hDMode);
       if pDMode <> nil then
       begin
        pDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE or
                  DM_PAPERWIDTH;
        pDMode^.dmPaperSize := DMPAPER_USER;
        file://将毫米单位转换为0.1mm单位
        pDMode^.dmPaperWidth := Value * 10;
        pDMode^.dmFields := pDMode^.dmFields or DMBIN_MANUAL;
        pDMode^.dmDefaultSource := DMBIN_MANUAL;
        GlobalUnlock(hDMode);
       end;
      end;
      Printer.PrinterIndex := Printer.PrinterIndex;
    end;
     
     
     
     
    设定纸张大小
    Procedure PrintPapersize(Width,Length:integer);
    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.GetPrinter(Device,Driver,Port,hDMode);
    if hDMode <> 0 then
    begin
    pDMode := GlobalLock(hDMode);
    if pDMode <> nil then
    begin
    pDMode^.dmPaperSize := 256;
    pDMode^.dmPaperLength :=Length ;
    pDMode^.dmPaperWidth := Width;
    pDMode^.dmFields :=pDMode^.dmFields or DM_PAPERSIZE;
    pDMode^.dmFields :=pDMode^.dmFields or DM_PAPERLENGTH;
    pDMode^.dmFields :=pDMode^.dmFields or DM_PAPERWIDTH;
    ResetDC(Printer.Handle,pDMode^);
    GlobalUnlock(hDMode);
    end;
    end;
     
    end;
     
    uses WinSpool, Printers, Windows;
     
    function CustomAddForm (const Name:String; const Width, Height:Double; const PrinterName:String):Boolean;
    var
    FormInfo1: TFormInfo1;
    pFormInfo: PFormInfo1;
    hPrinter : THandle;
    begin
    Result := False;
    if OpenPrinter(PChar(PrinterName),hPrinter,NIL) then
    begin
    with FormInfo1 do
    begin
    Flags := 0;
    pName := PAnsiChar(Name);
    Size.cx := Trunc(Width*1000);
    Size.cy := Trunc(Height*1000);
    ImageableArea.Left := 0;
    ImageableArea.Top := 0;
    ImageableArea.Bottom := Size.cy;
    ImageableArea.Right := Size.cx;
    end;
    pFormInfo := @FormInfo1;
    Result := AddForm(hPrinter,1,pFormInfo);
    ClosePrinter(hPrinter);
    end;
    end;
     
     
    有两个方法可以在win2000中设置自定义纸张:
    1、手工添加
    控制面板打印机和传真中选中一台打印机,在文件菜单的服务器属性中创建新格式即可。
    2、程序动态修改
    procedure SetPaperSize(X, Y: Integer);
    // 单位是0.1mm
    //改变devicemode结构
    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);
    if hDMode <> 0 then
    begin
    pDMode := GlobalLock(hDMode);
    if pDMode <> nil then
    begin
    if (x = 0) or (y = 0) then
    begin
    {Set to legal}
    pDMode^.dmFields := pDMode^.dmFields or dm_PaperSize;
    {pDMode^.dmPaperSize := DMPAPER_LEGAL; changed by wulianmin}
    pDMode^.dmPaperSize := DMPAPER_FANFOLD_US;
    end
    else
    begin
    {Set to custom size}
    pDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE or DM_PAPERWIDTH or DM_PAPERLENGTH;
    pDMode^.dmPaperSize := DMPAPER_USER;
    pDMode^.dmPaperWidth := x {SomeValueInTenthsOfAMillimeter};
    pDMode^.dmPaperLength := y {SomeValueInTenthsOfAMillimeter};
    end;
    {Set the bin to use}
    pDMode^.dmFields := pDMode^.dmFields or DMBIN_MANUAL;
    pDMode^.dmDefaultSource := DMBIN_MANUAL;
     
    GlobalUnlock(hDMode);
    end;
    end;
    end;
     
     
    我曾经用Delphi 5.0Printer对象编写打印程序,在许多打印机上使用都没问题
    (包括一些其他EPSON打印机),但是在EPSON 460上使用时不能打印,结果发现在这种
    环境下,必须给PrinterTitle属性赋值后,打印机才会真正去打印,具体方法如下:
    Printer.BeginDoc;
    Printer.Title := '在这里给打印文档起个名字';
    {打印的内容};
    Printer.EndDoc;
     
     
    展开全文
  • 双层打印机是即使输入图像是彩色或灰度图像也只能打印两种阴影(黑白)的打印机。 双层打印机P1使用以下转换将彩色图像打印为二进制图像: 使用以下公式将彩色图像转换为灰度:f'(x,y)=(0.299r(x,y)+ 0.587g...
  • 这个dot点,是个抽象的概念,在不同的领域具化起来有所不同,比如打印印刷领域通常是打印机输出的最小墨点,而电脑屏幕显示领域则是最小的像素点(就是滴一滴水在屏幕上就能看见的那种小格子);PPI(pixel per inch)...

    简单说明一下上图 其实没啥关系:

    描述屏幕尺寸,通常从物理和逻辑两方面来,而DPI(dot per inch) 这个密度单位可以说是连接了物理和逻辑,表示每英寸的点数;

    这个dot点,是个抽象的概念,在不同的领域具化起来有所不同,比如打印印刷领域通常是打印机输出的最小墨点,而电脑屏幕显示领域则是最小的像素点(就是滴一滴水在屏幕上就能看见的那种小格子);PPI(pixel per inch)每英寸的像素点数,所以在讨论电脑屏幕显示时,dpi和ppi其实是一回事

    ps:上面的dot是个抽象概念,但实际生活中常提到还有个point物理单位(点),这个是物理单位,1 in = 72pt,别混了。。。

    再说回ppi, pixel per inch 这里的pixel就是物理像素点,拿我的手机举个例子,分辨率为1440 * 2560 ,这个分辨率1440 * 2560 就表示屏幕上有1440 * 2560个物理像素点;

    假如隔壁老王手机分辨率是1080 * 1920,然后设计师给了一个1080 * 1920的设计稿和一堆切图,假设这堆切图中有个图标大小是144px * 144px,那么怎么才能让视觉上我和老王看到的图标是一样大的呢?直接写死114px肯定不行,那样我手机上看到的图标肯定比老王小

    这个时候就得说下,物理像素,逻辑像素和倍率了,看这里window.devicePixelRatio

    我们从安卓客户端的角度来看,我和老王的手机都是安卓,屏幕密度分别是xxxhdpi和xxhdpi的,倍率分别是4,3;逻辑像素等于物理像素除以倍率,算下,其实二者的逻辑像素是一样的,都是360 * 640,可见这个逻辑像素比例才是决定最终显示效果的;刚刚说的那个尺寸为144px * 144px的图标,就是说这图标有144 * 144个物理像素点,那么其逻辑像素就是48 * 48

    对于安卓和iOS,都有自己的逻辑像素单位,分别是dp和pt(这里的pt可不是前文提到的pt),那iOS和安卓er写个48pt/dp就差不多啦,接下来支持多种屏幕显示就是系统的事了,据说大概有三种方案(系统根据屏幕密度扩展修改逻辑像素单位的值,或者将可绘制资源扩展到适当大小比如缩放位图,或者针对不同屏幕密度提供不同尺寸的位图资源)

    可是对于前端er呢。。很开心没有这个所谓的逻辑像素单位。

    那我们就只能自己搞出适配的一套东西来。 比如这里只说下rem,rem单位是相对于<html>根元素的字体大小的。只要我们能根据不同屏幕大小设置不同的根元素字体大小,那么间接地就实现了不同屏幕采用不同的物理像素值,这时候这个rem就有点像别人家的dp/pt了。

    转载于:https://juejin.im/post/5a5b07496fb9a01cb912dcb4

    展开全文
  • Sculpt 还能帮助您检查常见的打印可行性问题,如特征尺寸、倒扣区域、底面和打印机体积,并加以标记,便于打印前更改。 Geomagic Sculpt 功能 添加设计结构 Geomagic Sculpt 全新的 StructureFX™ 功能是一款功能...
  • PrinterMessageBox 在拥有指定打印作业的系统上显示一个打印机出错消息框 PrinterProperties 启动打印机属性对话框,以便对打印机进行配置 ReadPrinter 从打印机读入数据 ResetDC 重设一个设备场景 ResetPrinter...
  • 介绍了应用Visual Basic进行程序开发的多方面的知识和技巧,主要包括Visual Basic的多媒体开发、数据库应用、网络技术与Web开发、安全防护与入侵破解、打印技术与报表图表、程序控制与磁盘管理和系统与硬件设备等...
  • 介绍了应用Visual Basic进行程序开发的多方面的知识和技巧,主要包括Visual Basic的多媒体开发、数据库应用、网络技术与Web开发、安全防护与入侵破解、打印技术与报表图表、程序控制与磁盘管理和系统与硬件设备等...
  • 1350多个精品易语言模块提供下载

    热门讨论 2011-06-06 17:51:09
    伟 业超级列表框列宽尺寸自动调整.ec 伟业高级表格列宽尺寸自动调整.ec 传世注册.ec 低级功能模块.ec 供应商管理模 块.ec 保存图片(1.0).EC 保存图片1.0.ec 保存扩展界面设置.ec 保护.ec 保证显示.ec 信 息提示框...
  • 伟 业超级列表框列宽尺寸自动调整.ec 伟业高级表格列宽尺寸自动调整.ec 传世注册.ec 低级功能模块.ec 供应商管理模 块.ec 保存图片(1.0).EC 保存图片1.0.ec 保存扩展界面设置.ec 保护.ec 保证显示.ec 信 息提示框...
  • 1345个易语言模块

    2012-01-27 19:41:59
    伟 业超级列表框列宽尺寸自动调整.ec 伟业高级表格列宽尺寸自动调整.ec 传世注册.ec 低级功能模块.ec 供应商管理模 块.ec 保存图片(1.0).EC 保存图片1.0.ec 保存扩展界面设置.ec 保护.ec 保证显示.ec 信 息提示框...
  • 一款非常好的WPF编程宝典2010 源代码

    热门讨论 2014-04-14 09:57:41
    4.2.4 最小尺寸、最大尺寸以及 显式地设置尺寸 72 4.3 WrapPanel面板和DockPanel 面板 74 4.3.1 WrapPanel面板 74 4.3.2 DockPanel面板 75 4.3.3 嵌套布局包容器 77 4.4 Grid面板 78 4.4.1 调整行和列 80 ...
  • WPF编程宝典 part1

    2015-07-20 23:33:59
    3.2.4 最小尺寸、最大尺寸以及显式地 设置尺寸 54 3.2.5 Border控件 56 3.3 WrapPanel和DockPanel面板 57 3.3.1 WrapPanel面板 57 3.3.2 DockPanel面板 58 3.3.3 嵌套布局容器 59 3.4 Grid面板 60 3.4.1 调整行和列 ...
  • WPF编程宝典 part2

    2015-07-20 23:35:21
    3.2.4 最小尺寸、最大尺寸以及显式地 设置尺寸 54 3.2.5 Border控件 56 3.3 WrapPanel和DockPanel面板 57 3.3.1 WrapPanel面板 57 3.3.2 DockPanel面板 58 3.3.3 嵌套布局容器 59 3.4 Grid面板 60 3.4.1 调整行和列 ...
  • 4.2.4 最小尺寸、最大尺寸以及 显式地设置尺寸 72 4.3 WrapPanel面板和DockPanel 面板 74 4.3.1 WrapPanel面板 74 4.3.2 DockPanel面板 75 4.3.3 嵌套布局包容器 77 4.4 Grid面板 78 4.4.1 调整行和列 80 4.4.2 ...
  • Delphi5开发人员指南

    热门讨论 2012-07-18 16:51:14
    4.6.7 使窗体尺寸最小 110 4.6.8 运行没有窗体的项目 111 4.6.9 退出Windows 112 4.6.10 防止关闭Windows 113 4.7 总结 113 第5章 理解Windows消息 114 5.1 什么是消息 114 5.2 消息的类型 115 5.3 Windows消息系统...
  • 文泰刻绘软件2002

    2015-03-02 18:09:57
    8 可以单独设置输出页面的纵横比 确保最终产品的尺寸误差最小 9 海报制作及彩色打印输出功能:支持Windows底层彩色和黑白打印机直接输出排版结果 组合后批量复制不再有内存限制 并支持图像打印 ">文泰刻绘2002 ...
  • wentaikehui2002_99D

    2012-03-25 15:42:15
    8、可以单独设置输出页面的纵横比,确保最终产品的尺寸误差最小。 9、海报制作及彩色打印输出功能:支持Windows底层彩色和黑白打印机直接输出排版结果,组合后批量复制不再有内存限制,并支持图像打印
  • 会计理论考试题

    2012-03-07 21:04:40
    A、最小化 B、最大化 C、关闭 D、选择 6.为了以最佳方式、最少的重复,为多种应用服务,把数据集中起来以一定的组织方式存在计算机的外存储器中,就构成 __D___ 。 A、FoxBASE B、DOS C、数据库管理系统 D、数据库 ...
  • 第8章 打印机打印实现 第9章 进程和线程管理 第10章 文件读写操作 第11章 文件和文件夹管理 第12章 字符串和数据转换 第13章 操作系统维护 第14章 计算机设备管理 第15章 文字和图像显示 第16章 音频和视频 第17章...
  • 如何获取程序窗口标题栏的按钮尺寸  84.如何获取程序窗口标题栏的文字  85.如何获取程序窗口标题栏的文字颜色  86.如何设置程序窗口标题栏的文字颜色  87.如何在窗口标题栏中滚动显示文字  88....
  • VC++ 专家指导.doc

    2012-07-14 09:06:49
    (3)打印打印机的问题? 83 (4)CRichEditCtrl滚动条的问题? 84 (5)从数据库中读大于32k的内容? 84 (6)如何获得CRichEditCtrl中字符的位置? 86 (7)如何限制mdi子框架最大化时的大小? 86 (8)如何切换视口而不破坏它们?...
  • VC++常用功能实例

    2010-01-25 23:28:46
    问:打印打印机的问题? 64 问:CRichEditCtrl滚动条的问题? 65 问:从数据库中读大于32k的内容? 65 问:如何获得CRichEditCtrl中字符的位置? 66 问:如何限制mdi子框架最大化时的大小? 66 问:如何切换视口而不...
  • 问:打印打印机的问题? 64 问:CRichEditCtrl滚动条的问题? 65 问:从数据库中读大于32k的内容? 65 问:如何获得CRichEditCtrl中字符的位置? 66 问:如何限制mdi子框架最大化时的大小? 66 问:如何切换视口而不...
  • C++MFC教程

    热门讨论 2013-05-21 13:37:15
    有左上角坐标和尺寸构造 CRect( POINT topLeft, POINT bottomRight ); 有两点坐标构造 下面介绍几个成员函数: int Width( ) const; 得到宽度 int Height( ) const; 得到高度 CSize Size( ) const; 得到尺寸 ...
  • 二级界面可以自由拖动悬浮,支持最小化最大化关闭,响应双击自定义标题栏。 数据源支持模拟数据(默认)、数据库采集、串口通信(需定制)、网络通信(需定制)、网络请求等,可自由设定每个子界面的采集间隔即数据...
  • 65 C/C++的转义序列:嵌入不可打印的字符 66 C/C++转义序列:使用反斜线 67 C/C++转义序列:使用百分号来对文本进行格式化 68 使用printf 69 C++I/O流:cout、cin和cerr 第七章 探索Visual c++环境 70 创建工程项目 ...

空空如也

空空如也

1 2 3
收藏数 55
精华内容 22
关键字:

打印机最小打印尺寸