2012-02-28 128 views
4

我正在將文本從delphi TRichedit控件輸出到打印機。有一個背景圖片,所以我用這個邏輯EM_FORMATRANGE ...打印背景顏色的墨水

myrichedit.Perform(EM_FORMATRANGE, 1, Longint(@Range)); 

...且當文本渲染它總是有一個白色的背景,無論顏色,除了正常工作的財富。任何想法爲什麼?

編輯:從發佈註釋:

RangeRANGEFORMAT,並且被賦予這樣的價值觀:

Range.hdc := aCanvas.Handle; 
Range.hdcTarget := aCanvas.Handle; 
LogX := GetDeviceCaps(Range.hdc, LOGPIXELSX); 
LogY := GetDeviceCaps(Range.hdc, LOGPIXELSY); 
Range.rc.Left := x * 1440 div LogX; 
Range.rc.Right := (x+re.ClientWidth) * 1440 div LogX; // (1440=twips/inch) 
Range.rc.Top := y * 1440 div LogY; 
Range.rc.Bottom := 5000 * 1440 div LogY; // Some bigish number 
Range.rcPage := Range.rc; 
Range.chrg.cpMin := 0; 
Range.chrg.cpMax := -1; 
+0

什麼是'範圍'?根據[MSDN](http://msdn.microsoft.com/en-us/library/windows/desktop/bb788020%28v=vs.85%29.aspx)它是一個'FORMATRANGE',但你給我們沒有關於你實際傳遞的參數的信息。如果你不告訴我們你在做什麼,很難說出什麼可能是錯誤的。 :) – 2012-02-28 23:49:32

+0

@KenWhite是的,它是一個FORMATRANGE,它的工作方式和你所期望的一樣,除了RichEdit的背景顏色沒有通過。在任何情況下,範圍只指定手柄和位置信息。一個可能的解決方案是使用0作爲第二個參數,以便它只進行測量,然後繪製該大小的填充矩形,然後在頂部透明地繪製文本,但這似乎是用大錘開裂螺母... – Terry 2012-02-29 01:30:48

+0

再次,您已經向我們提供了** no **有關您提供的作爲「範圍」內容的信息。 「請幫助我,我不會告訴你我正在做什麼,但它不起作用。」使幫助真的很難提供。因此,「我在FORMATRANGE中傳遞了一些東西(但我不會告訴你什麼可以看到它是否正確),但它不起作用,怎麼了?」。 – 2012-02-29 01:45:52

回答

0

什麼我發現是,這種解決方案是,你可以設置個別字符的背景與代碼(在將文本添加到RichEdit之前)...

var 
    Format: CHARFORMAT2; 
begin 
... 
myrichedit.SelStart:=myrichedit.GetTextLen; 
FillChar(Format, SizeOf(Format), 0); 
with Format do begin 
    cbSize := SizeOf(Format); 
    dwMask := CFM_BACKCOLOR; 
    crBackColor := charbackgroundcolor; 
    myrichedit.Perform(EM_SETCHARFORMAT, SCF_SELECTION, Longint(@Format)); 
end; 
myrichedit.SetText:='Hello'; 

...但爲了獲得整個背景顏色文本塊,然後這樣做,以繪製文本...

var 
    size : Tsize; 
    Range: TFormatRange; 
    Rect: TRect; 
    LogX, LogY : Integer; 
    bm : tbitmap; 
    aCanvas : TCanvas; 
    ExStyle: DWord; 
begin 
    aCanvas:=Printer.Canvas; 

    Range.hdc := aCanvas.Handle; 
    Range.hdcTarget := aCanvas.Handle; 

    LogX := GetDeviceCaps(Range.hdc, LOGPIXELSX); 
    LogY := GetDeviceCaps(Range.hdc, LOGPIXELSY); 

    Range.rc.Left := x * 1440 div LogX; 
    Range.rc.Right := (x+myrichedit.ClientWidth) * 1440 div LogX; // (1440=twips/inch) 
    Range.rc.Top := y * 1440 div LogY; 
    Range.rc.Bottom := 5000 * 1440 div LogY; // Some bigish number 
    Range.rcPage := Range.rc; 
    Range.chrg.cpMin := 0; 
    Range.chrg.cpMax := -1; 
    myrichedit.Perform(EM_FORMATRANGE, 0, Longint(@Range)); // Measure the formatted text 
    rect:=Range.rc; 
    rect.Left:=Range.rc.Left * LogX div 1440; 
    rect.Top:=Range.rc.Top * LogY div 1440; 
    rect.Right:=Range.rc.Right * LogX div 1440; 
    rect.Bottom:=Range.rc.Bottom * LogY div 1440; 
    acanvas.Brush.Color:=myblockcolor; 
    acanvas.FillRect(rect); // Fill the background rectangle 

    ExStyle := GetWindowLong(re.Handle, GWL_EXSTYLE); // Draw richedit transparently over coloured area 
    ExStyle := ExStyle or WS_EX_TRANSPARENT; 
    SetWindowLong(re.Handle, GWL_EXSTYLE, ExStyle); 
    myrichedit.Perform(EM_FORMATRANGE, 1, Longint(@Range)); 
end;