如何设定打印纸张?全部分求救,急(200分)

  • 主题发起人 主题发起人 quicksoft
  • 开始时间 开始时间
Q

quicksoft

Unregistered / Unconfirmed
GUEST, unregistred user!
本人开发的软件中有三个报表,其中一个固定用A4纸打印,一个用A3纸打印,一个有客户自定义纸张进行打印。
我想达到如下功能:当客户通过PrintSetDialog设定完纸张大小后,能够在注册表或INI文件或数据库中保留相应的纸张大小,然后每次打印报表时自动采用设定的纸张类型和打印方向。
 
补充:我是直接采用Printer进行打印的,没有采用任何控件
 
这个问题讨论过好多次了,自定义纸张的设置只有在打印机支持的时候才会出现,打印机不支持是无法设置的。
 
对,楼主的这种做法很好,方便客户,打印机不支持的话,楼主就又要改程序了
 
难道,没有高手吗?程序当然是方便用户,另原自己多写些代码,否则还买软件干吗?
毕竟打印机更换的不是很频繁,难道会超过每次打印还必须自己设定纸张多吗
 
把A3,A4纸当作自定义来处理
 
定义三个函数:
//新增表单。参数说明(printname:打印机名,paper-name:表单名,paper-width:纸张宽度,paper-height:纸张高度
width-left:左边距,width-right:上边距,height-left:左边距,height-right:下边距)返回1正确,0错误
Function int papersizeset(string printname,string paper_name,string paper_width,string paper_height,string width_left,string width_right,string heith_left,string height_right) Library "PaperSet.dll"

//删除已有表单。参数说明(forname:表单名)返回1正确,0错误
Function int deleteform(string printname,string formname)

//修改已有表单。参数说明(paper-name:表单名,paper-width:纸张宽度,paper-height:纸张高度
width-left:左边距,width-right:上边距,height-left:左边距,height-right:下边距)返回1正确,0错误
Function int setform(paper_name,string paper_width,string paper_height,string width_left,string width_right,string heith_left,string height_right)
 
如何在WINDOWS中控制打印字体的长宽,而不受限于SIZE 的限制

首先为了达到这个功能,可以采用Windows的逻辑字体(LogFont)
可以使用 CreateFont 或 CreateFontIndirect 这两个Windows API
函数来定义任何想要的字体,由于 CreateFont 所需的参数甚多通常
我们使用 CreateFontIndirect 来建立所需的逻辑字体,这个API函数
在Delphi中的声明为
function CreateFontIndirect(const p1: TLogFont): HFONT;
stdcall;
其中只有一个参数 p1: TLogfont
所有有关字体的参数完全通过这个
TLogfont结构来传送,Windows将根据结构中的内容创建出相应的逻辑
字体,在Delphi的Windows.pas中TLogFont是这样定义的

TLogFontA = packed record
lfHeight: Longint;
lfWidth: Longint;
lfEscapement: Longint;
lfOrientation: Longint;
lfWeight: Longint;
lfItalic: Byte;
lfUnderline: Byte;
lfStrikeOut: Byte;
lfCharSet: Byte;
lfOutPrecision: Byte;
lfClipPrecision: Byte;
lfQuality: Byte;
lfPitchAndFamily: Byte;
lfFaceName: array[0..LF_FACESIZE - 1] of AnsiChar;
end;

TLogFontW = packed record
lfHeight: Longint;
lfWidth: Longint;
lfEscapement: Longint;
lfOrientation: Longint;
lfWeight: Longint;
lfItalic: Byte;
lfUnderline: Byte;
lfStrikeOut: Byte;
lfCharSet: Byte;
lfOutPrecision: Byte;
lfClipPrecision: Byte;
lfQuality: Byte;
lfPitchAndFamily: Byte;
lfFaceName: array[0..LF_FACESIZE - 1] of WideChar;
end;

TLogFont = TLogFontA;

其中涉及到很多参数,其中

lfHeight: Longint;
指定以逻辑单位标定的字体高度,取值可为正负或零,对于需要随意
定义字体高度的情况下通常取负值,以保证获得实际尺寸的字体。

lfWidth: Longint;
用于指定字体的平均宽度,由于Windows系统下的大多数字体都是比例
字体因而采用平均宽度这个表示方法。若指定为0,则系统会自动根据
适当的比例自动处理宽度。

lfEscapement: Longint;
指定输出方向与当前坐标系X轴之间的以十分之一度为单位的角度。

lfOrientation: Longint;
指定每个字符与当前坐标系X轴之间的以十分之一度为单位的角度。在
Windows95中这个值等同于lfEscpement。

lfWeight: Longint;
指定范围为从0至1000的字体加重程度,400是标准字体700为加重字体,
0表示采用默认值。

lfItalic: Byte;
不为0表示采用斜体字。

