OSDN Git Service

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