S
steel
Unregistered / Unconfirmed
GUEST, unregistred user!
主 题:帮忙看看打印纸张的设置问题
作 者:oldsteel
所属论坛:C++ Builder
问题点数:20
回复次数:5
人气指数:41
发表时间:2001-8-29 15:30:51
procedure PrinterSetting(l,w:integer);
var
ADevice, ADriver, APort: array[0..255] of Char;
DeviceHandle: THandle;
DevMode: PDeviceMode;
begin
Printer.GetPrinter(ADevice, ADriver, APort, DeviceHandle);
if DeviceHandle=0 then
begin
Printer.PrinterIndex:=Printer.PrinterIndex;
Printer.GetPrinter(ADevice, ADriver, APort, DeviceHandle);
end;
if DeviceHandle=0 then
raise exception.Create('could not initialize tdevicemode structure')
else
DevMode:=GlobalLock(DeviceHandle);
with DevMode^do
begin
//设置纸张尺寸
dmFields:=dmFields or DM_PAPERSIZE;
dmPaperSize:=0;
//dmPaperSize:=DMPAPER_A4
end;
with DevMode^do
begin
//纸张长度
dmFields:=dmFields or DM_PAPERLENGTH;
dmPaperLength:=l;
end;
with DevMode^do
//设置宽度
begin
dmFields:=dmFields or DM_PAPERWIDTH;
dmPaperWidth:=w;
end;
if not DeviceHandle=0 then
GLobalUnLock(DeviceHandle);
end;
上面代码在台式机的win98,win2000server下都无法设打印纸大小,在一笔记本(win2000)则可设打印纸大小,为何?是否与操作系统版本、驱动程序有关?如何写一个在windows环境下都可用的打印机设置程序?
转移贴子到 Visual C++ Visual Basic Delphi C/C++ C++ Builder ASM 数据库开发 PowerBuilder ActiveX/COM 数据算法 软件工程 图形/游戏/多媒体 安全技术 网络/通讯 技术书籍 文件格式 C# XML/SOAP 数据仓库 VBA 主页制作 图形处理 ASP PHP Perl Java Javascript JSP 嵌入式开发 .NET Framework ADO.NET ASP.NET Web Services Web Forms Windows Forms VB.NET VC.NET Windows 9x/ME Windows NT/2000/XPdo
S Office使用 Office开发 Exchange server IIS 程序人生 软件市场 程序员考试 人才热线 建议和意见 灌水乐园 走向海外 程序员杂志 软件使用 资源使用 我看软件 寻找软件 行业软件 软件评测 Linux/Unix 硬件指南 | 贴子加分 | 密码:
回复贴子:
luhongjun(过江项羽) 回复于2001-8-29 16:50:53
http://www.csdn.net/expert/Topic/205/205435.shtm
lm09(lm820909) 回复于2001-9-3 9:42:40
我也遇上了同样的问题,下面是一些代码,希望你有用。
#include "printers.hpp"
void SetPaperSize(int w,int h) // 设置缺省打印机纸张大小 w*h(*0.1mm)
{
char Device[CCHDEVICENAME];
char Driver[MAX_PATH];
char Port[32];
THandle hDMode;
PDevMode pDMode;
TPrinter *Prn = Printer();
Prn->GetPrinter(Device,Driver,Port,hDMode);
if (hDMode!=NULL)
{
pDMode=(PDevMode)GlobalLock((HGLOBAL &hDMode);
if (pDMode!=NULL)
{
pDMode->dmPaperSize= 256;
pDMode->dmFields=pDMode->dmFields ¦
DM_PAPERSIZE;
pDMode->dmPaperLength =h;
//高 *0.1mm
pDMode->dmFields =pDMode->dmFields¦
DM_PAPERLENGTH;
pDMode->dmPaperWidth = w;
//宽 *0.1mm
pDMode->dmFields =pDMode->dmFields¦
DM_PAPERWIDTH;
}
ResetDC(Prn->Handle,pDMode);
GlobalUnlock((HGLOBAL &hDMode);
}
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
SetPaperSize(2540,1016);
// 10英寸*4 英寸
TPrinter *Prn = Printer();
Prn->begin
Doc();
Prn->Canvas->Font->Name = "宋体";
Prn->Canvas->Font->Size = 20;
Prn->Canvas->TextOutA (0,0,"页首");
Prn->NewPage();
Prn->Canvas->Font->Name = "宋体";
Prn->Canvas->Font->Size = 20;
Prn->Canvas->TextOutA (0,0,"页首");
Prn->NewPage();
Prn->Canvas->Font->Name = "宋体";
Prn->Canvas->Font->Size = 20;
Prn->Canvas->TextOutA (0,0,"页首");
Prn->EndDoc();
}
oldsteel(老钢覃) 回复于2001-9-5 13:08:10
lm09(lm820909):
你的代码与我的代码差不多,只是你设papersize为256,我设为0,从windows sdk文档看是应设为0。我跟踪过256与0两种设置,都能使dmPaperLength与dmPaperWidth得到欲设置的大小。不过,dmPaperLength与dmPaperWidth无法写进驱动程序设置纸张对话框的自定义纸张的宽度与高度,实际上打印机是以那对话框的纸张的宽度与高度打印的。我跟踪过printer.paperwidth与printer.paperheight的值,他们是那对话框的纸张的值,根本不是我欲设置的值。你的测试代码的输出范围没超出你设置的纸张大小,好象不能说明问题。另外,resetDC好象没起作用。若有更好的办法请告诉我,谢谢!
作 者:oldsteel
所属论坛:C++ Builder
问题点数:20
回复次数:5
人气指数:41
发表时间:2001-8-29 15:30:51
procedure PrinterSetting(l,w:integer);
var
ADevice, ADriver, APort: array[0..255] of Char;
DeviceHandle: THandle;
DevMode: PDeviceMode;
begin
Printer.GetPrinter(ADevice, ADriver, APort, DeviceHandle);
if DeviceHandle=0 then
begin
Printer.PrinterIndex:=Printer.PrinterIndex;
Printer.GetPrinter(ADevice, ADriver, APort, DeviceHandle);
end;
if DeviceHandle=0 then
raise exception.Create('could not initialize tdevicemode structure')
else
DevMode:=GlobalLock(DeviceHandle);
with DevMode^do
begin
//设置纸张尺寸
dmFields:=dmFields or DM_PAPERSIZE;
dmPaperSize:=0;
//dmPaperSize:=DMPAPER_A4
end;
with DevMode^do
begin
//纸张长度
dmFields:=dmFields or DM_PAPERLENGTH;
dmPaperLength:=l;
end;
with DevMode^do
//设置宽度
begin
dmFields:=dmFields or DM_PAPERWIDTH;
dmPaperWidth:=w;
end;
if not DeviceHandle=0 then
GLobalUnLock(DeviceHandle);
end;
上面代码在台式机的win98,win2000server下都无法设打印纸大小,在一笔记本(win2000)则可设打印纸大小,为何?是否与操作系统版本、驱动程序有关?如何写一个在windows环境下都可用的打印机设置程序?
转移贴子到 Visual C++ Visual Basic Delphi C/C++ C++ Builder ASM 数据库开发 PowerBuilder ActiveX/COM 数据算法 软件工程 图形/游戏/多媒体 安全技术 网络/通讯 技术书籍 文件格式 C# XML/SOAP 数据仓库 VBA 主页制作 图形处理 ASP PHP Perl Java Javascript JSP 嵌入式开发 .NET Framework ADO.NET ASP.NET Web Services Web Forms Windows Forms VB.NET VC.NET Windows 9x/ME Windows NT/2000/XPdo
S Office使用 Office开发 Exchange server IIS 程序人生 软件市场 程序员考试 人才热线 建议和意见 灌水乐园 走向海外 程序员杂志 软件使用 资源使用 我看软件 寻找软件 行业软件 软件评测 Linux/Unix 硬件指南 | 贴子加分 | 密码:
回复贴子:
luhongjun(过江项羽) 回复于2001-8-29 16:50:53
http://www.csdn.net/expert/Topic/205/205435.shtm
lm09(lm820909) 回复于2001-9-3 9:42:40
我也遇上了同样的问题,下面是一些代码,希望你有用。
#include "printers.hpp"
void SetPaperSize(int w,int h) // 设置缺省打印机纸张大小 w*h(*0.1mm)
{
char Device[CCHDEVICENAME];
char Driver[MAX_PATH];
char Port[32];
THandle hDMode;
PDevMode pDMode;
TPrinter *Prn = Printer();
Prn->GetPrinter(Device,Driver,Port,hDMode);
if (hDMode!=NULL)
{
pDMode=(PDevMode)GlobalLock((HGLOBAL &hDMode);
if (pDMode!=NULL)
{
pDMode->dmPaperSize= 256;
pDMode->dmFields=pDMode->dmFields ¦
DM_PAPERSIZE;
pDMode->dmPaperLength =h;
//高 *0.1mm
pDMode->dmFields =pDMode->dmFields¦
DM_PAPERLENGTH;
pDMode->dmPaperWidth = w;
//宽 *0.1mm
pDMode->dmFields =pDMode->dmFields¦
DM_PAPERWIDTH;
}
ResetDC(Prn->Handle,pDMode);
GlobalUnlock((HGLOBAL &hDMode);
}
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
SetPaperSize(2540,1016);
// 10英寸*4 英寸
TPrinter *Prn = Printer();
Prn->begin
Doc();
Prn->Canvas->Font->Name = "宋体";
Prn->Canvas->Font->Size = 20;
Prn->Canvas->TextOutA (0,0,"页首");
Prn->NewPage();
Prn->Canvas->Font->Name = "宋体";
Prn->Canvas->Font->Size = 20;
Prn->Canvas->TextOutA (0,0,"页首");
Prn->NewPage();
Prn->Canvas->Font->Name = "宋体";
Prn->Canvas->Font->Size = 20;
Prn->Canvas->TextOutA (0,0,"页首");
Prn->EndDoc();
}
oldsteel(老钢覃) 回复于2001-9-5 13:08:10
lm09(lm820909):
你的代码与我的代码差不多,只是你设papersize为256,我设为0,从windows sdk文档看是应设为0。我跟踪过256与0两种设置,都能使dmPaperLength与dmPaperWidth得到欲设置的大小。不过,dmPaperLength与dmPaperWidth无法写进驱动程序设置纸张对话框的自定义纸张的宽度与高度,实际上打印机是以那对话框的纸张的宽度与高度打印的。我跟踪过printer.paperwidth与printer.paperheight的值,他们是那对话框的纸张的值,根本不是我欲设置的值。你的测试代码的输出范围没超出你设置的纸张大小,好象不能说明问题。另外,resetDC好象没起作用。若有更好的办法请告诉我,谢谢!