そこで、「メモリ容量がいっぱいになりました」的な状態を示すために、プログレスバーの色を緑から赤に変える方法を紹介します。
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);
}