2012-02-28 5 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

'범위'란 무엇입니까? [MSDN] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb788020%28v=vs.85%29.aspx)에 따르면 그것은 'FORMATRANGE'이지만, 우리는 실제로 매개 변수로 전달하는 것에 대한 정보가 없습니다. 자신이하는 일을 우리에게 말하지 않으면 무엇이 잘못 될지 말할 수 없습니다. :) –

+0

@KenWhite 그렇습니다. 형식이고 RichEdit의 배경색이 나오지 않는다는 점을 제외하고는 모두 예상대로 작동합니다. 범위는 어떤 경우에도 핸들과 위치 정보 만 지정합니다. 한 가지 가능한 해결책은 두 번째 매개 변수로 0을 사용하여 크기를 채운 다음 채워진 직사각형을 그려 그 위에 투명하게 텍스트를 그릴 수 있지만 슬그머니 해머로 너트를 부수는 것처럼 보입니다 ... – Terry

+0

다시 말하지만, 당신은 우리가 ** Range **의 내용으로 제공하는 것에 대한 ** 정보를 제공하지 않았습니다. "제발 도와주세요. 내가하는 일을 정확히 말하지는 않겠지 만, 효과가 없습니다." 도움을 제공하기가 정말로 어렵습니다. 그래서 "나는 형식 체계 (format) 안에 뭔가를 전달하고있다. (그러나 올바른지를 알 수 있도록 무엇을 말할 수는 없지만) 작동하지 않는다. 무엇이 잘못 되었는가?" –

답변

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; 
관련 문제