OSDN Git Service

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