我正在制作一个程序,我需要绘制一个与标题栏颜色相同的矩形。
如果我尝试得到这样的颜色:
ARGB rgbActiveColor = GetSysColor(COLOR_ACTIVECAPTION);
ARGB rgbInactiveColor = GetSysColor(COLOR_INACTIVECAPTION);
rgbActiveColor |= 0xFF000000; // Because of alpha
rgbInactiveColor |= 0xFF000000;
我在Windows 8中获得完全不同的颜色。它总是返回橙色或棕色而不是实际颜色(比方说,蓝色)。
使用DwmGetColorizationColor
有效,但颜色较暗,因为我需要消除alpha。我试着这样做:
BYTE r = ((RED * ALPHA) + (255 * (255 - ALPHA))) / 255; // R' = (R * A) + (1 - A)
BYTE g = ((GREEN * ALPHA) + (255 * (255 - ALPHA))) / 255; // G' = (G * A) + (1 - A)
BYTE b = ((BLUE * ALPHA) + (255 * (255 - ALPHA))) / 255; // B' = (B * A) + (1 - A)
所以,我的问题是:
EDIT2:这不是重复,因为这特别是关于W8 +。
答案 0 :(得分:0)
这是一个hackish解决方案,可能只适用于Windows 8和8.1(我稍后将测试10)。
我分析了窗户颜色,这是我能看到的:
0xD9D9D9
与\HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM\ColorizationColor
中颜色之间使用\HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM\ColorizationColorBalance
中的值进行混合的结果(以0-100比例)一个“阿尔法”。因此...
if (fActive)
{
DWORD ColorizationColor;
DWORD ColorizationColorBalance;
DWORD size = sizeof(DWORD);
RegGetValue(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\DWM", L"ColorizationColor", RRF_RT_REG_DWORD, 0, &ColorizationColor, &size);
RegGetValue(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\DWM", L"ColorizationColorBalance", RRF_RT_REG_DWORD, 0, &ColorizationColorBalance, &size);
BYTE ALPHA = 255 * ColorizationColorBalance / 100; // Convert from 0-100 to 0-255
BYTE RED = (ColorizationColor >> 16) & 0xFF;
BYTE GREEN = (ColorizationColor >> 8) & 0xFF;
BYTE BLUE = ColorizationColor & 0xFF;
BYTE r = ((RED * ALPHA) + (0xD9 * (255 - ALPHA))) / 255;
BYTE g = ((GREEN * ALPHA) + (0xD9 * (255 - ALPHA))) / 255;
BYTE b = ((BLUE * ALPHA) + (0xD9 * (255 - ALPHA))) / 255;
graphics.FillRectangle(&SolidBrush(Color(r, g, b)), Rect(...);
}
else
{
graphics.FillRectangle(&SolidBrush(0xFFEBEBEB), Rect(...));
}
因为这可能不适用于Windows 7,不同的代码应该是不同系统的用户。