2010-04-22 4 views
2

저는 Aero 유리 효과를 사용하는 응용 프로그램을 가지고 있으므로 각 픽셀에는 빨강, 녹색 및 파랑 값 이외에 알파 값이 있습니다. 단색 흰색 배경 (알파 = 255)이있는 사용자 지정 그리기 컨트롤이 하나 있습니다. GDI 텍스트 함수를 사용하여 솔리드 텍스트를 컨트롤에 그리기를 원합니다. 그러나이 함수는 알파 값을 임의의 값으로 설정하여 텍스트가 내 응용 프로그램 아래에있는 모든 윈도우를 반투명하게 표시합니다.GDI 텍스트 함수를 호출 한 후 알파 값을 수정하려면 어떻게합니까?

텍스트 렌더링을 호출 한 후 컨트롤의 모든 픽셀을 살펴보고 알파 값을 다시 255로 설정하고 싶습니다. 어떻게하는 것이 가장 좋습니까?

나는 BitBlt, GetPixelSetPixel 기능과 함께 운이 없었습니다. 그들은 알파 값을 모르는 것처럼 보입니다.

  • 그리기 비트 맵으로, 다음 장치에 비트 맵을 복사 :

    는 여기에 내가 생각하고 거부 한 다른 솔루션을있는이 방법, 텍스트 렌더링의 특성을 사용하지 않습니다 모니터 (예 : ClearText). GDI가 비트 맵 에 정확히으로 렌더링되도록하는 방법을 알면 내 문제도 해결됩니다.

  • 텍스트 렌더링에 GDI + 사용 :이 응용 프로그램은 원래 Aero 지원 작업을 시작하기 전에 텍스트 렌더링에 GDI +를 사용했습니다. GDI +로 문자열을 정확하게 측정하려고 어려움을 겪었 기 때문에 GDI로 전환했습니다. 나는 차라리 뒤를 돌아 보지 않을 것이다.
  • 문제의 제어를 피하기 위해 Aero 영역을 설정하십시오. 내 응용 프로그램의 윈도우는 실제로 다른 프로세스에서 실행되는 다른 응용 프로그램의 하위 윈도우입니다. 최상위 창에서 Aero 설정을 직접 제어 할 수는 없습니다.

응용 프로그램은 Win32 API 함수를 호출하기 위해 Interop를 사용하는 것이 아니지만 Windows Forms를 사용하여 C#으로 작성되었습니다.

답변

1

다음은 결국 내가 생각해 낸 해결책입니다. 일종의 추악하고 아마도 단순화 될 수 있지만 작동합니다. 원래의 Graphics 객체 (즉, 화면)를 기반으로 BufferedGraphics 객체를 만드는 것이 아이디어입니다. BufferedGraphics 객체에서 TextRenderer.DrawText()는 화면에 그리는 경우와 똑같이 텍스트를 렌더링합니다. 그런 다음 일반 그래픽 객체를 만들고 Buffered Graphics 객체를 일반 그래픽 객체에 복사 한 다음 최종적으로 일반 그래픽 객체를 화면에 그립니다. CompositingMode의 모든 설정

Rectangle inner = new Rectangle(Point.Empty, ContentRectangle.Size); 
using (BufferedGraphics bg = BufferedGraphicsManager.Current.Allocate(e.Graphics, inner)) { 
    using (Bitmap bmp = new Bitmap(inner.Width, inner.Height, bg.Graphics)) { 
     using (Graphics bmpg = Graphics.FromImage(bmp)) { 
      bg.Graphics.Clear(BackColor); 
      do_my_drawing(bg.Graphics); 
      bg.Graphics.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy; 
      e.Graphics.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy; 
      bmpg.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy; 

      bg.Render(bmpg); 
      e.Graphics.DrawImageUnscaledAndClipped(bmp, ContentRectangle); 
     } 
    } 
} 

아마 속성을 필요는 없지만, 내가 가진 일단은 내가 필요로하는 (있는 경우) 알아 내기 위해 모든 순열을 테스트 귀찮게하지 않은 작업입니다.

+0

코드 스타일에 대한 메모 : 중괄호없이 서로를 사용하여 모든 using() 문을 쓸 수 있습니다. (something)
사용 (something)
(something)
{...} – ygoe

+0

그냥 궁금 해서요. , GDI + 텍스트 렌더링을 사용하여이 구현을 성능 테스트 해 보셨습니까? – series0ne

+0

또한 투명한 비트 맵을 사용하도록 수정 될 수 있습니까? - 분명히 BufferedGraphics에서 사용하는 버퍼는 알파 채널을 지원하지 않습니다 ... 어떤 생각입니까? – series0ne

0

별도의 비트 맵에서 GDI +를 사용하여 화면에 복사 해보십시오. 이점은 text drawn with GDI+의 알파는 비트 맵을 투명하게 만드는 대신 비트 맵의 ​​색상을 표시합니다 (흰색으로 칠한 것임).

실제로 GDI +에는 버그가 있거나 정확하지 않은 텍스트 측정 기능이 있습니다. 하지만 아마도 GDI functions을 사용할 수 있습니다. 결국 GDI + 텍스트 렌더링은 현재 가지고있는 GDI 텍스트 렌더링과 똑같아 야하므로 시도해 볼 가치가 있습니다.

+0

불행히도 Graphics.DrawString의 GDI + 텍스트 함수는 TextRenderer.DrawText의 GDI와 정확히 같은 텍스트를 렌더링하지 않습니다. 텍스트는 항상 조금 더 넓어서 좀 더 멋지게 보입니다.그러나 Windows 7에서는 차이점이 XP보다 (ClearType을 사용하는) XP보다 작아 보입니다. – ygoe

관련 문제