2013-06-12 2 views
3

DrawThemeTextEx은 Windows Vista 및 7의 Aero 텍스트, 즉 빛나는 후광이있는 텍스트를 그리는 API입니다. DrawThemeTextEx를 사용하여 그린 텍스트의 광선 색상은 어떻게 변경합니까?

DrawThemeTextEx으로 그릴 때, 당신은 DTTOPTS 구조의 crText 필드를 설정하고 지정 DTT_TEXTCOLORdwFlags 필드에 crText 필드에 유효한 값이 표시하는 데 사용되는 텍스트 색상을 변경합니다. 그러나 텍스트 뒤의 희미한 광선 효과는 항상 흰색을 그립니다. shadow or border colours 및 해당 플래그를 설정해도 광선 색상에는 영향을 미치지 않습니다. DTTOPTS 구조의 광선 색상에 대한 설정이 없습니다.

Glowing text with a custom text color, but white glow color

여기에 사용자 정의 텍스트 색상 (적색)를 볼 수 있지만 여전히 텍스트 뒤에 흰색 흐리게 빛이 함께 렌더링됩니다. 가벼운 텍스트 색상의 경우 텍스트를 읽기 쉽게 만들어주기 때문에 검은 색 빛이 대신 표시됩니다.

이 하얀 후광/광선의 색상을 어떻게 변경합니까? 예를 들어, 효과가있는 Dwm* API 또는 문서화되지 않은 플래그가 있습니까?

+0

대답이 아니지만 사용자 지정 창 프레임을 만든 다음 그 안에 그림을 그릴 수 있습니다. 이 경우 원하는대로 텍스트를 표시 할 수 있습니다. 자세한 내용은 [MSDN] (http://msdn.microsoft.com/en-us/library/bb688195%28VS.85%29.aspx)을 참조하십시오. –

+0

제가 이해하는 한, Yahoo 메신저는 동일한 접근 방식을 구현했습니다 : [screenshot ] (http://www.acasa3d.com/wp-content/uploads/2010/11/yahoomessenger11aero.png) –

+0

감사합니다 @ AshtonHearts,하지만 어떻게 문제가 해결되는지 이해할 수 없습니다. 어떻게 사용자 정의 창 프레임을 만들면 DrawThemeTextEx로 그려진 텍스트의 배경 광선 색상이 변경됩니까? 내가 아는 한 항상 흰색입니다. 스크린 샷은 실제로 배경이 아닌 텍스트를 전혀 표시하지 않습니다. 제목 표시 줄에 그려 넣은 로고를 언급 한 것일 수도 있습니다. –

답변

5

짧은 대답은 DrawThemeTextEx API를 사용할 수 없다는 것입니다. 배경색 만 변경하면 텍스트 색상 만 변경할 수 있습니다.

긴 대답은 당신이하여 동일한 효과를 얻을 수 있다는 것입니다 : 광선 텍스트 그리기

  • 을;
  • 알파를 색상 강도로 사용하여 결과 이미지를 색조하고 텍스트의 단일 색상 이미지와 광선을 얻습니다.
  • 광선 효과가없는 위쪽에 텍스트를 그립니다.
화상 염색 기술

번째 단계의 결과를 나타내는

Black text with a red glow background

이미지 예는 설명을 요구 주이다.

임시 비트 맵에 광선이있는 검은 텍스트를 그립니다. 그런 다음, 흰색과 검은 색 (흰색은 Windows 렌더링의 유일한 색입니다), 다양한 알파 및 텍스트 앤티 엘리 어싱 된 픽셀의 가장자리에있는 흑백 사이에 있습니다 (사용되는 알고리즘으로 인해). 즉, 회색의 순수한 그늘이 아니어야합니다. 당신이

두 가지 옵션이 있습니다 흰색 빛과 텍스트 안티 앨리어싱을 볼 수 있도록

Glowing text on a coloured background, zoomed in

빛나는 텍스트, 컬러 배경 위에 그려진. 첫 번째는 흰색 ("흰색"대 "검정") 및 색조를 사용하여 흰색 영역을 배경색으로, 검정색 영역을 텍스트 색으로 변경하는 것입니다.이 작업은 가능하지만 텍스트가 Windows에서 렌더링되고 앤티 엘리 어싱되는 방법과 비교하여 특히 컬러 텍스트에서 앤티 앨리어싱 오류가 발생할 수 있습니다. 더 좋은 방법은 텍스트가 겹쳐지고 배경 조명에 앤티 앨리어싱이 적용된다는 것을 인식하는 것입니다. 모든 색상을 한 가지 색상으로 채 웁니다. 100 % 알파 텍스트는 100 % 흰색 글로우로 처리 할 수 ​​있습니다. 텍스트 - 배경에 대한 앤티 앨리어싱을 다시 텍스트 위에 그립니다.

색조는 아주 간단합니다. 픽셀은 알파 값을 가지며 premultiplied alpha colour 값을 갖습니다. 예를 들어 (2, 2, 2, 2)의 ABGR은 2의 알파이며 흰색의 BGR은 알파에 미리 곱합니다. 기존의 색을 무시하고 픽셀의 기존 알파를 기반으로 0이 아닌 알파 픽셀을 배경색의 미리 곱한 알파 값으로 설정합니다.

임시 비트 맵을 통해 TQuadColor struct to represent four bytes of an alpha-aware 32-bit pixel 루프를 사용하여 강도로 기존의 알파를 사용하여 색상을 설정 (이 쿼드 색을 얻어

procedure TQuadColor.SetFromColorMultAlpha(const Color: TQuadColor); 
var 
    MultAlpha : Byte; 
begin 
    Red := Color.Red; 
    Green := Color.Green; 
    Blue := Color.Blue; 
    MultAlpha := Round(Integer(Alpha) * Integer(Color.Alpha)/255.0); 
    SetAlpha(MultAlpha, MultAlpha/255.0); 
end; 

:

// PQuad is a pointer to the first pixel, a TQuadColor (see link, basically a packed struct of ABGR bytes) 
for Loop := 0 to FWidth * FHeight - 1 do begin 
    if PQuad.Alpha <> 0 then begin 
    PQuad.SetFromColorMultAlpha(Color); // Sets the colour, and multiplies the alphas together 
    end; 
    Inc(PQuad); 
end; 

키는 PQuad.SetFromColorMultAlpha 인 즉 RGB가있는 알파), 두 개의 알파를 곱하여 결과 알파를 얻습니다. 투명 색상으로 색조를 조정할 수 있습니다.

procedure TQuadColor.SetAlpha(const Transparency: Byte; const PreMult: Single); 
begin 
    Alpha := Transparency; 
    Blue := Trunc(Blue * PreMult); 
    Green := Trunc(Green * PreMult); 
    Red := Trunc(Red * PreMult); 
end; 

결과가 착 그로 :

Tinted glow

가 (동일한 텍스트 렌더링을 유지하기 위해 same API를 사용하여) 상부 위에 텍스트를 그리기 아니오SetAlpha는 미리 곱셈 알파로 변환 빛 :

Tinted glow behind text

그리고 요 유색이 아닌 흰색 글로우 색상의 텍스트가 빛납니다.

Google 코드의 전체 소스 코드는 MPL-licensed TTransparentCanvas project에서 찾을 수 있습니다.

관련 문제