2012-02-28 20 views
4

デルファイの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

「Range」とは何ですか? [MSDN](http://msdn.microsoft.com/en-us/library/windows/desktop/bb788020%28v=vs.85%29.aspx)によると、それは「書式」ですが、あなたが実際にそのパラメータとして渡しているものに関する情報はありません。あなたがしていることを私たちに伝えていないなら、何が間違っているのかを知るのは難しいです。 :) –

+0

@KenWhiteはいそれは形式であり、RichEditの背景色が通っていないことを除いて、あなたが期待するようにすべて動作します。範囲は、どの場合でもハンドルと位置情報のみを指定します。 1つの可能な解決策は、2番目のパラメータとして0を使用して、そのサイズの塗りつぶし矩形を描画し、その上にテキストを透明に描画しますが、それはスレッジハンマーでナットをクラックさせるようなものです... – Terry

+0

ここでも、あなたは 'Range 'の内容として何を提供しているかについて私たちに** no **の情報を与えました。 「私を助けてください。私はあなたに何をしているのか正確に伝えるつもりはありませんが、それは機能しません」本当に助けを提供するのが難しいです。それで、「私は「書式」で何かを渡しているのですが(それが正しいかどうかをあなたに教えてくれるわけではありませんが、うまくいきません。 –

答えて

0

私は何を見つけたことはこれに対する解決策は、あなたが設定できるということであるということです(リッチエディットにテキストを追加する前に)コードを使用して、個々の文字の背景...

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;