lfUnderline: Byte;
不为0表示带下划线。

lfStrikeOut: Byte;
不为0表示带穿透线。

lfCharSet: Byte;
指定字体集。

lfOutPrecision: Byte;
指定输出精度。用于确定对前面一些设定值的精确程度。

lfClipPrecision: Byte;
指定裁剪精度。裁剪是Windows图形环境下的一种特殊处理,简单说就是
去掉图形中落在视图以外的部分,有助于提高图形的处理速度。

lfQuality: Byte;
指定输出质量。

lfPitchAndFamily: Byte;
指定字体的Pitch和Family。

lfFaceName: array[0..LF_FACESIZE - 1] of AnsiChar;
指定采用的字体名称。

在建立逻辑字体时,我们通常使用

lfHeight和lfWidth来确定字体的尺寸,使用lfEscapement和lfOrientation
来确定字体的输出方向,使用lfWeight
lfItalic
lfUnderline

lfStrikeOut
来确定字体的加重,斜体,下划线和穿透线,使用lfCharSet
来确定字体的字符集,通常采用系统默认的字符集。
对于lfOutPrecision
lfClipPrecision
lfQuality一般应用于对屏幕之外
的输出设备,通常采用默认值。采用lfPitchAndFamily来确定采用定宽或可
变字体和字体的家族。以lfFaceName来通过名称选择采用的字体。
另外应当注意在Windows环境下,每种字体具体输出为何种形式取决于很多
因素,需要对以上这些参数进行有效的组合才能达到所要的效果。
 
为什么不查以前的帖子呢?
这个问题太老了
//添加新纸型
procedure TForm1.Button1Click(Sender: TObject);
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('新格式3');
PaperSize.cx := 20000;//看 API 说明
PaperSize.cy := 20000;
PaperRect.Left := 1;
PaperRect.Top := 1;
PaperRect.Right := 20000;
PaperRect.Bottom := 20000;
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_INVALID_FORM_SIZE : s:= 'Invalid From Size';
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);
showmessage(s);
end;
end;
ClosePrinter(hPrinter);
end;


//选择新纸型,注意,必须用win2000的打印机驱动才可以,
//否则无效
procedure TForm1.Button2Click(Sender: TObject);
var
Device, Driver, Port: array[0..80] of Char;
DevMode: THandle;
pDevmode: PDeviceMode;
begin
Printer.GetPrinter(Device, Driver, Port, DevMode);
if DevMode <> 0 then
begin
pDevMode := GlobalLock( DevMode );
if pDevmode <> nil then
begin
pDevmode^.dmFields := pDevmode^.dmFields or
DM_FORMNAME or
DM_PAPERSIZE;
pDevmode^.dmPaperSize := DMPAPER_USER;
StrLCopy( pDevmode^.dmFormName, PChar('新格式3'), CCHFORMNAME-1 );
GlobalUnlock( Devmode );
end;
end;

end;
 
procedure TPageSetupForm.PageSetupInit;
var
IniFile: TIniFile;
begin
IniFile:=TIniFile.Create(MainDir+'/config.ini');
try
IniFile.WriteString('PageSetup', 'PageStyle', DefaultPageStyle);
IniFile.WriteInteger('PageSetup', 'PageWidth', DefaultPageWidth);
IniFile.WriteInteger('PageSetup', 'PageHeight', DefaultPageHeight);
IniFile.WriteInteger('PageSetup', 'Orientation', DefaultOrientation);
IniFile.WriteInteger('PageSetup', 'TopMargin', DefaultTopMargin);
IniFile.WriteInteger('PageSetup', 'BottomMargin', DefaultBottomMargin);
IniFile.WriteInteger('PageSetup', 'LeftMargin', DefaultLeftMargin);
IniFile.WriteInteger('PageSetup', 'RightMargin', DefaultRightMargin);
IniFile.WriteInteger('PageSetup', 'FooterMargin', DefaultFooterMargin);
IniFile.WriteInteger('PageSetup', 'CovOffsetRightSpace', DefaultCovOffsetRightSpace);
IniFile.WriteInteger('PageSetup', 'CovOffsetBottomSpace', DefaultCovOffsetBottomSpace);
IniFile.WriteInteger('PageSetup', 'CovRowSpace', DefaultCovRowSpace);
IniFile.WriteBool('PageSetup', 'CovPrnSelPrjChief', DefaultCovPrnSelPrjChief);
IniFile.WriteBool('PageSetup', 'CovPrnSelEditChief', DefaultCovPrnSelEditChief);
IniFile.WriteBool('PageSetup', 'CovPrnSelEditAssessor', DefaultCovPrnSelEditAssessor);
IniFile.WriteBool('PageSetup', 'CovPrnSelEditor', DefaultCovPrnSelEditor);
IniFile.WriteInteger('PageSetup', 'MattMaxRowCount', DefaultMattMaxRowCount);
IniFile.WriteInteger('PageSetup', 'MattRowMaxCharCount', DefaultMattRowMaxCharCount);
//DefaultDrawLineCharCount=56;
IniFile.WriteInteger('PageSetup', 'NoWidth', DefaultNoWidth);
IniFile.WriteInteger('PageSetup', 'ItemNameWidth', DefaultItemNameWidth);
IniFile.WriteInteger('PageSetup', 'MetricUnitWidth', DefaultMetricUnitWidth);
IniFile.WriteInteger('PageSetup', 'WorkAmountWidth', DefaultWorkAmountWidth);
IniFile.WriteInteger('PageSetup', 'UnitPriceWidth', DefaultUnitPriceWidth);
IniFile.WriteInteger('PageSetup', 'ValueWidth', DefaultValueWidth);
//IniFile.WriteInteger('PageSetup', 'PriceWidth', DefaultPriceWidth);
//IniFile.WriteInteger('PageSetup', 'ProPortionWidth', DefaultProPortionWidth);
IniFile.WriteInteger('PageSetup', 'RemarkWidth', DefaultRemarkWidth);
finally
IniFile.Free;
end;
end;

