2012-11-24 6 views
4

내가합니다 (BiDiModebdLeftToRight 될 때처럼) 왼쪽 방향 오른쪽 Explorer::Treeview 클래스의 ttGlyphClosed 요소를 그릴 노력하고있어. 나는 오프 스크린 비트 맵을 투명하게 만드는 방법을 모른다는 문제가있다. 비트 맵의 ​​배경은 항상 흰색입니다. 내가 이미지를 미러링하려면 다음 코드를 사용하고방법 (RTL) 방향을 오른쪽에서 왼쪽으로의 소자 부분을 그리는?

:

procedure TForm5.FormPaint(Sender: TObject); 
var 
    bm: TBitmap; 
    ARect: TRect; 
    Details: TThemedElementDetails; 
begin  
    if ExplorerTreeviewhTheme = 0 then 
    ExplorerTreeviewhTheme := OpenThemeData(0, 'Explorer::Treeview'); 

    ARect := Rect(20, 20, 40, 40); 
    Details := ThemeServices.GetElementDetails(ttGlyphClosed); 
    DrawThemeBackground(ExplorerTreeviewhTheme, Canvas.Handle, 
    Details.Part, Details.State, ARect, nil); //Ok 

    bm := TBitmap.Create; 
    try 
    bm.Width := 20; 
    bm.Height := 20; 

    ARect := Rect(00, 00, 20, 20); 
    DrawThemeBackground(ExplorerTreeviewhTheme, bm.Canvas.Handle, 
     Details.Part, Details.State, ARect, nil); 

    // rendered result has white background 
    Canvas.Draw(60, 10, bm);  
    // rendered result is mirrored but has also white background 
    StretchBlt(Canvas.Handle, 100, 10, -20, 20, bm.Canvas.Handle, 0, 0, 20, 20, SRCCOPY); 
    finally 
    bm.Free; 
    end;  
end; 

질문 오른쪽 ((RTL 읽기 용) DrawThemeBackground 기능에 의해 그려진 요소를 반영하는 방법 또는 RTL이 기능을 사용하는 방법입니다 왼쪽으로) 렌더링?

답변

4

사용 SetLayout을 기억한다.

function SetLayout(hdc: HDC; dwLayout: DWORD): DWORD; stdcall; 
    external 'gdi32' name 'SetLayout'; 

const 
    LAYOUT_RTL = $00000001; 

procedure TForm1.FormPaint(Sender: TObject); 
var 
    ExplorerTreeviewhTheme: HTHEME; 
    Details: TThemedElementDetails; 
    ARect: TRect; 
    Size: TSize; 
begin 
    ExplorerTreeviewhTheme := OpenThemeData(Handle, 'Explorer::Treeview'); 
    Details := ThemeServices.GetElementDetails(ttGlyphClosed); 
    GetThemePartSize(ExplorerTreeviewhTheme, Canvas.Handle, Details.Part, 
     Details.State, nil, TS_DRAW, Size); 

    ARect := Rect(20, 30, 20 + Size.cx, 30 + Size.cy); 

    // normal layout 
    DrawThemeBackground(ExplorerTreeviewhTheme, Canvas.Handle, 
         Details.Part, Details.State, ARect, nil); 

    // switched layout 
    SetLayout(Canvas.Handle, LAYOUT_RTL); 

    // calculate the rectangle for RTL as if it's in LTR 
    OffsetRect(ARect, 0, Size.cy); // align to the bottom of the first image so that we can see 
    ARect.Left := ClientWidth - ARect.Left - Size.cx; 
    ARect.Right := ARect.Left + Size.cx; 

    DrawThemeBackground(ExplorerTreeviewhTheme, Canvas.Handle, 
         Details.Part, Details.State, ARect, nil); 

    // restore layout 
    SetLayout(Canvas.Handle, 0); 
    CloseThemeData(ExplorerTreeviewhTheme); 
end; 

출력 : 테마 API는 16px 부 크기가 6 픽셀 넓은 삼각형을 그리는 enter image description here

(W7 에어로). 이 부분에서 이미지의 위치를 ​​알 수 없을 것이기 때문에, 당신은 더 나은 그것을 정렬 할 수 없습니다.

1

당신이 그렇게 내가 할 수있는 동안 내가 공정이 물건을하지 않은

마스크의 가능한 사용을 포함하여, 대안을 조사해야 할 수 있습니다 당신은 당신의 stretchblt 호출에 SRCCOPY를 사용하고,하지만 난 생각 TLama 당신이 그리기 전에 캔버스의 레이아웃을 전환 할 자신의 지금 삭제 대답 가리 켰을 때, 'T는 정확히