如何用代码实现win2000下新增自定义的纸张格式?(100分)

  • 主题发起人 主题发起人 7030
  • 开始时间 开始时间
7

7030

Unregistered / Unconfirmed
GUEST, unregistred user!
如题所示
 
http://forum.vclxx.org/topic.asp?TOPIC_ID=21107&amp;FORUM_ID=9&amp;CAT_ID=2&amp;Topic_Title=WINDOWS2000%A4U%A6p%A6%F3%A6%DB%A9w%26%2320041%3B%A5%B4%A6L%26%2332440%3B%26%2324352%3B%A4j%A4p%A1H&amp;Forum_Title=WinAPI<br><br>这个帖子上的人说能用,我用却不行<br>楼主如果搞定,记得告诉我方法啊
 
新增自定义的纸张格式<br>想增到哪去?
 
当然是增加到打印机设置里了
 
1、打开控制面板;<br>2、打开打印机;<br>3、在打印机窗口的空白出右键弹出菜单;<br>4、选择服务器属性。<br>5、在服务器属性有自定义打印纸张的设置;<br>余下的你自己处理了!
 
fsse4000,人家要的是在程序中设置,而不是这种方法
 
哦,Sorry,没看清楚。
 
搞定,多谢yanyandt2提供的网址<br>procedure PrnAddForm(const FormName: string; PaperWidth, PaperLength:integer);<br>var<br>&nbsp; PrintDevice, PrintDriver, PrintPort : array[0..255] of Char;<br>&nbsp; hDMode : THandle;<br>&nbsp; hPrinter: THandle;<br>&nbsp; FormInfo: TFormInfo1;<br>&nbsp; PaperSize: TSize;<br>&nbsp; PaperRect: TRect;<br>&nbsp; errcode: integer;<br>&nbsp; s: string;<br>begin<br>Printer.GetPrinter(PrintDevice, PrintDriver, PrintPort, hDMode);<br>OpenPrinter(PrintDevice, hPrinter, nil);<br>if hPrinter = 0 then<br>&nbsp; raise Exception.Create('Failed to open printer!');<br>FormInfo.Flags := FORM_USER;<br>FormInfo.pName := PChar(FormName);<br>PaperSize.cx := PaperWidth;<br>PaperSize.cy := PaperLength;<br>PaperRect.Left := 0;<br>PaperRect.Top := 0;<br>PaperRect.Right := PaperWidth;<br>PaperRect.Bottom := PaperLength;<br>FormInfo.Size := PaperSize;<br>FormInfo.ImageableArea := PaperRect;<br>if not AddForm(hPrinter, 1, @FormInfo) then<br>&nbsp; begin<br>&nbsp; errcode := GetLastError;<br>&nbsp; if errcode &lt;&gt; ERROR_FILE_EXISTS then // Form name exists?<br>&nbsp; begin<br>&nbsp; case errcode of<br>&nbsp; ERROR_ACCESS_DENIED: s := 'Access is denied';<br>&nbsp; ERROR_INVALID_HANDLE: s := 'The handle is invalid';<br>&nbsp; ERROR_NOT_READY: s := 'The device is not ready';<br>&nbsp; ERROR_CALL_NOT_IMPLEMENTED:<br>&nbsp; s := 'Function "AddForm" is not supported on this system';<br>&nbsp; else<br>&nbsp; s := 'Failed to add a Form (paper) name!';<br>&nbsp; end;<br>raise Exception.Create(s);<br>end;<br>end;<br>ClosePrinter(hPrinter);<br>end;<br><br>procedure PrnSetPaperSizeNT(FormName: string; PaperWidth, PaperLength:integer);<br>var<br>Device, Driver, Port: array[0..80] of Char;<br>DevMode: THandle;<br>pDevmode: PDeviceMode;<br>begin<br>// Get printer device name etc.<br>Printer.GetPrinter(Device, Driver, Port, DevMode);<br>// force reload of DEVMODE<br>Printer.SetPrinter(Device, Driver, Port, 0) ;<br>// get DEVMODE handle<br>Printer.GetPrinter(Device, Driver, Port, DevMode);<br>if DevMode &lt;&gt; 0 then<br>begin<br>// lock it to get pointer to DEVMODE record<br>pDevMode := GlobalLock( DevMode );<br>if pDevmode &lt;&gt; nil then<br>try<br>with pDevmode^ do<br>begin<br>// modify form<br>StrLCopy( dmFormName, PChar(FormName), CCHFORMNAME-1 );<br>// tell printer driver that dmFormname field contains<br>// data it needs to inspect.<br>dmPaperWidth := PaperWidth;<br>dmPaperLength := PaperLength;<br>dmFields := dmFields or DM_FORMNAME or DM_PAPERWIDTH or DM_PAPERLENGTH;<br>end;<br>finally<br>GlobalUnlock( Devmode ); // unlock devmode handle.<br>end;<br>end; { If }<br>end;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>//单位是千分之一毫米<br>PrnAddForm(edFormName.Text,StrToInt(edPaperWidth.Text),StrToInt(edPaperLength.Text));<br>PrnSetPaperSizeNT(edFormName.Text,StrToInt(edPaperWidth.Text),StrToInt(edPaperLength.Text));<br>end;
 
我也刚搞定<br>原来是必须使用win2000的打印机驱动,唉,折磨了我N天。。。 。。。<br>嘿嘿,给分吧?
 
接受答案了.
 
后退
顶部