OSDN Git Service

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