procedure TPageSetupForm.WriteDefaultPageSetupFromVariableToIniFile;
var
IniFile: TIniFile;
begin
IniFile:=TIniFile.Create(MainDir+'/config.ini');
try
IniFile.WriteInteger('PageSetup', 'MattMaxRowCount', nMattMaxRowCount);
IniFile.WriteInteger('PageSetup', 'MattRowMaxCharCount', nMattRowMaxCharCount);
IniFile.WriteInteger('PageSetup', 'TopMargin', nTopMargin);
IniFile.WriteInteger('PageSetup', 'BottomMargin', nBottomMargin);
IniFile.WriteInteger('PageSetup', 'LeftMargin', nLeftMargin);
IniFile.WriteInteger('PageSetup', 'RightMargin', nRightMargin);
IniFile.WriteInteger('PageSetup', 'FooterMargin', nFooterMargin);
IniFile.WriteString('PageSetup', 'PageStyle', sPageStyle);
IniFile.WriteInteger('PageSetup', 'PageWidth', nPageWidth);
IniFile.WriteInteger('PageSetup', 'PageHeight', nPageHeight);
IniFile.WriteInteger('PageSetup', 'Orientation', nOrientation);
IniFile.WriteInteger('PageSetup', 'NoWidth', nNoWidth);
IniFile.WriteInteger('PageSetup', 'ItemNameWidth', nItemNameWidth);
IniFile.WriteInteger('PageSetup', 'MetricUnitWidth', nMetricUnitWidth);
IniFile.WriteInteger('PageSetup', 'WorkAmountWidth', nWorkAmountWidth);
IniFile.WriteInteger('PageSetup', 'UnitPriceWidth', nUnitPriceWidth);
IniFile.WriteInteger('PageSetup', 'ValueWidth', nValueWidth);
//IniFile.WriteInteger('PageSetup', 'PriceWidth', nPriceWidth);
//IniFile.WriteInteger('PageSetup', 'ProPortionWidth', nProPortionWidth);
IniFile.WriteInteger('PageSetup', 'RemarkWidth', nRemarkWidth);
IniFile.WriteInteger('PageSetup', 'CovOffsetRightSpace', nCovOffsetRightSpace);
IniFile.WriteInteger('PageSetup', 'CovOffsetBottomSpace', nCovOffsetBottomSpace);
IniFile.WriteInteger('PageSetup', 'CovRowSpace', nCovRowSpace);
IniFile.WriteBool('PageSetup', 'CovPrnSelPrjChief', fCovPrnSelPrjChief);
IniFile.WriteBool('PageSetup', 'CovPrnSelEditChief', fCovPrnSelEditChief);
IniFile.WriteBool('PageSetup', 'CovPrnSelEditAssessor', fCovPrnSelEditAssessor);
IniFile.WriteBool('PageSetup', 'CovPrnSelEditor', fCovPrnSelEditor);
finally
IniFile.Free;
end;
end;

以上程序在我的软件“房地产开发估价管理系统”中实现。下载地地址:http://www.softreg.com.cn/shareware_view.asp?id=/9DE34D01-6F82-4927-8408-4B111C1D2C48/
不过现在在win2k/xp下纸张设置有问题,正在改正。
我还做到了每个项目一个打印设置,具体做法是将打印设置的数据写到每个项目的数据库里去。
 
有这么复杂吗?
在你的每一个报表上右击,有一个printingset 进行设置就行了,不用代码很简单的自己好好琢磨一下吧
 
后退
顶部