3

在 c# 中平滑地将一种颜色更改为另一种颜色的最佳方法是什么。我的程序根据电池电量更改用户的配色方案。

我当前的代码 private void greater75_Tick(object sender, EventArgs e) {

        if (Environment.OSVersion.Version.Major >= 6 && DwmIsCompositionEnabled())
        {
            PowerStatus ps = SystemInformation.PowerStatus;
            if (ps.BatteryLifePercent >= 0.75)
            {
                ChangeCol.clrAfterGlow = 5;
                ChangeCol.clrColor = ColorToBgra(Color.Green);
                ChangeCol.nIntensity += 1;
                DwmSetColorizationParameters(ref ChangeCol, false);
            }
            if (ps.BatteryLifePercent < 0.75)
            {
                ChangeCol.clrAfterGlow = 5;
                ChangeCol.clrColor = ColorToBgra(Color.Blue);
                ChangeCol.nIntensity += 1;
                DwmSetColorizationParameters(ref ChangeCol, false);
            }
        }
    }

此代码使用此结构和方法来修改用户的系​​统颜色。

感谢这个人和这个人

    public DWM_COLORIZATION_PARAMS ChangeCol;
    public struct DWM_COLORIZATION_PARAMS
    {
        public uint clrColor;
        public uint clrAfterGlow;
        public uint nIntensity;
        public uint clrAfterGlowBalance;
        public uint clrBlurBalance;
        public uint clrGlassReflectionIntensity;
        public bool fOpaque;
    }


    [DllImport("dwmapi.dll", EntryPoint = "#127", PreserveSig = false)]
    private static extern void DwmGetColorizationParameters(out DWM_COLORIZATION_PARAMS parameters);

    [DllImport("dwmapi.dll", EntryPoint = "#131", PreserveSig = false)]
    private static extern void DwmSetColorizationParameters(ref DWM_COLORIZATION_PARAMS parameters,
                                                            bool unknown);

    // Helper method to convert from a Win32 BGRA-format color to a .NET color.
    private static Color BgraToColor(uint color)
    {
        return Color.FromArgb(Int32.Parse(color.ToString("X"), NumberStyles.HexNumber));
    }

    // Helper method to convert from a .NET color to a Win32 BGRA-format color.
    private static uint ColorToBgra(Color color)
    {
        return (uint)(color.B | (color.G << 8) | (color.R << 16) | (color.A << 24));
    }
    [DllImport("dwmapi.dll", PreserveSig = false)]
    public static extern bool DwmIsCompositionEnabled();
    // Gets or sets the current color used for DWM glass, based on the user's color scheme.

    public static Color ColorizationColor
    {
        get
        {
            // Call the DwmGetColorizationParameters function to fill in our structure.
            DWM_COLORIZATION_PARAMS parameters;
            DwmGetColorizationParameters(out parameters);

            // Convert the colorization color to a .NET color and return it.
            return BgraToColor(parameters.clrColor);
        }
        set
        {
            // Retrieve the current colorization parameters, just like we did above.
            DWM_COLORIZATION_PARAMS parameters;
            DwmGetColorizationParameters(out parameters);

            // Then modify the colorization color.
            // Note that the other parameters are left untouched, so they will stay the same.
            // You can also modify these; that is left as an exercise.
            parameters.clrColor = ColorToBgra(value);

            // Call the DwmSetColorizationParameters to make the change take effect.
            DwmSetColorizationParameters(ref parameters, false);
        }
    }

问题是,在设置颜色时,在将其设置为 0 后,使其强度每 0.1 秒增加一个,当为 0 时,强度为 BLACK ,我希望对新颜色进行某种“平滑”过渡,以便它不会突然分散用户的注意力。

4

1 回答 1

2

您可以使用线性多项式插值。两者都应该产生平稳的过渡。如果您想要更渐进的锥形效果,您可以使用对数插值

对于大多数人来说,每 0.1 秒似乎并不顺畅,因为它在技术上是每秒 10 帧。我可能会尝试每 0.05-0.03 秒(20-30 FPS)更新一次。

希望有帮助。

于 2013-07-25T02:52:48.310 回答