OSDN Git Service

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