そこで、「メモリ容量がいっぱいになりました」的な状態を示すために、プログレスバーの色を緑から赤に変える方法を紹介します。
using System.Runtime.InteropServices; const int WM_USER = 0x400; const int PBM_SETSTATE = WM_USER + 16; const int PBM_GETSTATE = WM_USER + 17; [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
このように、Win32APIを呼び出す関数を用意して、エラー状態をセットしてやります。
public enum ProgressBarStateEnum : int { Normal = 1, Error = 2, Paused = 3, } public static void SetState(ProgressBar pBar, ProgressBarStateEnum state) { SendMessage(pBar.Handle, PBM_SETSTATE, (IntPtr)state, IntPtr.Zero); } SetState(progressBar1, ProgressBarStateEnum.Error);
もとの緑色に変更するには、ノーマル状態に戻してやります。
SetState(progressBar1, ProgressBarStateEnum.Normal);
追記: ここで注意せねばならないのは、プログレスバーのバグで、エラー状態を設定した時点では値が変更されません。
エラー状態を設定したら、値の変更を再度行う必要があります。
これはWindowsのバグらしいです。
if (progressBar1.Maximum * .9 < len) { progressBar1.Value = 0; SetState(progressBar1, ProgressBarStateEnum.Normal); progressBar1.Value = len; SetState(progressBar1, ProgressBarStateEnum.Error); } else { progressBar1.Value = len; SetState(progressBar1, ProgressBarStateEnum.Normal); }