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 秒ごとに 1 ずつ増加させるときに、強度が 0 の場合、強度が BLACK の場合、新しい色への移行が多少「スムーズ」になるようにすることです。ユーザーの気をそらすことはありません。

4

1 に答える 1

2

線形補間または多項式補間を使用できます。どちらもスムーズな移行を生成する必要があります。より段階的で先細りの効果が必要な場合は、対数補間を使用できます。

0.1 秒ごとは、技術的には 1 秒あたり 10 フレームであるため、ほとんどの人にとっては滑らかに見えないかもしれません。0.05〜0.03秒(20〜30 FPS)ごとに更新してみてください。

それが役立つことを願っています。

于 2013-07-25T02:52:48.310 に答える