2009-09-22 18 views
3

아무도 ARGB에서 해당 창문 색상 계산 방법을 말할 수 있습니까? 나는 ColorTranslator.ToWin32()가 계산을 수행하지만 어떻게 처리되는지 알고있다.어떻게 Windows 색상 ARGB에서 계산 얻을

또한 OLE 색과 windows (win32) 색의 차이점은 무엇입니까?

JD.

답변

2

.NET의 색상 객체에는 알파 채널 (즉, 투명도)이 포함되어 있지만 Win32 색상은 순수 RGB입니다. 두 사람은 다음과 같이 할 사이에 따라서 변환 :

static public int ConvertColourToWindowsRGB(Color dotNetColour) 
    { 
     int winRGB = 0; 

     // windows rgb values have byte order 0x00BBGGRR 
     winRGB |= (int)dotNetColour.R; 
     winRGB |= (int)dotNetColour.G << 8; 
     winRGB |= (int)dotNetColour.B << 16; 

     return winRGB; 
    } 

    static public Color ConvertWindowsRGBToColour(int windowsRGBColour) 
    { 
     int r = 0, g = 0, b = 0; 

     // windows rgb values have byte order 0x00BBGGRR 
     r = (windowsRGBColour & 0x000000FF); 
     g = (windowsRGBColour & 0x0000FF00) >> 8; 
     b = (windowsRGBColour & 0x00FF0000) >> 16; 

     Color dotNetColour = Color.FromArgb(r, g, b); 

     return dotNetColour; 
    } 
+0

답장 John 님, ColorTranslator.ToWin32()/FromWinW32()의 기능은 무엇입니까? 또한, OLE 색 무엇입니까? JD. –

+1

본질적으로 예 - Alexandre가 해체 된 코드가 매우 유사하다는 것을 보여주었습니다. OLE 색의 개념은 색이 "단추면"과 같은 시스템 색임을 나타내는 플래그를 포함 할 수 있다는 것입니다. 이들은 다른 운영 체제/테마에서 다르게 나타날 수 있으므로 응용 프로그램을 현재 Windows 테마와 일치 시키려면이 옵션이 유용합니다. 플래그를 포함하지 않으면 Win32 색상처럼 작동합니다. –

+1

설명을 주신 John에게 감사드립니다. 비트와 시프트 연산을 한 번도 사용 해 본 적이 없으므로 예제를 통해이를 사용하는 방법을 배웠습니다. 아래 Alex에게 감사 드리며 앞으로 Reflector를 더 많이 사용하려고 노력할 것입니다. –

3

(반사경 등)는 IL 디스어셈블러를 사용하여, 당신은) (ColorTranslator.ToWin32의 코드를 얻을 수 있습니다. ToWin32 색상은 알파 값을 사용하지 않습니다. 색상은 표준 시스템 색 다르게 경우

public static int ToWin32(Color c) 
{ 
    return ((c.R | (c.G << 8)) | (c.B << 0x10)); 
} 

ColorTranslator.ToOle (...)는이 ToWin32 변환 사용하고, 테스트입니다 :

public static int ToOle(Color c) 
{ 
    if (c.IsKnownColor) 
    { 
     switch (c.ToKnownColor()) 
     { 
      case KnownColor.ActiveBorder: 
       return -2147483638; 

      case KnownColor.ActiveCaption: 
       return -2147483646; 

      case KnownColor.ActiveCaptionText: 
       return -2147483639; 

      case KnownColor.AppWorkspace: 
       return -2147483636; 

      case KnownColor.Control: 
       return -2147483633; 

      case KnownColor.ControlDark: 
       return -2147483632; 

      case KnownColor.ControlDarkDark: 
       return -2147483627; 

      case KnownColor.ControlLight: 
       return -2147483626; 

      case KnownColor.ControlLightLight: 
       return -2147483628; 

      case KnownColor.ControlText: 
       return -2147483630; 

      case KnownColor.Desktop: 
       return -2147483647; 

      case KnownColor.GrayText: 
       return -2147483631; 

      case KnownColor.Highlight: 
       return -2147483635; 

      case KnownColor.HighlightText: 
       return -2147483634; 

      case KnownColor.HotTrack: 
       return -2147483635; 

      case KnownColor.InactiveBorder: 
       return -2147483637; 

      case KnownColor.InactiveCaption: 
       return -2147483645; 

      case KnownColor.InactiveCaptionText: 
       return -2147483629; 

      case KnownColor.Info: 
       return -2147483624; 

      case KnownColor.InfoText: 
       return -2147483625; 

      case KnownColor.Menu: 
       return -2147483644; 

      case KnownColor.MenuText: 
       return -2147483641; 

      case KnownColor.ScrollBar: 
       return -2147483648; 

      case KnownColor.Window: 
       return -2147483643; 

      case KnownColor.WindowFrame: 
       return -2147483642; 

      case KnownColor.WindowText: 
       return -2147483640; 

      case KnownColor.ButtonFace: 
       return -2147483633; 

      case KnownColor.ButtonHighlight: 
       return -2147483628; 

      case KnownColor.ButtonShadow: 
       return -2147483632; 

      case KnownColor.GradientActiveCaption: 
       return -2147483621; 

      case KnownColor.GradientInactiveCaption: 
       return -2147483620; 

      case KnownColor.MenuBar: 
       return -2147483618; 

      case KnownColor.MenuHighlight: 
       return -2147483619; 
     } 
    } 
    return ToWin32(c); 
} 

그것은 의미를 당신은 컬러 색상 =는 systemColors를 선언하는 경우 .ControlText, ColorTranslator.ToOle (color)는 -2147483630을 반환하지만 색상을 사용자 정의 ARGB 색상으로 설정하면 ColorTranslator.ToOle은 표준 ToWin32() 값을 반환합니다.

관련 문제