OSDN Git Service

#38362 FullAVI有効時の、動画の表示座標指定機能を追加。ただしまだ難あり。
[dtxmania/dtxmania.git] / DTXMania / コード / ステージ / 04.コンフィグ / CActConfigList.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Diagnostics;
4 using System.Text;
5 using System.Drawing;
6 using System.Threading;
7 using SharpDX;
8 using FDK;
9 using System.IO;
10
11 using Color = System.Drawing.Color;
12 using Point = System.Drawing.Point;
13 using Rectangle = System.Drawing.Rectangle;
14
15 namespace DTXMania
16 {
17         internal class CActConfigList : CActivity
18         {
19                 STDGBSValue<COptionLabel> ReturnToMenu;
20                 STDGBSValue<COptionLabel> KeyAssignMenu;
21                 STDGBSValue<COptionLabel> DisplayMenu;
22                 STDGBSValue<COptionLabel> EDrumsMenu;
23                 COptionLabel SoundMenu;
24                 COptionLabel HitRangeMenu;
25                 COptionStringList skins;
26
27                 bool b項目リスト側にフォーカスがある;
28                 bool b要素値にフォーカス中;
29                 CCounter ct三角矢印アニメ;
30                 Eメニュー種別 eメニュー種別;
31                 // #33689 2014.6.17 yyagi
32                 bool InitialUseOSTimer;
33                 bool InitialWASAPIEventDriven;
34                 ESoundDeviceTypeForConfig InitialSystemSoundType;
35                 int InitialWASAPIBufferSizeMs;
36                 int InitialASIODevice;
37                 bool InitialForceHighPower;
38                 List<COptionBase> list項目リスト;
39                 long nスクロール用タイマ値;
40                 int n現在のスクロールカウンタ;
41                 int n目標のスクロールカウンタ;
42                 Point[] ptパネルの基本座標 = new Point[]
43                 {
44                         new Point(0x12d, 3), new Point(0x12d, 0x35), new Point(0x12d, 0x67),
45                         new Point(0x12d, 0x99), new Point(0x114, 0xcb), new Point(0x12d, 0xfd),
46                         new Point(0x12d, 0x12f), new Point(0x12d, 0x161), new Point(0x12d, 0x193),
47                         new Point(0x12d, 0x1c5)
48                 };
49                 CTextureAf txその他項目行パネル;
50                 CTexture tx三角矢印;
51                 CTextureAf tx通常項目行パネル;
52                 // #28195 2012.5.2 yyagi
53                 CTexture txSkinSample;
54                 string[] skinSubFolders;
55                 string[] skinNames;
56                 string skinInitial;
57                 CPrivateFastFont prvFont;
58                 private struct stMenuItemRight
59                 {
60                         public CTexture txMenuItemRight;
61                         public int nParam;
62                         public string strParam;
63                         public CTexture txParam;
64                         public CTexture txParamColored;
65                 }
66                 stMenuItemRight[] listMenu;
67
68                 /// <summary>
69                 /// #32059 2013.9.17 yyagi
70                 /// </summary>
71                 public bool bIsFocusingParameter
72                 {
73                         get
74                         {
75                                 return b要素値にフォーカス中;
76                         }
77                 }
78
79                 public bool b現在選択されている項目はReturnToMenuである
80                 {
81                         get
82                         {
83                                 COptionBase sel = this.list項目リスト[this.n現在の選択項目];
84                                 bool ret = false;
85                                 for (EPart i = EPart.Drums; i <= EPart.System; ++i)
86                                 {
87                                         if (sel == ReturnToMenu[i])
88                                         {
89                                                 ret = true;
90                                         }
91                                 }
92                                 return ret;
93                         }
94                 }
95
96                 public bool b楽器またはシステム用メニューである
97                 {
98                         get
99                         {
100                                 return eメニュー種別 == Eメニュー種別.Bass || eメニュー種別 == Eメニュー種別.Drums || eメニュー種別 == Eメニュー種別.Guitar || eメニュー種別 == Eメニュー種別.System;
101                         }
102                 }
103
104                 public COptionBase ib現在の選択項目
105                 {
106                         get
107                         {
108                                 return this.list項目リスト[this.n現在の選択項目];
109                         }
110                 }
111
112                 public int n現在の選択項目;
113
114                 /// <summary>
115                 /// ESC押下時の右メニュー描画
116                 /// </summary>
117                 public void tEsc押下()
118                 {
119                         if (this.b要素値にフォーカス中)
120                         {
121                                 // #32059 2013.9.17 add yyagi
122                                 this.b要素値にフォーカス中 = false;
123                         }
124
125                         if (this.eメニュー種別 == Eメニュー種別.KeyAssignSystem)
126                         {
127                                 t項目リストの設定(Eメニュー種別.System);
128                         }
129                         else if (this.eメニュー種別 == Eメニュー種別.KeyAssignDrums)
130                         {
131                                 t項目リストの設定(Eメニュー種別.Drums);
132                         }
133                         else if (this.eメニュー種別 == Eメニュー種別.KeyAssignGuitar)
134                         {
135                                 t項目リストの設定(Eメニュー種別.Guitar);
136                         }
137                         else if (this.eメニュー種別 == Eメニュー種別.KeyAssignBass)
138                         {
139                                 t項目リストの設定(Eメニュー種別.Bass);
140                         }
141                         if (this.eメニュー種別 == Eメニュー種別.DisplaySystem)
142                         {
143                                 t項目リストの設定(Eメニュー種別.System);
144                         }
145                         else if (this.eメニュー種別 == Eメニュー種別.DisplayDrums)
146                         {
147                                 t項目リストの設定(Eメニュー種別.Drums);
148                         }
149                         else if (this.eメニュー種別 == Eメニュー種別.DisplayGuitar)
150                         {
151                                 t項目リストの設定(Eメニュー種別.Guitar);
152                         }
153                         else if (this.eメニュー種別 == Eメニュー種別.DisplayBass)
154                         {
155                                 t項目リストの設定(Eメニュー種別.Bass);
156                         }
157                         else if (this.eメニュー種別 == Eメニュー種別.EDrumsSettings)
158                         {
159                                 t項目リストの設定(Eメニュー種別.Drums);
160                         }
161                         else if (this.eメニュー種別 == Eメニュー種別.HitRangeSettings)
162                         {
163                                 t項目リストの設定(Eメニュー種別.System);
164                         }
165                         else if ( this.eメニュー種別 == Eメニュー種別.SoundSettings)
166                         {
167                                 t項目リストの設定(Eメニュー種別.System);
168                         }
169                 }
170
171                 public bool tEnter押下()
172                 {
173                         bool ret = false;
174                         CDTXMania.Instance.Skin.sound決定音.t再生する();
175
176                         if (this.b要素値にフォーカス中)
177                         {
178                                 this.b要素値にフォーカス中 = false;
179                         }
180                         else if (this.list項目リスト[this.n現在の選択項目] is COptionInteger)
181                         {
182                                 this.b要素値にフォーカス中 = true;
183                         }
184                         else if (this.list項目リスト[this.n現在の選択項目] is IOptionList || this.list項目リスト[this.n現在の選択項目] is COptionBool)
185                         {
186                                 this.list項目リスト[this.n現在の選択項目].OnNext();
187                         }
188
189                         // #27029 2012.1.5 from
190                         if (
191                                         CDTXMania.Instance.ConfigIni.eBDGroup == EBDGroup.Group &&
192                                         (
193                                         (this.list項目リスト[this.n現在の選択項目] == CDTXMania.Instance.ConfigIni.eHHGroup ||
194                                          this.list項目リスト[this.n現在の選択項目] == CDTXMania.Instance.ConfigIni.eHitSoundPriorityHH)))
195                         {
196                                 // 変更禁止(何もしない)
197                         }
198                         else
199                         {
200                                 if (b現在選択されている項目はReturnToMenuである && b楽器またはシステム用メニューである)
201                                 {
202                                         ret = true;
203                                 }
204                                 this.list項目リスト[this.n現在の選択項目].OnEnter();
205                         }
206                         return ret;
207                 }
208
209                 private void tGenerateSkinSample()
210                 {
211                         string path = skinSubFolders[skins.Index];
212                         path = System.IO.Path.Combine(path, @"Graphics\ScreenTitle background.jpg");
213                         using (Bitmap bmSrc = new Bitmap(path))
214                         {
215                                 using (Bitmap bmDest = new Bitmap(bmSrc.Width / 4, bmSrc.Height / 4))
216                                 {
217                                         using (Graphics g = Graphics.FromImage(bmDest))
218                                         {
219                                                 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
220                                                 g.DrawImage(bmSrc, new Rectangle(0, 0, bmSrc.Width / 4, bmSrc.Height / 4),
221                                                                 0, 0, bmSrc.Width, bmSrc.Height, GraphicsUnit.Pixel);
222                                                 TextureFactory.tテクスチャの解放(ref txSkinSample);
223                                                 txSkinSample = TextureFactory.tテクスチャの生成(bmDest, false);
224                                         }
225                                 }
226                         }
227                 }
228
229                 // #region [ 項目リストの設定 ( Exit, KeyAssignSystem/Drums/Guitar/Bass) ]
230                 public void t項目リストの設定_Exit()
231                 {
232                         CDTXMania.Instance.SaveConfig();
233                         this.eメニュー種別 = Eメニュー種別.Unknown;
234                 }
235
236                 public void t項目リストの設定(Eメニュー種別 eMenu)
237                 {
238                         this.list項目リスト.Clear();
239
240                         Func<EPad, string, string, COptionString> PadNotifier = (pad, lbl, expl) =>
241                         {
242                                 COptionString opt = new COptionString("");
243                                 opt.Initialize(lbl, expl);
244                                 opt.OnEnterDelegate = () =>
245                                 {
246                                         CDTXMania.Instance.stageコンフィグ.tパッド選択通知(pad);
247                                 };
248                                 return opt;
249                         };
250
251                         CResources cr = CDTXMania.Instance.Resources;
252
253                         if (eMenu == Eメニュー種別.DisplaySystem)
254                         {
255                                 list項目リスト.Add(ReturnToMenu.System);
256                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bFullScreen);
257                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bBGA);
258                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAVI);
259                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bFullAVI);
260                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bVSyncWait);
261                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdDebugX.Both);
262                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdDebugY.Both);
263                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdDebugX.DrOnly);
264                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdDebugY.DrOnly);
265                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdDebugX.GBOnly);
266                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdDebugY.GBOnly);
267                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdMovieX.Both);
268                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdMovieY.Both);
269                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdMovieX.DrOnly);
270                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdMovieY.DrOnly);
271                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdMovieX.GBOnly);
272                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdMovieY.GBOnly);
273                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bForceFullMovieCentering.Both);
274                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdForceFullMovieX.Both);
275                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdForceFullMovieY.Both);
276                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nBGAlpha);
277                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nShowLagType);
278                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eJudgePriority);
279                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bDebugInfo);
280                         }
281                         else if (eMenu == Eメニュー種別.DisplayDrums)
282                         {
283                                 list項目リスト.Add(ReturnToMenu.Drums);
284                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdInstX.Drums.Both);
285                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdInstX.Drums.DrOnly);
286                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdComboX.Drums.Both);
287                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdComboX.Drums.DrOnly);
288                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdJudgeLineY.Drums);
289                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdJudgeY.Drums);
290                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLaneOrder.LC);
291                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLaneOrder.HH);
292                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLaneOrder.SD);
293                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLaneOrder.BD);
294                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLaneOrder.HT);
295                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLaneOrder.LT);
296                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLaneOrder.FT);
297                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLaneOrder.CY);
298                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eSudHidInv.Drums);
299                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bReverse.Drums);
300                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bDisplayCombo.Drums);              // 112追加
301                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nMinComboDisp.Drums);
302                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bDisplayJudge.Drums);              // 112追加
303                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bGraph.Drums);
304                         }
305                         else if (eMenu == Eメニュー種別.DisplayGuitar)
306                         {
307                                 list項目リスト.Add(ReturnToMenu.Guitar);
308                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdInstX.Guitar.Both);
309                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdInstX.Guitar.GBOnly);
310                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdComboX.Guitar.Both);
311                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdComboX.Guitar.GBOnly);
312                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdJudgeLineY.Guitar);
313                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdJudgeY.Guitar);
314                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLaneOrder.GtR);
315                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLaneOrder.GtG);
316                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLaneOrder.GtB);
317                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eSudHidInv.Guitar);
318                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bReverse.Guitar);
319                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bDisplayCombo.Guitar);             // 112追加
320                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nMinComboDisp.Guitar);
321                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bDisplayJudge.Guitar);             // 112追加
322                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bGraph.Guitar);
323                         }
324                         else if (eMenu == Eメニュー種別.DisplayBass)
325                         {
326                                 list項目リスト.Add(ReturnToMenu.Bass);
327                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdInstX.Bass.Both);
328                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdInstX.Bass.GBOnly);
329                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdComboX.Bass.Both);
330                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdComboX.Bass.GBOnly);
331                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdJudgeLineY.Bass);
332                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdJudgeY.Bass);
333                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLaneOrder.BsR);
334                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLaneOrder.BsG);
335                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.cdLaneOrder.BsB);
336                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eSudHidInv.Bass);
337                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bReverse.Bass);
338                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bDisplayCombo.Bass);               // 112追加
339                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nMinComboDisp.Bass);
340                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bDisplayJudge.Bass);               // 112追加
341                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bGraph.Bass);
342                         }
343                         else if (eMenu == Eメニュー種別.EDrumsSettings)
344                         {
345                                 list項目リスト.Add(ReturnToMenu.Drums);
346                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nVelocityMin.LC);
347                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nVelocityMin.HH);
348                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nVelocityMin.SD);
349                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nVelocityMin.BD);
350                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nVelocityMin.HT);
351                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nVelocityMin.LT);
352                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nVelocityMin.FT);
353                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nVelocityMin.CY);
354                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nVelocityMin.RD);
355                         }
356                         else if (eMenu == Eメニュー種別.HitRangeSettings)
357                         {
358                                 list項目リスト.Add(ReturnToMenu.System);
359                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nHitRange.Perfect);
360                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nHitRange.Great);
361                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nHitRange.Good);
362                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nHitRange.Poor);
363                         }
364                         else if (eMenu == Eメニュー種別.KeyAssignSystem)
365                         {
366                                 list項目リスト.Add(ReturnToMenu.System);
367                                 list項目リスト.Add(PadNotifier(EPad.Capture, cr.Label("strCfgKeyAssignCapture"), cr.Explanation("strCfgKeyAssignCapture") ));
368                         }
369                         else if (eMenu == Eメニュー種別.KeyAssignDrums)
370                         {
371                                 list項目リスト.Add(ReturnToMenu.Drums);
372                                 list項目リスト.Add(PadNotifier(EPad.LC, cr.Label("strCfgKeyAssignLC"), cr.Explanation("strCfgKeyAssignLC") ));
373                                 list項目リスト.Add(PadNotifier(EPad.HH, cr.Label("strCfgKeyAssignHH"), cr.Explanation("strCfgKeyAssignHH") ));
374                                 list項目リスト.Add(PadNotifier(EPad.HHO,cr.Label("strCfgKeyAssignHHO"), cr.Explanation("strCfgKeyAssignHHO") ));
375                                 list項目リスト.Add(PadNotifier(EPad.SD, cr.Label("strCfgKeyAssignSD"), cr.Explanation("strCfgKeyAssignSD") ));
376                                 list項目リスト.Add(PadNotifier(EPad.BD, cr.Label("strCfgKeyAssignBD"), cr.Explanation("strCfgKeyAssignBD") ));
377                                 list項目リスト.Add(PadNotifier(EPad.HT, cr.Label("strCfgKeyAssignHT"), cr.Explanation("strCfgKeyAssignHT") ));
378                                 list項目リスト.Add(PadNotifier(EPad.LT, cr.Label("strCfgKeyAssignLT"), cr.Explanation("strCfgKeyAssignLT") ));
379                                 list項目リスト.Add(PadNotifier(EPad.FT, cr.Label("strCfgKeyAssignFT"), cr.Explanation("strCfgKeyAssignFT") ));
380                                 list項目リスト.Add(PadNotifier(EPad.CY, cr.Label("strCfgKeyAssignCY"), cr.Explanation("strCfgKeyAssignCY") ));
381                                 list項目リスト.Add(PadNotifier(EPad.RD, cr.Label("strCfgKeyAssignRD"), cr.Explanation("strCfgKeyAssignRD") ));
382                                 list項目リスト.Add(PadNotifier(EPad.HP, cr.Label("strCfgKeyAssignHP"), cr.Explanation("strCfgKeyAssignHP") ));
383                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eHHGroup);
384                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eFTGroup);
385                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eCYGroup);
386                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eBDGroup);
387                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bCymbalFree);
388                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs.Drums);
389                         }
390                         else if (eMenu == Eメニュー種別.KeyAssignGuitar)
391                         {
392                                 list項目リスト.Add(ReturnToMenu.Guitar);
393                                 list項目リスト.Add(PadNotifier(EPad.GtR, cr.Label("strCfgKeyAssignGtR"), cr.Explanation("strCfgKeyAssignGtR") ));
394                                 list項目リスト.Add(PadNotifier(EPad.GtG, cr.Label("strCfgKeyAssignGtG"), cr.Explanation("strCfgKeyAssignGtG") ));
395                                 list項目リスト.Add(PadNotifier(EPad.GtB, cr.Label("strCfgKeyAssignGtB"), cr.Explanation("strCfgKeyAssignGtB") ));
396                                 list項目リスト.Add(PadNotifier(EPad.GtPick, cr.Label("strCfgKeyAssignGtPick"), cr.Explanation("strCfgKeyAssignGtPick") ));
397                                 list項目リスト.Add(PadNotifier(EPad.GtWail, cr.Label("strCfgKeyAssignGtWailing"), cr.Explanation("strCfgKeyAssignGtWailing") ));
398                                 list項目リスト.Add(PadNotifier(EPad.GtDecide, cr.Label("strCfgKeyAssignGtDecide"), cr.Explanation("strCfgKeyAssignGtDecide") ));
399                                 list項目リスト.Add(PadNotifier(EPad.GtCancel, cr.Label("strCfgKeyAssignGtCancel"), cr.Explanation("strCfgKeyAssignGtCancel") ));
400                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs.Guitar);
401                         }
402                         else if (eMenu == Eメニュー種別.KeyAssignBass)
403                         {
404                                 list項目リスト.Add(ReturnToMenu.Bass);
405                                 list項目リスト.Add(PadNotifier(EPad.BsR, cr.Label("strCfgKeyAssignBsR"), cr.Explanation("strCfgKeyAssignBsR") ));
406                                 list項目リスト.Add(PadNotifier(EPad.BsG, cr.Label("strCfgKeyAssignBsG"), cr.Explanation("strCfgKeyAssignBsG") ));
407                                 list項目リスト.Add(PadNotifier(EPad.BsB, cr.Label("strCfgKeyAssignBsB"), cr.Explanation("strCfgKeyAssignBsB") ));
408                                 list項目リスト.Add(PadNotifier(EPad.BsPick, cr.Label("strCfgKeyAssignBsPick"), cr.Explanation("strCfgKeyAssignBsPick") ));
409                                 list項目リスト.Add(PadNotifier(EPad.BsWail, cr.Label("strCfgKeyAssignBsWailing"), cr.Explanation("strCfgKeyAssignBsWailing") ));
410                                 list項目リスト.Add(PadNotifier(EPad.BsDecide, cr.Label("strCfgKeyAssignBsDecide"), cr.Explanation("strCfgKeyAssignBsDecide") ));
411                                 list項目リスト.Add(PadNotifier(EPad.BsCancel, cr.Label("strCfgKeyAssignBsCancel"), cr.Explanation("strCfgKeyAssignBsCancel") ));
412                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs.Bass);
413                         }
414                         else if (eMenu == Eメニュー種別.System)
415                         {
416                                 list項目リスト.Add(ReturnToMenu.System);
417                                 COptionStringList langlist = new COptionStringList("default");
418                                 langlist.Initialize( "strCfgLanguage", cr.LanguageDispList );
419                                 langlist.Index = CDTXMania.Instance.Resources.LanguageCodeIndex;
420                                 langlist.OnEnterDelegate = () =>
421                                 {
422                                         int index = langlist.Index;
423                                         CDTXMania.Instance.ConfigIni.strLanguage.Value = CDTXMania.Instance.Resources.Language = CDTXMania.Instance.Resources.LanguageCodeList[ index ];
424                                          
425                                 }; 
426                                 list項目リスト.Add( langlist );
427                         
428                                 COptionString enumsongs = new COptionString("");
429                                 enumsongs.Initialize( "strCfgSysEnumSongs" );
430                                 list項目リスト.Add(enumsongs);
431                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eDark);
432                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nRisky);
433                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eActiveInst);
434                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nPlaySpeed);
435                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nSleepPerFrameMs);
436                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nSleepUnfocusMs);
437                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bForceHighPowerPlan);
438                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bStageFailed);
439                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bRandSubBox);
440                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nPreSoundWeightMs);
441                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nPreImageWeightMs);
442                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eDamageLevel);
443                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bScoreIni);
444                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nChipVolume);
445                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nAutoVolume);
446                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bStoicMode);
447                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bIsAutoResultCapture);
448                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bBufferedInput);
449                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bLog);
450                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bLoadSoundSpeed);
451                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bLoadDTXDetail);// #36177 2016.7.30 ikanick
452                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bUseBoxDefSkin);
453                                 list項目リスト.Add(skins);
454                                 list項目リスト.Add(SoundMenu);
455                                 list項目リスト.Add(DisplayMenu.System);
456                                 list項目リスト.Add(HitRangeMenu);
457                                 list項目リスト.Add(KeyAssignMenu.System);
458                                 enumsongs.OnEnterDelegate = () =>
459                                 {
460                                         if (CDTXMania.Instance.EnumSongs.IsEnumerating)
461                                         {
462                                                 // Debug.WriteLine( "バックグラウンドでEnumeratingSongs中だったので、一旦中断します。" );
463                                                 CDTXMania.Instance.EnumSongs.Abort();
464                                                 CDTXMania.Instance.actEnumSongs.On非活性化();
465                                         }
466
467                                         CDTXMania.Instance.EnumSongs.StartEnumFromDisk();
468                                         CDTXMania.Instance.EnumSongs.ChangeEnumeratePriority(ThreadPriority.Normal);
469                                         CDTXMania.Instance.actEnumSongs.bコマンドでの曲データ取得 = true;
470                                         CDTXMania.Instance.actEnumSongs.On活性化();
471                                 };
472                         }
473                         else if ( eMenu == Eメニュー種別.SoundSettings )
474                         {
475                                 list項目リスト.Add( ReturnToMenu.System );
476                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.bTimeStretch );
477                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.bWaveAdjust );
478                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.bBGMPlay );
479                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.bAudience );
480                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.nChipVolume );
481                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.nAutoVolume );
482                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.nSoundDeviceType );
483                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.nWASAPIBufferSizeMs );
484                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.bEventDrivenWASAPI );
485                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.strASIODevice );
486                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.bUseOSTimer );
487                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.nMasterVolume );
488                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.nPolyphonicSounds );
489                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.eClickType );
490                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.nClickHighVolume );
491                                 list項目リスト.Add( CDTXMania.Instance.ConfigIni.nClickLowVolume );
492                         }
493                         else if ( eMenu == Eメニュー種別.Drums )
494                         {
495                                 list項目リスト.Add(ReturnToMenu.Drums);
496                                 COptionEnum<EThreeState> AllAuto = new COptionEnum<EThreeState>(EThreeState.X);
497                                 AllAuto.Initialize( "strCfgDrAllAuto", typeof(EThreeState));
498                                 AllAuto.OnEnterDelegate = () =>
499                                 {
500                                         if ( AllAuto.Value == EThreeState.X )
501                                         {
502                                                 AllAuto.OnNext();
503                                         }
504                                         CDTXMania.Instance.ConfigIni.bAutoPlay.Set( EPart.Drums, AllAuto );
505                                 };
506                                 list項目リスト.Add(AllAuto);
507                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.LC);
508                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.HH);
509                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.HHO);
510                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.SD);
511                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.BD);
512                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.HT);
513                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.LT);
514                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.FT);
515                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.CY);
516                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.RD);
517                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nScrollSpeed.Drums);
518                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eHitSoundPriorityHH);
519                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eHitSoundPriorityFT);
520                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eHitSoundPriorityCY);
521                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bTight);
522                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bFillin);
523                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bDrumsHitSound);
524                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bEmphasizePlaySound.Drums);
525                                 list項目リスト.Add(DisplayMenu.Drums);
526                                 list項目リスト.Add(EDrumsMenu.Drums);
527                                 list項目リスト.Add(KeyAssignMenu.Drums);
528                         }
529                         else if (eMenu == Eメニュー種別.Guitar)
530                         {
531                                 list項目リスト.Add(ReturnToMenu.Guitar);
532                                 COptionEnum<EThreeState> AllAuto = new COptionEnum<EThreeState>(EThreeState.X);
533                                 AllAuto.Initialize( "strCfgDrAllAuto", typeof(EThreeState));
534                                 AllAuto.OnEnterDelegate = () =>
535                                 {
536                                         if ( AllAuto.Value == EThreeState.X )
537                                         {
538                                                 AllAuto.OnNext();
539                                         }
540                                         CDTXMania.Instance.ConfigIni.bAutoPlay.Set( EPart.Guitar, AllAuto );
541                                 };
542                                 list項目リスト.Add(AllAuto);
543                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.GtR);
544                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.GtG);
545                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.GtB);
546                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.GtPick);
547                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.GtWail);
548                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nScrollSpeed.Guitar);
549                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eRandom.Guitar);
550                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bLight.Guitar);
551                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bEmphasizePlaySound.Guitar);
552                                 list項目リスト.Add(DisplayMenu.Guitar);
553                                 list項目リスト.Add(KeyAssignMenu.Guitar);
554                         }
555                         else if (eMenu == Eメニュー種別.Bass)
556                         {
557                                 list項目リスト.Add(ReturnToMenu.Bass);
558                                 COptionEnum<EThreeState> AllAuto = new COptionEnum<EThreeState>(EThreeState.X);
559                                 AllAuto.Initialize( "strCfgDrAllAuto", typeof(EThreeState));
560                                 AllAuto.OnEnterDelegate = () =>
561                                 {
562                                         if ( AllAuto.Value == EThreeState.X )
563                                         {
564                                                 AllAuto.OnNext();
565                                         }
566                                         CDTXMania.Instance.ConfigIni.bAutoPlay.Set( EPart.Bass, AllAuto );
567                                 };
568                                 list項目リスト.Add(AllAuto);
569                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.BsR);
570                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.BsG);
571                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.BsB);
572                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.BsPick);
573                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAutoPlay.BsWail);
574                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.nScrollSpeed.Bass);
575                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.eRandom.Bass);
576                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bLight.Bass);
577                                 list項目リスト.Add(CDTXMania.Instance.ConfigIni.bEmphasizePlaySound.Bass);
578                                 list項目リスト.Add(DisplayMenu.Bass);
579                                 list項目リスト.Add(KeyAssignMenu.Bass);
580                         }
581                         OnListMenuの初期化();
582                         n現在の選択項目 = 0;
583                         eメニュー種別 = eMenu;
584                 }
585
586                 public void OnNext()
587                 {
588                         CDTXMania.Instance.Skin.soundカーソル移動音.t再生する();
589                         if (b要素値にフォーカス中)
590                         {
591                                 list項目リスト[n現在の選択項目].OnPrevious();
592                                 t要素値を上下に変更中の処理();
593                         }
594                         else
595                         {
596                                 n目標のスクロールカウンタ += 100;
597                         }
598                 }
599
600                 public void OnPrevious()
601                 {
602                         CDTXMania.Instance.Skin.soundカーソル移動音.t再生する();
603                         if (b要素値にフォーカス中)
604                         {
605                                 list項目リスト[n現在の選択項目].OnNext();
606                                 t要素値を上下に変更中の処理();
607                         }
608                         else
609                         {
610                                 n目標のスクロールカウンタ -= 100;
611                         }
612                 }
613
614                 private void t要素値を上下に変更中の処理()
615                 {
616                         if (this.list項目リスト[this.n現在の選択項目] == CDTXMania.Instance.ConfigIni.nMasterVolume)
617                         {
618                                 // #33700 2014.4.26 yyagi
619                                 CDTXMania.Instance.Sound管理.nMasterVolume = CDTXMania.Instance.ConfigIni.nMasterVolume;
620                         }
621                 }
622
623                 public override void On活性化()
624                 {
625                         if (b活性化してない)
626                         {
627                                 this.list項目リスト = new List<COptionBase>();
628                                 this.eメニュー種別 = Eメニュー種別.Unknown;
629
630                                 CResources cr = CDTXMania.Instance.Resources;
631                                 string fontname = cr.Explanation("strCfgConfigurationItemsFontFileName");
632                                 string path = Path.Combine(@"Graphics\fonts", fontname);
633                                 this.prvFont = new CPrivateFastFont(CSkin.Path(path), (int)(18 * Scale.Y));
634                                 this.b要素値にフォーカス中 = false;
635                                 this.n目標のスクロールカウンタ = 0;
636                                 this.n現在のスクロールカウンタ = 0;
637                                 this.nスクロール用タイマ値 = -1;
638                                 this.ct三角矢印アニメ = new CCounter();
639
640
641                                 DisplayMenu = new STDGBSValue<COptionLabel>();
642                                 KeyAssignMenu = new STDGBSValue<COptionLabel>();
643                                 EDrumsMenu = new STDGBSValue<COptionLabel>();
644                                 ReturnToMenu = new STDGBSValue<COptionLabel>();
645
646                                 //CResources cr = CDTXMania.Instance.Resources;
647                                 for ( EPart i = EPart.Drums; i <= EPart.System; ++i )
648                                 {
649                                         DisplayMenu[i] = new COptionLabel( "strCfgDisplayOption" );
650                                         KeyAssignMenu[i] = new COptionLabel( "strCfgInputOption" );
651                                         ReturnToMenu[i] = new COptionLabel( "strCfgReturnToMenu" );
652                                 }
653
654                                 EDrumsMenu[ EPart.Drums ] = new COptionLabel( "strCfgEDrumsOption" );
655                                 HitRangeMenu = new COptionLabel( "strCfgHitRangeOption" );
656                                 SoundMenu = new COptionLabel( "strCfgSoundOption" );
657
658                                 DisplayMenu.Drums.OnEnterDelegate = () =>
659                                 {
660                                         t項目リストの設定(Eメニュー種別.DisplayDrums);
661                                 };
662                                 DisplayMenu.Guitar.OnEnterDelegate = () =>
663                                 {
664                                         t項目リストの設定(Eメニュー種別.DisplayGuitar);
665                                 };
666                                 DisplayMenu.Bass.OnEnterDelegate = () =>
667                                 {
668                                         t項目リストの設定(Eメニュー種別.DisplayBass);
669                                 };
670                                 DisplayMenu.System.OnEnterDelegate = () =>
671                                 {
672                                         t項目リストの設定(Eメニュー種別.DisplaySystem);
673                                 };
674                                 KeyAssignMenu.Drums.OnEnterDelegate = () =>
675                                 {
676                                         t項目リストの設定(Eメニュー種別.KeyAssignDrums);
677                                 };
678                                 KeyAssignMenu.Guitar.OnEnterDelegate = () =>
679                                 {
680                                         t項目リストの設定(Eメニュー種別.KeyAssignGuitar);
681                                 };
682                                 KeyAssignMenu.Bass.OnEnterDelegate = () =>
683                                 {
684                                         t項目リストの設定(Eメニュー種別.KeyAssignBass);
685                                 };
686                                 KeyAssignMenu.System.OnEnterDelegate = () =>
687                                 {
688                                         t項目リストの設定(Eメニュー種別.KeyAssignSystem);
689                                 };
690
691                                 ReturnToMenu.Drums.OnEnterDelegate = () =>
692                                 {
693                                         t項目リストの設定(Eメニュー種別.Drums);
694                                 };
695                                 ReturnToMenu.Guitar.OnEnterDelegate = () =>
696                                 {
697                                         t項目リストの設定(Eメニュー種別.Guitar);
698                                 };
699                                 ReturnToMenu.Bass.OnEnterDelegate = () =>
700                                 {
701                                         t項目リストの設定(Eメニュー種別.Bass);
702                                 };
703                                 ReturnToMenu.System.OnEnterDelegate = () =>
704                                 {
705                                         t項目リストの設定(Eメニュー種別.System);
706                                 };
707                                 EDrumsMenu.Drums.OnEnterDelegate = () =>
708                                 {
709                                         t項目リストの設定(Eメニュー種別.EDrumsSettings);
710                                 };
711                                 HitRangeMenu.OnEnterDelegate = () =>
712                                 {
713                                         t項目リストの設定( Eメニュー種別.HitRangeSettings );
714                                 };
715                                 SoundMenu.OnEnterDelegate = () =>
716                                 {
717                                         t項目リストの設定( Eメニュー種別.SoundSettings );
718                                 };
719
720                                 #region [ スキン選択肢と、現在選択中のスキン(index)の準備 #28195 2012.5.2 yyagi ]
721                                 int ns = (CDTXMania.Instance.Skin.strSystemSkinSubfolders == null) ? 0 : CDTXMania.Instance.Skin.strSystemSkinSubfolders.Length;
722                                 int nb = (CDTXMania.Instance.Skin.strBoxDefSkinSubfolders == null) ? 0 : CDTXMania.Instance.Skin.strBoxDefSkinSubfolders.Length;
723
724                                 skinSubFolders = new string[ns + nb];
725                                 skinInitial = CDTXMania.Instance.Skin.GetCurrentSkinSubfolderFullName(true);
726                                 int initIdx = 0;
727                                 for (int i = 0; i < ns; i++)
728                                 {
729                                         skinSubFolders[i] = CDTXMania.Instance.Skin.strSystemSkinSubfolders[i];
730                                 }
731                                 for (int i = 0; i < nb; i++)
732                                 {
733                                         skinSubFolders[ns + i] = CDTXMania.Instance.Skin.strBoxDefSkinSubfolders[i];
734                                 }
735                                 Array.Sort(skinSubFolders);
736                                 skinNames = CSkin.GetSkinName(skinSubFolders);
737                                 initIdx = Array.BinarySearch(skinSubFolders, skinInitial);
738                                 if (initIdx < 0)
739                                 {
740                                         initIdx = 0;
741                                 }
742                                 skins = new COptionStringList(skinNames[initIdx]);
743                                 skins.Initialize("Skin", Properties.Resources.strCfgSysSkin, skinNames);
744
745                                 skins.OnEnterDelegate = () =>
746                                 {
747                                         CDTXMania.Instance.Skin.SetCurrentSkinSubfolderFullName(skinSubFolders[skins.Index], true);
748                                         CDTXMania.Instance.ConfigIni.strSystemSkinSubfolderPath.Value = skinSubFolders[skins.Index];
749                                         tGenerateSkinSample();
750                                 };
751                                 #endregion
752
753                                 // CONFIG脱出時にこの値から変更されているようなら
754                                 // サウンドデバイスを再構築する
755                                 this.InitialSystemSoundType = CDTXMania.Instance.ConfigIni.nSoundDeviceType;
756                                 this.InitialWASAPIBufferSizeMs = CDTXMania.Instance.ConfigIni.nWASAPIBufferSizeMs;
757                                 this.InitialASIODevice = CDTXMania.Instance.ConfigIni.strASIODevice.Index;
758                                 this.InitialUseOSTimer = CDTXMania.Instance.ConfigIni.bUseOSTimer;
759                                 this.InitialWASAPIEventDriven = CDTXMania.Instance.ConfigIni.bEventDrivenWASAPI;
760
761                                 this.InitialForceHighPower = CDTXMania.Instance.ConfigIni.bForceHighPowerPlan;
762
763                                 // #27795 2012.3.11 yyagi; System設定の中でDrumsの設定を参照しているため、
764                                 this.t項目リストの設定(Eメニュー種別.Bass);
765                                 // 活性化の時点でDrumsの設定も入れ込んでおかないと、System設定中に例外発生することがある。
766                                 this.t項目リストの設定(Eメニュー種別.Guitar);
767                                 this.t項目リストの設定(Eメニュー種別.Drums);
768                                 // 順番として、最後にSystemを持ってくること。設定一覧の初期位置がSystemのため。
769                                 this.t項目リストの設定(Eメニュー種別.System);
770
771                                 base.On活性化();
772                         }
773                 }
774
775                 public override void On非活性化()
776                 {
777                         if (b活性化してる)
778                         {
779                                 CDTXMania.Instance.SaveConfig();
780                                 this.list項目リスト.Clear();
781                                 this.ct三角矢印アニメ = null;
782
783                                 OnListMenuの解放();
784                                 prvFont.Dispose();
785
786                                 base.On非活性化();
787                                 #region [ Skin変更 ]
788                                 if (CDTXMania.Instance.Skin.GetCurrentSkinSubfolderFullName(true) != this.skinInitial)
789                                 {
790                                         CDTXMania.Instance.stageChangeSkin.tChangeSkinMain();   // #28195 2012.6.11 yyagi CONFIG脱出時にSkin更新
791                                 }
792                                 #endregion
793
794                                 // #24820 2013.1.22 yyagi CONFIGでWASAPI/ASIO/DirectSound関連の設定を変更した場合、サウンドデバイスを再構築する。
795                                 // #33689 2014.6.17 yyagi CONFIGでSoundTimerTypeの設定を変更した場合も、サウンドデバイスを再構築する。
796                                 #region [ サウンドデバイス変更 ]
797                                 if (InitialSystemSoundType != CDTXMania.Instance.ConfigIni.nSoundDeviceType ||
798                                                 InitialWASAPIBufferSizeMs != CDTXMania.Instance.ConfigIni.nWASAPIBufferSizeMs ||
799                                                 InitialASIODevice != CDTXMania.Instance.ConfigIni.strASIODevice.Index ||
800                                                 InitialUseOSTimer != CDTXMania.Instance.ConfigIni.bUseOSTimer ||
801                                                 InitialWASAPIEventDriven != CDTXMania.Instance.ConfigIni.bEventDrivenWASAPI )
802                                 {
803                                         ESoundDeviceType soundDeviceType;
804                                         switch (CDTXMania.Instance.ConfigIni.nSoundDeviceType.Value)
805                                         {
806                                                 case ESoundDeviceTypeForConfig.DSound:
807                                                         soundDeviceType = ESoundDeviceType.DirectSound;
808                                                         break;
809                                                 case ESoundDeviceTypeForConfig.ASIO:
810                                                         soundDeviceType = ESoundDeviceType.ASIO;
811                                                         break;
812                                                 case ESoundDeviceTypeForConfig.WASAPI_Exclusive:
813                                                         soundDeviceType = ESoundDeviceType.ExclusiveWASAPI;
814                                                         break;
815                                                 case ESoundDeviceTypeForConfig.WASAPI_Shared:
816                                                         soundDeviceType = ESoundDeviceType.SharedWASAPI;
817                                                         break;
818                                                 default:
819                                                         soundDeviceType = ESoundDeviceType.Unknown;
820                                                         break;
821                                         }
822
823                                         CDTXMania.Instance.Sound管理.t初期化(
824                                                         soundDeviceType,
825                                                         CDTXMania.Instance.ConfigIni.nWASAPIBufferSizeMs,
826                                                         CDTXMania.Instance.ConfigIni.bEventDrivenWASAPI,
827                                                         0,
828                                                         CDTXMania.Instance.ConfigIni.strASIODevice.Index,
829                                                         CDTXMania.Instance.ConfigIni.bUseOSTimer);
830                                         CDTXMania.Instance.ShowWindowTitleWithSoundType();
831                                 }
832                                 #endregion
833
834                                 #region [ メトロノーム音 音量設定 ]
835                                 CDTXMania.Instance.Skin.soundClickHigh.n音量 = CDTXMania.Instance.ConfigIni.nClickHighVolume;
836                                 CDTXMania.Instance.Skin.soundClickLow.n音量 = CDTXMania.Instance.ConfigIni.nClickLowVolume;
837                                 #endregion
838
839                                 #region [ サウンドのタイムストレッチモード変更 ]
840
841                                 FDK.CSound管理.bIsTimeStretch = CDTXMania.Instance.ConfigIni.bUseOSTimer;
842
843                                 #endregion
844                                 #region [ 電源プラン変更 ]
845                                 if ( CDTXMania.Instance.ConfigIni.bForceHighPowerPlan )
846                                 {
847                                         CPowerPlan.ChangeHighPerformance();
848                                 }
849                                 else
850                                 {
851                                         // HighPower=OFFを維持したとき、またはONからOFFにしたときは、
852                                         // 特に電源プランの変更をしない。
853                                         // 電源プランの復元は、アプリ終了時に行う。
854                                         // CPowerPlan.RestoreCurrentPowerPlan();
855                                 }
856                                 #endregion
857                         }
858                 }
859
860                 public override void OnManagedリソースの作成()
861                 {
862                         if (b活性化してる)
863                         {
864                                 this.tx通常項目行パネル = TextureFactory.tテクスチャの生成Af(CSkin.Path(@"Graphics\ScreenConfig itembox.png"), false);
865                                 this.txその他項目行パネル = TextureFactory.tテクスチャの生成Af(CSkin.Path(@"Graphics\ScreenConfig itembox other.png"), false);
866                                 this.tx三角矢印 = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenConfig triangle arrow.png"), false);
867                                 // スキン選択時に動的に設定するため、ここでは初期化しない
868                                 this.txSkinSample = null;
869                                 OnListMenuの初期化();
870                                 base.OnManagedリソースの作成();
871                         }
872                 }
873
874                 public override void OnManagedリソースの解放()
875                 {
876                         if (b活性化してる)
877                         {
878                                 TextureFactory.tテクスチャの解放(ref this.txSkinSample);
879                                 TextureFactory.tテクスチャの解放(ref this.tx通常項目行パネル);
880                                 TextureFactory.tテクスチャの解放(ref this.txその他項目行パネル);
881                                 TextureFactory.tテクスチャの解放(ref this.tx三角矢印);
882
883                                 OnListMenuの解放();
884
885                                 base.OnManagedリソースの解放();
886                         }
887                 }
888
889                 private void OnListMenuの初期化()
890                 {
891                         OnListMenuの解放();
892                         this.listMenu = new stMenuItemRight[this.list項目リスト.Count];
893                 }
894
895                 /// <summary>
896                 /// 事前にレンダリングしておいたテクスチャを解放する。
897                 /// </summary>
898                 private void OnListMenuの解放()
899                 {
900                         if (listMenu != null)
901                         {
902                                 for (int i = 0; i < listMenu.Length; i++)
903                                 {
904                                         TextureFactory.tテクスチャの解放(ref listMenu[i].txParam);
905                                         TextureFactory.tテクスチャの解放(ref listMenu[i].txParamColored);
906                                         TextureFactory.tテクスチャの解放(ref listMenu[i].txMenuItemRight);
907                                 }
908                                 this.listMenu = null;
909                         }
910                 }
911
912                 public override int On進行描画()
913                 {
914                         throw new InvalidOperationException("t進行描画(bool)のほうを使用してください。");
915                 }
916
917                 public int t進行描画(bool b項目リスト側にフォーカスがある)
918                 {
919                         if (this.b活性化してる)
920                         {
921                                 #region [ 初めての進行描画 ]
922                                 //-----------------
923                                 if (base.b初めての進行描画)
924                                 {
925                                         this.nスクロール用タイマ値 = CSound管理.rc演奏用タイマ.n現在時刻;
926                                         this.ct三角矢印アニメ.t開始(0, 9, 50, CDTXMania.Instance.Timer);
927
928                                         base.b初めての進行描画 = false;
929                                 }
930                                 //-----------------
931                                 #endregion
932
933                                 this.b項目リスト側にフォーカスがある = b項目リスト側にフォーカスがある;       // 記憶
934
935                                 #region [ 項目スクロールの進行 ]
936                                 //-----------------
937                                 long n現在時刻 = CDTXMania.Instance.Timer.n現在時刻;
938                                 if (n現在時刻 < this.nスクロール用タイマ値) this.nスクロール用タイマ値 = n現在時刻;
939
940                                 const int INTERVAL = 2; // [ms]
941                                 while ((n現在時刻 - this.nスクロール用タイマ値) >= INTERVAL)
942                                 {
943                                         int n目標項目までのスクロール量 = Math.Abs((int)(this.n目標のスクロールカウンタ - this.n現在のスクロールカウンタ));
944                                         int n加速度 = 0;
945
946                                         #region [ n加速度の決定;目標まで遠いほど加速する。]
947                                         //-----------------
948                                         if (n目標項目までのスクロール量 <= 100)
949                                         {
950                                                 n加速度 = 2;
951                                         }
952                                         else if (n目標項目までのスクロール量 <= 300)
953                                         {
954                                                 n加速度 = 3;
955                                         }
956                                         else if (n目標項目までのスクロール量 <= 500)
957                                         {
958                                                 n加速度 = 4;
959                                         }
960                                         else
961                                         {
962                                                 n加速度 = 8;
963                                         }
964                                         //-----------------
965                                         #endregion
966                                         #region [ this.n現在のスクロールカウンタに n加速度 を加減算。]
967                                         //-----------------
968                                         if (this.n現在のスクロールカウンタ < this.n目標のスクロールカウンタ)
969                                         {
970                                                 this.n現在のスクロールカウンタ += n加速度;
971                                                 if (this.n現在のスクロールカウンタ > this.n目標のスクロールカウンタ)
972                                                 {
973                                                         // 目標を超えたら目標値で停止。
974                                                         this.n現在のスクロールカウンタ = this.n目標のスクロールカウンタ;
975                                                 }
976                                         }
977                                         else if (this.n現在のスクロールカウンタ > this.n目標のスクロールカウンタ)
978                                         {
979                                                 this.n現在のスクロールカウンタ -= n加速度;
980                                                 if (this.n現在のスクロールカウンタ < this.n目標のスクロールカウンタ)
981                                                 {
982                                                         // 目標を超えたら目標値で停止。
983                                                         this.n現在のスクロールカウンタ = this.n目標のスクロールカウンタ;
984                                                 }
985                                         }
986                                         //-----------------
987                                         #endregion
988                                         #region [ 行超え処理、ならびに目標位置に到達したらスクロールを停止して項目変更通知を発行。]
989                                         //-----------------
990                                         if (this.n現在のスクロールカウンタ >= 100)
991                                         {
992                                                 this.n現在の選択項目 = this.t次の項目(this.n現在の選択項目);
993                                                 this.n現在のスクロールカウンタ -= 100;
994                                                 this.n目標のスクロールカウンタ -= 100;
995                                                 if (this.n目標のスクロールカウンタ == 0)
996                                                 {
997                                                         CDTXMania.Instance.stageコンフィグ.t項目変更通知();
998                                                 }
999                                         }
1000                                         else if (this.n現在のスクロールカウンタ <= -100)
1001                                         {
1002                                                 this.n現在の選択項目 = this.t前の項目(this.n現在の選択項目);
1003                                                 this.n現在のスクロールカウンタ += 100;
1004                                                 this.n目標のスクロールカウンタ += 100;
1005                                                 if (this.n目標のスクロールカウンタ == 0)
1006                                                 {
1007                                                         CDTXMania.Instance.stageコンフィグ.t項目変更通知();
1008                                                 }
1009                                         }
1010                                         //-----------------
1011                                         #endregion
1012
1013                                         this.nスクロール用タイマ値 += INTERVAL;
1014                                 }
1015                                 //-----------------
1016                                 #endregion
1017
1018                                 #region [ ▲印アニメの進行 ]
1019                                 if (this.b項目リスト側にフォーカスがある && (this.n目標のスクロールカウンタ == 0))
1020                                 {
1021                                         this.ct三角矢印アニメ.t進行Loop();
1022                                 }
1023                                 #endregion
1024
1025
1026                                 // 描画
1027
1028                                 // メニューにフォーカスがあるなら、項目リストの中央は頭を出さない。
1029                                 this.ptパネルの基本座標[4].X = this.b項目リスト側にフォーカスがある ? 276 : 301;
1030
1031                                 #region [ 計11個の項目パネルを描画する。]
1032                                 //-----------------
1033                                 int nItem = this.n現在の選択項目;
1034                                 for (int i = 0; i < 4; i++)
1035                                 {
1036                                         nItem = this.t前の項目(nItem);
1037                                 }
1038
1039                                 for (int n行番号 = -4; n行番号 < 6; n行番号++)
1040                                 {
1041                                         // n行番号 == 0 がフォーカスされている項目パネル。
1042                                         #region [ 今まさに画面外に飛びだそうとしている項目パネルは描画しない。]
1043                                         if (((n行番号 == -4) && (this.n現在のスクロールカウンタ > 0)) ||
1044                                                         ((n行番号 == +5) && (this.n現在のスクロールカウンタ < 0)))
1045                                         {
1046                                                 nItem = this.t次の項目(nItem);
1047                                                 continue;
1048                                         }
1049                                         #endregion
1050
1051                                         int n移動元の行の基本位置 = n行番号 + 4;
1052                                         int n移動先の行の基本位置 = (this.n現在のスクロールカウンタ <= 0) ? ((n移動元の行の基本位置 + 1) % 10) : (((n移動元の行の基本位置 - 1) + 10) % 10);
1053                                         int x = this.ptパネルの基本座標[n移動元の行の基本位置].X + ((int)((this.ptパネルの基本座標[n移動先の行の基本位置].X - this.ptパネルの基本座標[n移動元の行の基本位置].X) * (((double)Math.Abs(this.n現在のスクロールカウンタ)) / 100.0)));
1054                                         int y = this.ptパネルの基本座標[n移動元の行の基本位置].Y + ((int)((this.ptパネルの基本座標[n移動先の行の基本位置].Y - this.ptパネルの基本座標[n移動元の行の基本位置].Y) * (((double)Math.Abs(this.n現在のスクロールカウンタ)) / 100.0)));
1055
1056                                         #region [ 現在の行の項目パネル枠を描画。]
1057                                         if (this.list項目リスト[nItem].type == EOptionType.Normal)
1058                                         {
1059                                                 if (this.tx通常項目行パネル != null)
1060                                                 {
1061                                                         this.tx通常項目行パネル.t2D描画(CDTXMania.Instance.Device, x * Scale.X, y * Scale.Y);
1062                                                 }
1063                                         }
1064                                         else if (this.list項目リスト[nItem].type == EOptionType.Other)
1065                                         {
1066                                                 if (this.txその他項目行パネル != null)
1067                                                 {
1068                                                         this.txその他項目行パネル.t2D描画(CDTXMania.Instance.Device, x * Scale.X, y * Scale.Y);
1069                                                 }
1070                                         }
1071                                         #endregion
1072
1073                                         #region [ 現在の行の項目名を描画。]
1074                                         if (listMenu[nItem].txMenuItemRight != null)
1075                                         {
1076                                                 // 自前のキャッシュに含まれているようなら、再レンダリングせずキャッシュを使用
1077                                                 listMenu[nItem].txMenuItemRight.t2D描画(CDTXMania.Instance.Device, (x + 0x12) * Scale.X, (y + 12) * Scale.Y - 20);
1078                                         }
1079                                         else
1080                                         {
1081                                                 using (Bitmap bmpItem = prvFont.DrawPrivateFont(this.list項目リスト[nItem].label, Color.White, Color.Black))
1082                                                 {
1083                                                         TextureFactory.tテクスチャの解放(ref listMenu[nItem].txMenuItemRight);
1084                                                         listMenu[nItem].txMenuItemRight = TextureFactory.tテクスチャの生成(bmpItem);
1085                                                 }
1086                                         }
1087                                         #endregion
1088
1089                                         #region [ 現在の行の項目の要素を描画。]
1090                                         string strParam = this.list項目リスト[nItem].ToString();
1091                                         //bool b強調 = false;
1092
1093                                         #region [ 最初にSkinの選択肢にきたとき(Enterを押す前)に限り、サンプル生成が発生する。 #28195 2012.5.2 yyagi ]
1094                                         if (this.list項目リスト[this.n現在の選択項目] == skins)
1095                                         {
1096                                                 if (txSkinSample == null)
1097                                                 {
1098                                                         tGenerateSkinSample();
1099                                                 }
1100                                                 if (txSkinSample != null)
1101                                                 {
1102                                                         txSkinSample.t2D描画(CDTXMania.Instance.Device, 56 * Scale.X, 300 * Scale.Y);
1103                                                 }
1104                                         }
1105                                         #endregion
1106
1107                                         #endregion
1108                                         int nIndex = this.list項目リスト[nItem].Index;
1109                                         bool bColored = list項目リスト[nItem] is COptionInteger && n行番号 == 0 && b要素値にフォーカス中;
1110                                         if (listMenu[nItem].nParam != nIndex ||
1111                                                 (listMenu[nItem].txParam == null) ||
1112                                                 (bColored && listMenu[nItem].txParamColored == null))
1113                                         {
1114                                                 listMenu[nItem].nParam = nIndex;
1115                                                 listMenu[nItem].strParam = this.list項目リスト[nItem].ToString();
1116                                                 using (Bitmap bmpStr = prvFont.DrawPrivateFont(strParam, Color.White, Color.Black))
1117                                                 {
1118                                                         TextureFactory.tテクスチャの解放(ref listMenu[nItem].txParam);
1119                                                         listMenu[nItem].txParam = TextureFactory.tテクスチャの生成(bmpStr, false);
1120                                                         if (bColored)
1121                                                         {
1122                                                                 using (Bitmap bmpStrColored = prvFont.DrawPrivateFont(strParam, Color.White, Color.Black, Color.Yellow, Color.OrangeRed))
1123                                                                 {
1124                                                                         TextureFactory.tテクスチャの解放(ref listMenu[nItem].txParamColored);
1125                                                                         listMenu[nItem].txParamColored = TextureFactory.tテクスチャの生成(bmpStrColored, false);
1126                                                                 }
1127                                                         }
1128                                                 }
1129                                         }
1130
1131                                         if (bColored)
1132                                         {
1133                                                 listMenu[nItem].txParamColored.t2D描画(CDTXMania.Instance.Device, (x + 210) * Scale.X, (y + 12) * Scale.Y - 20);
1134                                         }
1135                                         else
1136                                         {
1137                                                 listMenu[nItem].txParam.t2D描画(CDTXMania.Instance.Device, (x + 210) * Scale.X, (y + 12) * Scale.Y - 20);
1138                                         }
1139                                         nItem = this.t次の項目(nItem);
1140                                 }
1141                                 #endregion
1142
1143                                 #region [ 項目リストにフォーカスがあって、かつスクロールが停止しているなら、パネルの上下に▲印を描画する。]
1144                                 if (this.b項目リスト側にフォーカスがある && (this.n目標のスクロールカウンタ == 0))
1145                                 {
1146                                         int x;
1147                                         int y_upper;
1148                                         int y_lower;
1149
1150                                         // 位置決定。
1151
1152                                         if (this.b要素値にフォーカス中)
1153                                         {
1154                                                 // 要素値の上下あたり。
1155                                                 x = 528;
1156                                                 y_upper = 198 - this.ct三角矢印アニメ.n現在の値;
1157                                                 y_lower = 242 + this.ct三角矢印アニメ.n現在の値;
1158                                         }
1159                                         else
1160                                         {
1161                                                 // 項目名の上下あたり。
1162                                                 x = 276;
1163                                                 y_upper = 186 - this.ct三角矢印アニメ.n現在の値;
1164                                                 y_lower = 254 + this.ct三角矢印アニメ.n現在の値;
1165                                         }
1166
1167                                         // 描画。
1168
1169                                         if (this.tx三角矢印 != null)
1170                                         {
1171                                                 this.tx三角矢印.t2D描画(CDTXMania.Instance.Device, x * Scale.X,
1172                                                         y_upper * Scale.Y,
1173                                                         new Rectangle(0, 0, (int)(32 * Scale.X), (int)(16 * Scale.Y)));
1174                                                 this.tx三角矢印.t2D描画(CDTXMania.Instance.Device, x * Scale.X,
1175                                                         y_lower * Scale.Y,
1176                                                         new Rectangle(0, (int)(16 * Scale.Y), (int)(32 * Scale.X), (int)(16 * Scale.Y)));
1177                                         }
1178                                 }
1179                                 #endregion
1180                         }
1181                         return 0;
1182                 }
1183
1184
1185                 // その他
1186                 internal enum Eメニュー種別
1187                 {
1188                         System,
1189                         Drums,
1190                         Guitar,
1191                         Bass,
1192                         // #24609 2011.4.12 yyagi: 画面キャプチャキーのアサイン
1193                         KeyAssignSystem,
1194                         KeyAssignDrums,
1195                         KeyAssignGuitar,
1196                         KeyAssignBass,
1197                         DisplaySystem,
1198                         DisplayDrums,
1199                         DisplayGuitar,
1200                         DisplayBass,
1201                         EDrumsSettings,
1202                         HitRangeSettings,
1203                         SoundSettings,
1204                         Unknown
1205                 }
1206
1207                 private int t前の項目(int nItem)
1208                 {
1209                         if (--nItem < 0)
1210                         {
1211                                 nItem = this.list項目リスト.Count - 1;
1212                         }
1213                         return nItem;
1214                 }
1215
1216                 private int t次の項目(int nItem)
1217                 {
1218                         if (++nItem >= this.list項目リスト.Count)
1219                         {
1220                                 nItem = 0;
1221                         }
1222                         return nItem;
1223                 }
1224         }
1225 }