From debf284d0cff53ae9e34eba9285b1e25ff4004b1 Mon Sep 17 00:00:00 2001 From: ttp Date: Thu, 31 Dec 2009 14:17:40 +0900 Subject: [PATCH] =?utf8?q?AppliStation-GUI,Windows=207=E3=81=AB=E3=81=A4?= =?utf8?q?=E3=81=84=E3=81=A6=E3=80=81=E9=80=B2=E6=8D=97=E3=82=92=E3=82=BF?= =?utf8?q?=E3=82=B9=E3=82=AF=E3=83=90=E3=83=BC=E3=81=AB=E8=A1=A8=E7=A4=BA?= =?utf8?q?=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../AppliStation.Util/ExecutionProgressViewer.cs | 53 ++++++---- AppliStation/AppliStation.Util/NativeMethods.cs | 116 ++++++++++++++++++++- 2 files changed, 141 insertions(+), 28 deletions(-) diff --git a/AppliStation/AppliStation.Util/ExecutionProgressViewer.cs b/AppliStation/AppliStation.Util/ExecutionProgressViewer.cs index b6d90d0..42f9e43 100644 --- a/AppliStation/AppliStation.Util/ExecutionProgressViewer.cs +++ b/AppliStation/AppliStation.Util/ExecutionProgressViewer.cs @@ -49,14 +49,6 @@ namespace AppliStation.Util return; } - - if (a.TaskProgressPercent >= 0) { - progressBarSub.Value = (int) a.TaskProgressPercent; - progressBarSub.Style = ProgressBarStyle.Continuous; - } else { - progressBarSub.Style = ProgressBarStyle.Marquee; - } - switch (a.Type) { case DownloadEventType.INITED: case DownloadEventType.CONNECTED: @@ -81,6 +73,14 @@ namespace AppliStation.Util logBox.SelectionColor = logBox.ForeColor; break; } + + // ダウンロードの進捗を表示 + if (a.TaskProgressPercent >= 0) { + progressBarSub.Value = (int) a.TaskProgressPercent; + progressBarSub.Style = ProgressBarStyle.Continuous; + } else { + progressBarSub.Style = ProgressBarStyle.Marquee; + } } #region NaGetTaskSet関連 @@ -88,13 +88,7 @@ namespace AppliStation.Util private void onTaskSetRaised(object sender, NaGetTaskSetEventArgs e) { NaGetTaskSet taskSet = (NaGetTaskSet) sender; - - if (e.TaskProgressPercent >= 0) { - progressBar.Value = (int) e.TaskProgressPercent; - progressBar.Style = ProgressBarStyle.Continuous; - } else { - progressBar.Style = ProgressBarStyle.Marquee; - } + NativeMethods.ProgressBarState progressState = NativeMethods.ProgressBarState.Normal; cancelButton.Enabled = taskSet.Running && taskSet.Cancelable; @@ -117,7 +111,7 @@ namespace AppliStation.Util if (progressBarSub.Visible) progressBarSub.Hide(); if (progressSubLabel.Visible) progressSubLabel.Hide(); - NativeMethods.ProgressBar_SetState(progressBar, 1); // VistaProgress色:ノーマル + progressState = NativeMethods.ProgressBarState.Normal; logBox.AppendText(string.Format(" ... 完了. [{0}%]", (int) e.TaskProgressPercent)); logBox.AppendText(System.Environment.NewLine); @@ -130,7 +124,7 @@ namespace AppliStation.Util logBox.AppendText(" [エラー] " + e.TaskMessage + System.Environment.NewLine); logBox.SelectionColor = logBox.ForeColor; - NativeMethods.ProgressBar_SetState(progressBar, 2); // VistaProgress色:エラー + progressState = NativeMethods.ProgressBarState.Error; autoCloseCheckBox.Enabled = false; okButton.Enabled = true; @@ -141,8 +135,7 @@ namespace AppliStation.Util logBox.AppendText(e.TaskMessage + System.Environment.NewLine); logBox.SelectionColor = logBox.ForeColor; - NativeMethods.ProgressBar_SetState(progressBar, 1); // VistaProgress色:中断 - NativeMethods.ProgressBar_SetState(progressBarSub, 1); // VistaProgress色:中断 + progressState = NativeMethods.ProgressBarState.Error; autoCloseCheckBox.Enabled = false; okButton.Enabled = true; @@ -153,15 +146,29 @@ namespace AppliStation.Util logBox.AppendText(" [エラー] " + e.TaskMessage + System.Environment.NewLine); logBox.SelectionColor = logBox.ForeColor; - NativeMethods.ProgressBar_SetState(progressBar, 2); // VistaProgress色:エラー + progressState = NativeMethods.ProgressBarState.Error; autoCloseCheckBox.Enabled = false; break; } - #if DEBUG + // タスクセット全体の進捗をプログレスバーに表示する + if (e.TaskProgressPercent >= 0) { + progressBar.Value = (int) e.TaskProgressPercent; + progressBar.Style = ProgressBarStyle.Continuous; + } else { + progressBar.Style = ProgressBarStyle.Marquee; + } + NativeMethods.ProgressBar_SetState(progressBar, progressState); + NativeMethods.ProgressBar_SetState(progressBarSub, progressState); + // タスクセット全体の進捗をタスクバーに表示する(Windows 7以降のみ) + if (e.TaskProgressPercent >= 0 && e.TaskProgressPercent < 100) { + NativeMethods.Form_SetTaskbarProgressParams(this, progressBar.Style, progressState, (ulong) e.TaskProgressPercent, 100); + } else { + NativeMethods.Form_SetTaskbarProgressParams(this, progressBar.Style, progressState, 0, 0); + } + logBox.ScrollToCaret(); - #endif if (taskSet.Done) { if ((ActionOnDone & ActionOnDoneFlags.FlashWindow) != 0) { @@ -257,7 +264,7 @@ namespace AppliStation.Util if (taskSet != null && taskSet.Running && taskSet.Cancelable) { cancelButton.Enabled = false; - NativeMethods.ProgressBar_SetState(progressBar, 3); // VistaProgress色:中断 + NativeMethods.ProgressBar_SetState(progressBar, NativeMethods.ProgressBarState.Paused); taskSet.Cancel(); } diff --git a/AppliStation/AppliStation.Util/NativeMethods.cs b/AppliStation/AppliStation.Util/NativeMethods.cs index 2bd8d06..cc83ae1 100644 --- a/AppliStation/AppliStation.Util/NativeMethods.cs +++ b/AppliStation/AppliStation.Util/NativeMethods.cs @@ -1,6 +1,9 @@ // Vistaの効果を有効にするフラグ(不要の場合はコメントアウト) #define USE_VISTA_EFFECTS +// Sevenの効果を有効にするフラグ(不要の場合はコメントアウト) +#define USE_SEVEN_EFFECTS + using System; using System.Runtime.InteropServices; using System.Windows.Forms; @@ -20,23 +23,126 @@ namespace AppliStation.Util { } + #region 進捗の表示 + /// - /// WindowsVista向け、プログレスバーステータス(色)を設定する + /// プログレスバーステータス(色) + /// + public enum ProgressBarState + { + /// + /// 通常の状態(PBST_NORMAL)。デフォルトの設定では緑色。 + /// + Normal = 0, + /// + /// エラーの状態(PBST_ERROR)。デフォルトの設定では赤色。 + /// + Error = 1, + /// + /// 停止の状態(PBST_PAUSED)。デフォルトの設定では黄色。 + /// + Paused = 2, + } + + /// + /// WindowsVista以降向け、プログレスバーステータス(色)を設定する。 /// /// 対象のプログレスバー - /// 状態。(1:Normal,2:Error,3:Paused) - public static void ProgressBar_SetState(ProgressBar progBar, uint state) + /// 状態(色) + public static void ProgressBar_SetState(ProgressBar progBar, ProgressBarState state) { #if USE_VISTA_EFFECTS try { - // status := (PBST_NORMAL | PBST_ERROR | PBST_PAUSED) // SendMessage(progressBar.Handle, PBM_SETSTATE, state, 0); - SendMessage(progBar.Handle, 0x410, new IntPtr(state), IntPtr.Zero); + SendMessage(progBar.Handle, 0x410, new IntPtr((int) state), IntPtr.Zero); } catch (Exception) { } #endif } + #region タスクバー上の進捗表示のためのP/Invoke + + internal enum TBPFLAG + { + TBPF_NOPROGRESS = 0, + TBPF_INDETERMINATE = 0x1, + TBPF_NORMAL = 0x2, + TBPF_ERROR = 0x4, + TBPF_PAUSED = 0x8, + } + + [ComImport()] + [Guid("EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF")] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + internal interface ITaskList3 + { + void HrInit(); + void AddTab(IntPtr hWnd); + void DeleteTab(IntPtr hWnd); + void ActivateTab(IntPtr hWnd); + void SetActiveAlt(IntPtr hWnd); + void MarkFullscreenWindow(IntPtr hWnd, int fFullscreen); + void SetProgressValue(IntPtr hWnd, ulong ullCompleted, ulong ullTotal); + void SetProgressState(IntPtr hWnd, TBPFLAG tbpFlags); + // more functions follows, but we do not need these. + } + + [ComImport()] + [Guid("56FDF344-FD6D-11d0-958A-006097C9A090")] + [ClassInterface(ClassInterfaceType.None)] + internal class CTaskbarList + { + } + + #endregion + + /// + /// タスクバに進捗を設定する。 + /// + /// 対象フォーム + /// 表示スタイル + /// ステータス(色) + /// プログレスバーの値。0を指定すると進捗表示をしない + /// プログレスバーの最大値。 + public static void Form_SetTaskbarProgressParams(Form form, ProgressBarStyle style, ProgressBarState state, ulong val, ulong maximum) + { +#if USE_VISTA_EFFECT +#if USE_SEVEN_EFFECT + ITaskList3 tasklist = null; + + try { + TBPFLAG tbpFlag = TBPFLAG.TBPF_NOPROGRESS; + + if (style == ProgressBarStyle.Marquee) { + tbpFlag |= TBPFLAG.TBPF_INDETERMINATE; + } else if (val > 0 && maximum > 0) { + tbpFlag |= TBPFLAG.TBPF_NORMAL; + } + + if (state == ProgressBarState.Error) { + tbpFlag |= TBPFLAG.TBPF_ERROR; + } + if (state == ProgressBarState.Paused) { + tbpFlag |= TBPFLAG.TBPF_PAUSED; + } + + tasklist = (ITaskList3) new CTaskbarList(); + tasklist.HrInit(); + + tasklist.SetProgressState(form.Handle, tbpFlag); + tasklist.SetProgressValue(form.Handle, val, maximum); + } finally { + if (tasklist != null) { + Marshal.ReleaseComObject(tasklist); + tasklist = null; + } + } +#endif +#endif + } + + #endregion + #region タスクバーおよびタイトルバーのフラッシュ /// -- 2.11.0