OSDN Git Service

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