OSDN Git Service

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