아무도 ARGB에서 해당 창문 색상 계산 방법을 말할 수 있습니까? 나는 ColorTranslator.ToWin32()가 계산을 수행하지만 어떻게 처리되는지 알고있다.어떻게 Windows 색상 ARGB에서 계산 얻을
또한 OLE 색과 windows (win32) 색의 차이점은 무엇입니까?
JD.
아무도 ARGB에서 해당 창문 색상 계산 방법을 말할 수 있습니까? 나는 ColorTranslator.ToWin32()가 계산을 수행하지만 어떻게 처리되는지 알고있다.어떻게 Windows 색상 ARGB에서 계산 얻을
또한 OLE 색과 windows (win32) 색의 차이점은 무엇입니까?
JD.
.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;
}
(반사경 등)는 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() 값을 반환합니다.
답장 John 님, ColorTranslator.ToWin32()/FromWinW32()의 기능은 무엇입니까? 또한, OLE 색 무엇입니까? JD. –
본질적으로 예 - Alexandre가 해체 된 코드가 매우 유사하다는 것을 보여주었습니다. OLE 색의 개념은 색이 "단추면"과 같은 시스템 색임을 나타내는 플래그를 포함 할 수 있다는 것입니다. 이들은 다른 운영 체제/테마에서 다르게 나타날 수 있으므로 응용 프로그램을 현재 Windows 테마와 일치 시키려면이 옵션이 유용합니다. 플래그를 포함하지 않으면 Win32 색상처럼 작동합니다. –
설명을 주신 John에게 감사드립니다. 비트와 시프트 연산을 한 번도 사용 해 본 적이 없으므로 예제를 통해이를 사용하는 방법을 배웠습니다. 아래 Alex에게 감사 드리며 앞으로 Reflector를 더 많이 사용하려고 노력할 것입니다. –