線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1963
推到 Plurk!
推到 Facebook!

与EM_FORMATRANGE使用有关的问题

尚未結案
fangwy
中階會員


發表:99
回覆:139
積分:62
註冊:2003-09-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-11-09 09:33:16 IP:218.5.xxx.xxx 未訂閱
我采取以下方式控制RichEdit打印(代码是引用本站一个大大的回贴),问题是:这段代码只能打印一页,不知如何控制打印多页. 我的思路是知道上一页打印的结束位置,重设fmtRange.chrg.cpMin NewPage一页再接着打印.但如何能知道上一页打印到那里了? 说明一下,我试过其他方法打印:RichEdit的print好象无法控制左右上下边距,而且好象遇到表格会出错(不确定是不是表格造成的错误);QRRechText,可能版本的原因,无法打印图片,一些格式如上/下标也无法打印. var printarea: Trect; x, y: Integer; richedit_outputarea: TRect; printresX, printresY: Integer; fmtRange: TFormatRange; prtRange: TEXTRANGE; begin Printer.beginDoc; try with Printer.Canvas do begin printresX := GetDeviceCaps(handle, LOGPIXELSX); printresY := GetDeviceCaps(handle, LOGPIXELSY); { Font.Name := 'Arial'; Font.Size := 14; Font.Style := [fsBold];} printarea := Rect(printresX, // 1 inch left margin printresY * 3 div 2, // 1.5 inch top margin Printer.PageWidth - printresX, // 1 inch right margin Printer.PageHeight - printresY * 3 div 2 // 1.5 inch bottom margin ); x := printarea.left; y := printarea.top; { TextOut( x, y, 'A TRichEdit print example' ); y := y TextHeight('Ag'); Moveto( x, y ); Pen.Width := printresY div 72; // 1 point Pen.Style := psSolid; Pen.Color := clBlack; LineTo( printarea.Right, y ); Inc( y, printresY * 5 div 72 );} // Define a rectangle for the rich edit text. The height is set to the // maximum. But we need to convert from device units to twips, // 1 twip = 1/1440 inch or 1/20 point. richedit_outputarea := Rect((printarea.left 2) * 1440 div printresX, y * 1440 div printresY, (printarea.right - 4) * 1440 div printresX, (printarea.bottom) * 1440 div printresY); // Tell rich edit to format its text to the printer. First set // up data record for message: fmtRange.hDC := Handle; // printer canvas handle fmtRange.hdcTarget := Handle; // ditto fmtRange.rc := richedit_outputarea; fmtRange.rcPage := Rect(0, 0, Printer.PageWidth * 1440 div printresX, Printer.PageHeight * 1440 div printresY); // the following lines select the text to print, in this case // the complete content of the rich edit control. reText.Perform(EM_EXGETSEL, 0, Longint(@fmtRange.chrg)); if fmtRange.chrg.cpMax = 0 then begin fmtRange.chrg.cpMin := 0; //reText.SelStart; fmtRange.chrg.cpMax := reText.GetTextLen - 1; end; // first measure the text, to find out how high the format rectangle // will be. The call sets fmtrange.rc.bottom to the actual height // required, if all characters in the selected range will fit into // a smaller rectangle, reText.Perform(EM_FORMATRANGE, 0, Longint(@fmtRange)); // Draw a rectangle around the format rectangle { Pen.Width := printresY div 144; // 0.5 points Brush.Style := bsClear; Rectangle( printarea.Left, y - 2, printarea.right, fmtrange.rc.bottom * printresY div 1440 2 );} // Now render the text reText.Perform(EM_FORMATRANGE, 1, Longint(@fmtRange)); // and print it reText.Perform(EM_DISPLAYBAND, 0, Longint(@fmtRange.rc)); y := fmtrange.rc.bottom * printresY div 1440 printresY * 5 div 72; // Free cached information reText.Perform(EM_FORMATRANGE, 0, 0); // TextOut( x, y, 'End of example.' ); //reText.Perform( EM_GETTEXTRANGE, 0, Longint( @prtRange)); end; finally Printer.EndDoc; end; end;
fangwy
中階會員


發表:99
回覆:139
積分:62
註冊:2003-09-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-11-10 09:55:31 IP:218.5.xxx.xxx 未訂閱
我自己解决了,原来reText.Perform(EM_FORMATRANGE, 1, Longint(@fmtRange));返回值就是最后一个字符位置 在国外网站找到了答案.
系統時間:2024-05-17 10:30:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!