我调用documentproperties函数显示打印首选项让用户设置
但改了以后没有生效,比如将纸张从A4改为16k,重新调用的时候显示的还是A4
代码如下,帮忙给看一下procedure SetupPrinter(hWnd: HWND);
var
strPrinterName : String;
PrinterName, Driver, Port : array[0..MAX_PATH] of Char;
DevModeHandle : THandle;
phPrinter: Cardinal;
pCmd: PChar;
DevMode: PDeviceMode;
iRet: Integer;
PrinterDefaults: TPrinterDefaults;
pDMode : PDevMode;
hd: HDC;
begin
if Printer.Printers.Count < 1 then
begin
MessageBox(hWnd, PChar('请首先安装打印机!'), PChar('打印机设置'),
MB_OK or MB_ICONSTOP);
Exit;
end;
SetLength(strPrinterName,MAX_PATH);
Printer.GetPrinter(PrinterName, Driver, Port, DevModeHandle);
strPrinterName := PrinterName;
PrinterDefaults.pDatatype := 0;
PrinterDefaults.pDevMode := 0;
PrinterDefaults.DesiredAccess := PRINTER_ACCESS_USE;
if not OpenPrinter(PChar(strPrinterName), phPrinter, @PrinterDefaults) then
begin
MessageBox(hWnd, '获取打印机信息出错', '错误', MB_ICONWARNING);
Exit;
end;
try
//PrinterProperties(0, phPrinter);
iRet := DocumentProperties(hWnd, phPrinter, PChar(strPrinterName),
DevMode^, DevMode^, 0);
if iRet < 0 then
begin
MessageBox(hWnd, '获取打印机信息出错', '错误', MB_ICONWARNING);
Exit;
end;
GetMem(DevMode, iRet);
try
iRet := DocumentProperties(hWnd, phPrinter, PChar(strPrinterName),
DevMode^, DevMode^, DM_OUT_BUFFER);
if iRet < 0 then
begin
MessageBox(hWnd, '获取打印机信息出错', '错误', MB_ICONWARNING);
Exit;
end;
iRet := DocumentProperties(hWnd, phPrinter, PChar(strPrinterName),
DevMode^, DevMode^, DM_OUT_BUFFER or DM_IN_BUFFER or DM_IN_PROMPT);
if iRet < 0 then
begin
MessageBox(hWnd, '设置打印机信息出错', '错误', MB_ICONWARNING);
Exit;
end;
if iRet = IDCANCEL then
Exit;
iRet := DocumentProperties(hWnd, phPrinter, PChar(strPrinterName),
DevMode^, DevMode^, DM_OUT_BUFFER or DM_IN_BUFFER);
if iRet < 0 then
begin
MessageBox(hWnd, '设置打印机信息出错', '错误', MB_ICONWARNING);
Exit;
end;
Printer.Refresh;
finally
FreeMem(DevMode);
end;
finally
ClosePrinter(phPrinter);
end;
end;
但改了以后没有生效,比如将纸张从A4改为16k,重新调用的时候显示的还是A4
代码如下,帮忙给看一下procedure SetupPrinter(hWnd: HWND);
var
strPrinterName : String;
PrinterName, Driver, Port : array[0..MAX_PATH] of Char;
DevModeHandle : THandle;
phPrinter: Cardinal;
pCmd: PChar;
DevMode: PDeviceMode;
iRet: Integer;
PrinterDefaults: TPrinterDefaults;
pDMode : PDevMode;
hd: HDC;
begin
if Printer.Printers.Count < 1 then
begin
MessageBox(hWnd, PChar('请首先安装打印机!'), PChar('打印机设置'),
MB_OK or MB_ICONSTOP);
Exit;
end;
SetLength(strPrinterName,MAX_PATH);
Printer.GetPrinter(PrinterName, Driver, Port, DevModeHandle);
strPrinterName := PrinterName;
PrinterDefaults.pDatatype := 0;
PrinterDefaults.pDevMode := 0;
PrinterDefaults.DesiredAccess := PRINTER_ACCESS_USE;
if not OpenPrinter(PChar(strPrinterName), phPrinter, @PrinterDefaults) then
begin
MessageBox(hWnd, '获取打印机信息出错', '错误', MB_ICONWARNING);
Exit;
end;
try
//PrinterProperties(0, phPrinter);
iRet := DocumentProperties(hWnd, phPrinter, PChar(strPrinterName),
DevMode^, DevMode^, 0);
if iRet < 0 then
begin
MessageBox(hWnd, '获取打印机信息出错', '错误', MB_ICONWARNING);
Exit;
end;
GetMem(DevMode, iRet);
try
iRet := DocumentProperties(hWnd, phPrinter, PChar(strPrinterName),
DevMode^, DevMode^, DM_OUT_BUFFER);
if iRet < 0 then
begin
MessageBox(hWnd, '获取打印机信息出错', '错误', MB_ICONWARNING);
Exit;
end;
iRet := DocumentProperties(hWnd, phPrinter, PChar(strPrinterName),
DevMode^, DevMode^, DM_OUT_BUFFER or DM_IN_BUFFER or DM_IN_PROMPT);
if iRet < 0 then
begin
MessageBox(hWnd, '设置打印机信息出错', '错误', MB_ICONWARNING);
Exit;
end;
if iRet = IDCANCEL then
Exit;
iRet := DocumentProperties(hWnd, phPrinter, PChar(strPrinterName),
DevMode^, DevMode^, DM_OUT_BUFFER or DM_IN_BUFFER);
if iRet < 0 then
begin
MessageBox(hWnd, '设置打印机信息出错', '错误', MB_ICONWARNING);
Exit;
end;
Printer.Refresh;
finally
FreeMem(DevMode);
end;
finally
ClosePrinter(phPrinter);
end;
end;
解决方案 »
- 如何用程序对cxTreeList显示的数据进行导出到电子表格里?最好附源码
- 关于用TIdTcpClient和TIdTcpServer传递XML数据的问题~~!
- *** 高分请教:MySQL的问题,请注意不是SQLServer ***
- 我想让我的程序里面加上开机就启动,并且占据屏幕。。。程序关闭就自动关机?分不够另外开帖!!!急!
- 在Tquery.sql.add中是否可以使用集合性函数(sum,avg等),若不能用应怎么处理。不想用Tstoredproc
- 寻求devexpress flowchart 1.2.1版本,可以加分到1200,谢谢
- 问一下,delphi 开发 rs232 用什么组件最好!
- 0表示出库1表示入库请问这个是让用户自己选呢,还是不让用户选
- 菜问题,20分白送!!想知道DELPHI 5的ADO升级包解决了什么问题,不升级行吗?
- 急!!!如何做这个控件?
- 请问除了用RichEdit部件能处理.Rtf文件,还有什么部件或方法来处理呢?(Delphi有一个Bug)
- 极其简单的delphi问题,会delphi就行
DevMode不能用DM_OUT_BUFFER参数,不然取到的是默认之
DvMode := GlobalLock(DM_OUT_BUFFER);不过打印机不能变才行