2 using System.Collections.Generic;
\r
3 using System.Globalization;
\r
4 using System.Threading;
\r
5 using System.Windows.Forms;
\r
6 using System.Drawing;
\r
7 using System.ComponentModel;
\r
10 using System.Diagnostics;
\r
11 using System.Xml.Serialization;
\r
12 using DTXCreator.チップパレット関連;
\r
13 using DTXCreator.譜面;
\r
14 using DTXCreator.WAV_BMP_AVI;
\r
15 using DTXCreator.UndoRedo;
\r
16 using DTXCreator.オプション関連;
\r
17 using DTXCreator.MIDIインポート;
\r
18 using DTXCreator.汎用;
\r
19 using DTXCreator.Properties;
\r
22 namespace DTXCreator
\r
24 public partial class Cメインフォーム : Form
\r
32 this.InitializeComponent();
\r
43 public AppSetting appアプリ設定;
\r
44 public Cチップパレット dlgチップパレット;
\r
45 private Cオプション管理 mgrオプション管理者 = null;
\r
46 private C選択モード管理 mgr選択モード管理者 = null;
\r
47 internal C編集モード管理 mgr編集モード管理者 = null;
\r
48 internal C譜面管理 mgr譜面管理者 = null;
\r
49 internal CWAVリスト管理 mgrWAVリスト管理者 = null;
\r
50 internal CBMPリスト管理 mgrBMPリスト管理者 = null;
\r
51 internal CAVIリスト管理 mgrAVIリスト管理者 = null;
\r
52 internal CUndoRedo管理 mgrUndoRedo管理者 = null;
\r
53 internal Cクリップボード cbクリップボード = null;
\r
54 private CMIDIインポート管理 mgrMIDIインポート管理者 = null;
\r
56 internal MakeTempDTX makeTempDTX = null;
\r
58 public bool b選択モードである
\r
62 if( this.toolStripButton選択モード.CheckState != CheckState.Checked )
\r
69 public bool b編集モードである
\r
73 if( this.toolStripButton編集モード.CheckState != CheckState.Checked )
\r
80 public decimal dc現在のBPM
\r
84 return this.numericUpDownBPM.Value;
\r
87 internal int n現在選択中のWAV_BMP_AVIリストの行番号0to1294;
\r
90 /// DTXC.exe のあるフォルダの絶対パス。
\r
92 public string strDTXCのあるフォルダ名;
\r
95 /// 各種ファイル(WAVなど)の相対パスの基点となるフォルダの絶対パス。
\r
97 public string str作業フォルダ名;
\r
100 /// 現在作成中のDTXファイル名。パスは含まない。(例:"test.dtx")
\r
102 public string strDTXファイル名;
\r
105 /// <para>未保存の場合にtrueとなり、ウィンドウタイトルに[*]が加えられる。</para>
\r
115 // 現状と値が違うときだけ更新する。
\r
117 if( this._b未保存 != value )
\r
119 this._b未保存 = value; // #24133 2011.1.14 yyagi: 「代入後にif文分岐」するよう、代入を頭に移動。
\r
123 string strタイトル = Resources.strデフォルトウィンドウタイトル;
\r
125 if( this.strDTXファイル名.Length > 0 )
\r
126 strタイトル = this.strDTXファイル名;
\r
133 // 変更ありかつ未保存なら「*」を付ける
\r
135 this.Text = "DTXC* [" + strタイトル + "]";
\r
136 this.toolStripMenuItem上書き保存.Enabled = true;
\r
137 this.toolStripButton上書き保存.Enabled = true;
\r
141 // 保存後変更がないなら「*」なない
\r
143 this.Text = "DTXC [" + strタイトル + "]";
\r
144 this.toolStripMenuItem上書き保存.Enabled = false;
\r
145 this.toolStripButton上書き保存.Enabled = false;
\r
152 /// 最後にMIDIを読み込んだフォルダ
\r
154 public string strMIDIインポートフォルダ;
\r
156 //-----------------
\r
162 #region [ アプリの起動・初期化、終了 ]
\r
163 //-----------------
\r
164 private void tアプリ起動時に一度だけ行う初期化処理()
\r
168 #region [ アプリ設定オブジェクトを生成する。]
\r
169 //-----------------
\r
170 this.appアプリ設定 = new AppSetting();
\r
171 //-----------------
\r
174 #region [ DTXCreator.exe の存在するフォルダを取得する。 ]
\r
175 //-----------------
\r
176 this.strDTXCのあるフォルダ名 = Directory.GetCurrentDirectory() + @"\";
\r
177 //-----------------
\r
179 #region [ 作業フォルダを取得する。]
\r
180 //-----------------
\r
181 this.str作業フォルダ名 = this.strDTXCのあるフォルダ名;
\r
182 //-----------------
\r
185 #region [ デザイナで設定できないイベントを実装する。]
\r
186 //-----------------
\r
187 this.splitContainerタブと譜面を分割.MouseWheel += new MouseEventHandler( this.splitContainerタブと譜面を分割_MouseWheel );
\r
188 //-----------------
\r
191 #region [ 全体を通して必要な管理者オブジェクトを生成する。]
\r
192 //-----------------
\r
193 this.mgrオプション管理者 = new Cオプション管理( this );
\r
194 this.mgrMIDIインポート管理者 = new CMIDIインポート管理(this);
\r
195 //-----------------
\r
198 #region [ クリップボードオブジェクトを生成する。 ]
\r
199 //-----------------
\r
200 this.cbクリップボード = new Cクリップボード( this );
\r
201 //-----------------
\r
204 #region [ Viewer再生用一時DTX生成オブジェクトを生成する。 ]
\r
205 makeTempDTX = new MakeTempDTX();
\r
208 #region [ 譜面を初期化する。]
\r
209 //-----------------
\r
211 //-----------------
\r
214 #region [ アプリ設定ファイル (DTXCreatorSetting.config) を読み込む。]
\r
215 //-----------------
\r
216 this.tアプリ設定の読み込み(); // 譜面の生成後に行うこと。(GUIイベント発生時にmgr各種が使われるため。)
\r
217 //-----------------
\r
220 #region [ チップパレットウィンドウの初期位置を変更する。(読み込んだアプリ設定に合わせる。)]
\r
221 //-----------------
\r
222 this.dlgチップパレット.Left = this.Left + ( ( this.Width - this.dlgチップパレット.Width ) / 2 );
\r
223 this.dlgチップパレット.Top = this.Top + ( ( this.Height - this.dlgチップパレット.Height ) / 2 );
\r
224 //-----------------
\r
227 #region [ [ファイル]メニューに、最近使ったファイルを追加する。]
\r
228 //-----------------
\r
229 this.t最近使ったファイルをFileメニューへ追加する();
\r
230 //-----------------
\r
234 // ファイル指定があればそれを開く。
\r
236 #region [ コマンドライン引数にファイルの指定があるならそれを開く。 ]
\r
237 //-----------------
\r
238 string[] commandLineArgs = Environment.GetCommandLineArgs();
\r
239 if( ( commandLineArgs.Length > 1 ) && File.Exists( commandLineArgs[ 1 ] ) )
\r
240 this.t演奏ファイルを開いて読み込む( commandLineArgs[ 1 ] );
\r
241 //-----------------
\r
244 private void tアプリ終了時に行う終了処理()
\r
246 #region [ アプリ設定ファイル (DTXCreatorSetting.config) を保存する。]
\r
247 //-----------------
\r
249 //-----------------
\r
252 #region [ 各管理者で必要な終了処理を行う。]
\r
253 //-----------------
\r
254 this.mgrWAVリスト管理者.tDirectSoundの解放();
\r
255 //-----------------
\r
258 #region [ Viewer再生用一時DTX生成オブジェクトの終了処理を行う。 ]
\r
259 makeTempDTX.Dispose();
\r
260 makeTempDTX = null;
\r
263 private void tアプリ設定の読み込み()
\r
265 string str設定ファイル名 =
\r
266 this.strDTXCのあるフォルダ名 + @"DTXCreatorSetting.config";
\r
271 #region [ アプリ設定ファイルを読み込む。 → 失敗したら内容リセットして継続する。]
\r
272 //-----------------
\r
273 if( File.Exists( str設定ファイル名 ) )
\r
277 // アプリ設定ファイル(XML形式)を this.appアプリ設定 に読み込む。
\r
279 var serializer = new XmlSerializer( typeof( AppSetting ) );
\r
280 var stream = new FileStream( str設定ファイル名, FileMode.Open );
\r
281 this.appアプリ設定 = (AppSetting) serializer.Deserialize( stream );
\r
286 // 失敗時:内容をリセットして継続する。
\r
288 this.appアプリ設定 = new AppSetting();
\r
292 // 反復要素とか足りなかったりしてもリセットする。
\r
294 if( this.appアプリ設定.SoundListColumnWidth.Length != 5
\r
295 || this.appアプリ設定.GraphicListColumnWidth.Length != 4
\r
296 || this.appアプリ設定.MovieListColumnWidth.Length != 3
\r
297 || !this.appアプリ設定.bSameVersion() )
\r
299 this.appアプリ設定 = new AppSetting();
\r
305 this.appアプリ設定.Confirm();
\r
307 //-----------------
\r
311 // 読み込んだアプリ設定を DTXCreator に反映する。
\r
313 #region [ ウィンドウの位置とサイズ ]
\r
314 //-----------------
\r
315 this.SetDesktopBounds( this.appアプリ設定.X, this.appアプリ設定.Y, this.appアプリ設定.Width, this.appアプリ設定.Height );
\r
316 //-----------------
\r
319 //-----------------
\r
320 if( this.appアプリ設定.Maximized )
\r
321 this.WindowState = FormWindowState.Maximized;
\r
322 //-----------------
\r
324 #region [ タブ(左側)と譜面(右側)の表示幅の割合 ]
\r
325 //-----------------
\r
326 this.splitContainerタブと譜面を分割.SplitterDistance =
\r
327 this.appアプリ設定.SplitterDistance;
\r
328 //-----------------
\r
330 #region [ WAV・BMP・AVIリストの各列の幅 ]
\r
331 //-----------------
\r
332 for( int i = 0; i < 5; i++ )
\r
333 this.listViewWAVリスト.Columns[ i ].Width = this.appアプリ設定.SoundListColumnWidth[ i ];
\r
335 for( int i = 0; i < 4; i++ )
\r
336 this.listViewBMPリスト.Columns[ i ].Width = this.appアプリ設定.GraphicListColumnWidth[ i ];
\r
338 for( int i = 0; i < 3; i++ )
\r
339 this.listViewAVIリスト.Columns[ i ].Width = this.appアプリ設定.MovieListColumnWidth[ i ];
\r
340 //-----------------
\r
343 //-----------------
\r
344 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
345 this.toolStripComboBox譜面拡大率.SelectedIndex =
\r
346 this.appアプリ設定.HViewScaleIndex;
\r
347 //-----------------
\r
350 //-----------------
\r
351 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
352 this.toolStripComboBoxガイド間隔.SelectedIndex =
\r
353 this.appアプリ設定.GuideIndex;
\r
354 //-----------------
\r
357 //-----------------
\r
358 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
359 this.toolStripComboBox演奏速度.SelectedIndex = 5;
\r
360 //-----------------
\r
363 //-----------------
\r
365 this.appアプリ設定.LastWorkFolder;
\r
367 if( Directory.Exists( this.str作業フォルダ名 ) )
\r
369 //Directory.SetCurrentDirectory( this.str作業フォルダ名 ); // #35399: 2015/8/15 カレントディレクトリを変更すると、.NET4以降用にbuildしたDTXMania本体での再生に失敗するため、カレントディレクトリの変更を中止する
\r
370 // #35399: ただし作業フォルダは維持する(書き設定行は不要だが、if分岐は残す必要あり)
\r
371 // this.str作業フォルダ名 = this.appアプリ設定.LastWorkFolder;
\r
375 // 作業フォルダが既になくなってる場合はカレントフォルダを適用。
\r
377 this.str作業フォルダ名 = Directory.GetCurrentDirectory();
\r
379 //-----------------
\r
381 #region [ レーン表示/非表示の反映 #26005 2011.8.29 yyagi; added ]
\r
382 for ( int i = 0; i < this.appアプリ設定.LanesInfo.Count; i++ )
\r
384 for ( int j = 0; j < this.mgr譜面管理者.listレーン.Count; j++ )
\r
386 if ( this.mgr譜面管理者.listレーン[ j ].strレーン名 == this.appアプリ設定.LanesInfo[ i ].Name )
\r
388 this.mgr譜面管理者.listレーン[ j ].bIsVisible = this.appアプリ設定.LanesInfo[ i ].Checked;
\r
393 this.mgr譜面管理者.tRefreshDisplayLanes();
\r
395 #region [ 選択モード/編集モードの設定 ]
\r
396 if ( this.appアプリ設定.InitialOperationMode )
\r
405 #region [ MIDIインポートフォルダ ]
\r
406 //-----------------
\r
407 this.strMIDIインポートフォルダ = this.appアプリ設定.LastMIDIImportFolder;
\r
409 if( ! Directory.Exists( this.strMIDIインポートフォルダ ) )
\r
410 this.strMIDIインポートフォルダ = Directory.GetCurrentDirectory();
\r
411 //-----------------
\r
415 private void tアプリ設定の保存()
\r
417 string str設定ファイル名 =
\r
418 this.strDTXCのあるフォルダ名 + @"DTXCreatorSetting.config";
\r
421 // DTXCreator から保存すべきアプリ設定を取得する。
\r
423 #region [ #23729 2010.11.22 yyagi: to get DTXC's x, y, width & height correctly, set windowstate "normal" if it is "minimized." ]
\r
424 if (this.WindowState == FormWindowState.Minimized)
\r
426 this.WindowState = FormWindowState.Normal;
\r
429 #region [ ウィンドウの位置とサイズ ]
\r
430 //-----------------
\r
431 this.appアプリ設定.X = this.Location.X;
\r
432 this.appアプリ設定.Y = this.Location.Y;
\r
433 this.appアプリ設定.Width = this.Width;
\r
434 this.appアプリ設定.Height = this.Height;
\r
435 //-----------------
\r
438 //-----------------
\r
439 this.appアプリ設定.Maximized =
\r
440 ( this.WindowState == FormWindowState.Maximized ) ? true : false;
\r
441 //-----------------
\r
443 #region [ タブ(左側)と譜面(右側)の表示幅の割合 ]
\r
444 //-----------------
\r
445 this.appアプリ設定.SplitterDistance =
\r
446 this.splitContainerタブと譜面を分割.SplitterDistance;
\r
447 //-----------------
\r
449 #region [ WAV・BMP・AVIリストの各列の幅 ]
\r
450 //-----------------
\r
451 for( int i = 0; i < 5; i++ )
\r
452 this.appアプリ設定.SoundListColumnWidth[ i ] = this.listViewWAVリスト.Columns[ i ].Width;
\r
454 for( int i = 0; i < 4; i++ )
\r
455 this.appアプリ設定.GraphicListColumnWidth[ i ] = this.listViewBMPリスト.Columns[ i ].Width;
\r
457 for( int i = 0; i < 3; i++ )
\r
458 this.appアプリ設定.MovieListColumnWidth[ i ] = this.listViewAVIリスト.Columns[ i ].Width;
\r
459 //-----------------
\r
462 //-----------------
\r
463 this.appアプリ設定.HViewScaleIndex =
\r
464 this.toolStripComboBox譜面拡大率.SelectedIndex;
\r
465 //-----------------
\r
468 //-----------------
\r
469 this.appアプリ設定.GuideIndex =
\r
470 this.toolStripComboBoxガイド間隔.SelectedIndex;
\r
471 //-----------------
\r
474 //-----------------
\r
475 this.appアプリ設定.LastWorkFolder =
\r
477 //-----------------
\r
479 #region [ レーン表示/非表示 #26005 2011.8.29 yyagi; added ]
\r
480 this.appアプリ設定.LanesInfo.Clear();
\r
481 foreach ( DTXCreator.譜面.Cレーン c in this.mgr譜面管理者.listレーン )
\r
483 this.appアプリ設定.AddLanesInfo( c.strレーン名, c.bIsVisible );
\r
486 #region [ MIDIインポートフォルダ ]
\r
487 //-----------------
\r
488 this.appアプリ設定.LastMIDIImportFolder =
\r
489 this.strMIDIインポートフォルダ;
\r
490 //-----------------
\r
495 #region [ アプリ設定をXML形式ファイルで出力する。 ]
\r
496 //-----------------
\r
497 var serializer = new XmlSerializer( typeof( AppSetting ) );
\r
498 using ( var stream = new FileStream( str設定ファイル名, FileMode.Create ) ) // #33204 2014.2.13 yyagi usingを使って、エラー発生時のファイルロックを回避
\r
500 serializer.Serialize( (Stream) stream, this.appアプリ設定 );
\r
502 //-----------------
\r
505 //-----------------
\r
508 //-----------------
\r
509 public void tシナリオ_新規作成()
\r
513 #region [ 未保存なら保存する。→ キャンセルされた場合はここで中断。]
\r
514 //-----------------
\r
515 if( this.t未保存なら保存する() == DialogResult.Cancel )
\r
517 //-----------------
\r
523 #region [「初期化中です」ポップアップを表示する。]
\r
524 //-----------------
\r
525 this.dlgチップパレット.t一時的に隠蔽する();
\r
528 = new Cメッセージポップアップ( Resources.str初期化中ですMSG + Environment.NewLine + Resources.strしばらくお待ち下さいMSG );
\r
532 //-----------------
\r
537 #region [「初期化中です」ポップアップを閉じる。]
\r
538 //-----------------
\r
540 this.dlgチップパレット.t一時的な隠蔽を解除する();
\r
542 this.Refresh(); // リスト内容等を消すために再描画
\r
543 //-----------------
\r
546 private void t譜面を初期化する()
\r
548 this.strDTXファイル名 = "";
\r
552 #region [ 基本情報タブの初期化 ]
\r
553 //-----------------
\r
554 CUndoRedo管理.bUndoRedoした直後 = true; this.textBox曲名.Clear();
\r
555 CUndoRedo管理.bUndoRedoした直後 = true; this.textBox製作者.Clear();
\r
556 CUndoRedo管理.bUndoRedoした直後 = true; this.textBoxGenre.Clear();
\r
557 CUndoRedo管理.bUndoRedoした直後 = true; this.textBoxコメント.Clear();
\r
558 CUndoRedo管理.bUndoRedoした直後 = true; this.numericUpDownBPM.Value = 120.0M;
\r
559 CUndoRedo管理.bUndoRedoした直後 = true; this.textBoxDLEVEL.Text = "50";
\r
560 CUndoRedo管理.bUndoRedoした直後 = true; this.textBoxGLEVEL.Text = "0";
\r
561 CUndoRedo管理.bUndoRedoした直後 = true; this.textBoxBLEVEL.Text = "0";
\r
562 CUndoRedo管理.bUndoRedoした直後 = true; this.hScrollBarDLEVEL.Value = 50;
\r
563 CUndoRedo管理.bUndoRedoした直後 = true; this.hScrollBarGLEVEL.Value = 0;
\r
564 CUndoRedo管理.bUndoRedoした直後 = true; this.hScrollBarBLEVEL.Value = 0;
\r
565 CUndoRedo管理.bUndoRedoした直後 = true; this.textBoxパネル.Clear();
\r
566 CUndoRedo管理.bUndoRedoした直後 = true; this.textBoxPREVIEW.Clear();
\r
567 CUndoRedo管理.bUndoRedoした直後 = true; this.textBoxPREIMAGE.Clear();
\r
568 CUndoRedo管理.bUndoRedoした直後 = true; this.textBoxSTAGEFILE.Clear();
\r
569 CUndoRedo管理.bUndoRedoした直後 = true; this.textBoxBACKGROUND.Clear();
\r
570 CUndoRedo管理.bUndoRedoした直後 = true; this.textBoxRESULTIMAGE.Clear();
\r
571 CUndoRedo管理.bUndoRedoした直後 = true; this.check556x710BGAAVI.Checked = false;
\r
572 //-----------------
\r
575 #region [ WAVタブ・BMPタブ・AVIタブの初期化 ]
\r
576 //-----------------
\r
577 this.listViewWAVリスト.Items.Clear();
\r
578 this.mgrWAVリスト管理者 = new CWAVリスト管理( this, this.listViewWAVリスト );
\r
580 this.listViewBMPリスト.Items.Clear();
\r
581 this.mgrBMPリスト管理者 = new CBMPリスト管理( this, this.listViewBMPリスト );
\r
583 this.listViewAVIリスト.Items.Clear();
\r
584 this.mgrAVIリスト管理者 = new CAVIリスト管理( this, this.listViewAVIリスト );
\r
586 this.tWAV_BMP_AVIリストのカーソルを全部同じ行に合わせる( 0 );
\r
587 //-----------------
\r
590 #region [ 自由入力タブの初期化 ]
\r
591 //-----------------
\r
592 CUndoRedo管理.bUndoRedoした直後 = true; this.textBox自由入力欄.Clear();
\r
593 //-----------------
\r
596 #region [ チップパレットの初期化 ]
\r
597 //-----------------
\r
598 if( this.dlgチップパレット != null )
\r
599 this.dlgチップパレット.Close();
\r
601 this.dlgチップパレット = new Cチップパレット( this );
\r
602 this.dlgチップパレット.Left = this.Left + ( this.Width - this.dlgチップパレット.Width ) / 2;
\r
603 this.dlgチップパレット.Top = this.Top + ( this.Height - this.dlgチップパレット.Height ) / 2;
\r
604 this.dlgチップパレット.Owner = this;
\r
606 if( this.toolStripButtonチップパレット.CheckState == CheckState.Checked )
\r
607 this.dlgチップパレット.t表示する();
\r
608 //-----------------
\r
611 #region [ 譜面の生成・初期化 ]
\r
612 //-----------------
\r
613 if ( this.mgr譜面管理者 == null ) // 初回起動時は、レーン表示有無の構成に初期値を使用(して、後でDTXCreatorConfig.settingsのものに置き換える)
\r
615 this.mgr譜面管理者 = new C譜面管理( this );
\r
616 this.mgr譜面管理者.t初期化();
\r
618 else // 起動後のdtxファイル読み込み等の場合は、直前のレーン表示有無の構成を踏襲する
\r
620 #region [ レーン表示/非表示状態の待避 #26005 2011.8.30 yyagi; added ]
\r
621 List<Cレーン> lc = new List<Cレーン>(this.mgr譜面管理者.listレーン);
\r
624 this.mgr譜面管理者 = new C譜面管理( this );
\r
625 this.mgr譜面管理者.t初期化();
\r
627 #region [ レーン表示/非表示の反映 #26005 2011.8.30 yyagi; added ]
\r
628 for ( int i = 0; i < this.mgr譜面管理者.listレーン.Count; i++ )
\r
630 this.mgr譜面管理者.listレーン[ i ].bIsVisible = lc[ i ].bIsVisible;
\r
632 this.mgr譜面管理者.tRefreshDisplayLanes();
\r
635 //-----------------
\r
638 #region [ DTXViewer 関連 GUI の初期化 ]
\r
639 //-----------------
\r
640 this.tDTXV演奏関連のボタンとメニューのEnabledの設定();
\r
641 //-----------------
\r
644 #region [ ガイド間隔の初期値を設定する。]
\r
645 //-----------------
\r
646 this.tガイド間隔を変更する( 16 );
\r
647 //-----------------
\r
653 #region [ Undo/Redoリストのリセット ]
\r
654 //-----------------
\r
655 this.mgrUndoRedo管理者 = new CUndoRedo管理();
\r
657 CUndoRedo管理.bUndoRedoした直後 = false;
\r
658 this.tUndoRedo用GUIの有効無効を設定する();
\r
659 //-----------------
\r
662 #region [ 「2大モード」の管理者を生成、初期モードは、設定値から取得する・・・が、起動時は譜面生成後に設定値を読みだすので、設定値読み出し後に再設定すること。。]
\r
663 //-----------------
\r
664 this.mgr選択モード管理者 = new C選択モード管理( this );
\r
665 this.mgr編集モード管理者 = new C編集モード管理( this );
\r
667 if ( this.appアプリ設定.InitialOperationMode )
\r
675 //-----------------
\r
679 // 上記のプロパティ変更操作により未保存フラグがtrueになってしまってるので、元に戻す。
\r
681 #region [ 未保存フラグをクリアする。]
\r
682 //-----------------
\r
684 //-----------------
\r
686 #region [ 再生制御用フラグを立てる。(DTXVに必ずリロードさせるため) ]
\r
687 //-----------------
\r
688 this.bDTXファイルを開いた = true;
\r
689 //-----------------
\r
692 //-----------------
\r
695 //-----------------
\r
696 private void tシナリオ_開く()
\r
700 #region [ 未保存なら保存する。→ キャンセルされた場合はここで中断。]
\r
701 //-----------------
\r
702 if( this.t未保存なら保存する() == DialogResult.Cancel )
\r
704 //-----------------
\r
710 #region [ 「ファイルを開く」ダイアログでファイルを選択する。 ]
\r
711 //-----------------
\r
712 this.dlgチップパレット.t一時的に隠蔽する();
\r
714 OpenFileDialog dialog = new OpenFileDialog();
\r
715 dialog.Title = Resources.strDTXファイル選択ダイアログのタイトル;
\r
716 dialog.Filter = Resources.strDTXファイル選択ダイアログのフィルタ;
\r
717 dialog.FilterIndex = 1;
\r
718 dialog.InitialDirectory = this.str作業フォルダ名;
\r
719 DialogResult result = dialog.ShowDialog();
\r
721 this.dlgチップパレット.t一時的な隠蔽を解除する();
\r
722 this.Refresh(); // メインフォームを再描画してダイアログを完全に消す
\r
724 if( result != DialogResult.OK )
\r
726 //-----------------
\r
732 #region [ ファイルを読み込む。]
\r
733 //-----------------
\r
734 this.t演奏ファイルを開いて読み込む( dialog.FileName );
\r
735 //-----------------
\r
738 private void tシナリオ_DragDropされたファイルを開く( string[] DropFiles )
\r
742 #region [ Dropされたファイルが複数個ある → 先頭のファイルだけを有効とする。 ]
\r
743 //-----------------
\r
744 string strファイル名 = DropFiles[ 0 ];
\r
745 //-----------------
\r
751 #region [ 未保存なら保存する。→ キャンセルされた場合はここで中断。]
\r
752 //-----------------
\r
753 if( this.t未保存なら保存する() == DialogResult.Cancel )
\r
755 //-----------------
\r
759 // Drop されたファイルを読み込む。
\r
761 #region [ ファイルを読み込む。]
\r
762 //-----------------
\r
763 string strExt = Path.GetExtension( strファイル名 ).ToLower();
\r
765 if ( strExt.Equals(".dtx") )
\r
767 this.t演奏ファイルを開いて読み込む( strファイル名 );
\r
769 else if (strExt.Equals(".smf") || strExt.Equals(".mid"))
\r
771 this.mgrMIDIインポート管理者.tMIDIインポート管理を開く( strファイル名 );
\r
772 this.mgr譜面管理者.tRefreshDisplayLanes(); // レーンの表示/非表示切り替えに備えて追加
\r
777 Resources.strDTXファイルではありませんMSG,
\r
778 Resources.str確認ダイアログのタイトル,
\r
779 MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1 );
\r
783 //-----------------
\r
786 private void t演奏ファイルを開いて読み込む( string strファイル名 )
\r
790 #region [ ファイルの存在を確認する。なかったらその旨を表示して中断する。]
\r
791 //-----------------
\r
792 if( !File.Exists( strファイル名 ) )
\r
795 Resources.strファイルが存在しませんMSG,
\r
796 Resources.str確認ダイアログのタイトル,
\r
797 MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1 );
\r
801 //-----------------
\r
804 #region [ 拡張子からデータ種別を判定する。]
\r
805 //-----------------
\r
807 CDTX入出力.E種別 e種別 = CDTX入出力.E種別.DTX;
\r
809 string str拡張子 = Path.GetExtension( strファイル名 );
\r
811 if( str拡張子.Equals( ".dtx", StringComparison.OrdinalIgnoreCase ) )
\r
813 e種別 = CDTX入出力.E種別.DTX;
\r
815 else if( str拡張子.Equals( ".gda", StringComparison.OrdinalIgnoreCase ) )
\r
817 e種別 = CDTX入出力.E種別.GDA;
\r
819 else if( str拡張子.Equals( ".g2d", StringComparison.OrdinalIgnoreCase ) )
\r
821 e種別 = CDTX入出力.E種別.G2D;
\r
823 else if( str拡張子.Equals( ".bms", StringComparison.OrdinalIgnoreCase ) )
\r
825 e種別 = CDTX入出力.E種別.BMS;
\r
827 else if( str拡張子.Equals( ".bme", StringComparison.OrdinalIgnoreCase ) )
\r
829 e種別 = CDTX入出力.E種別.BME;
\r
834 Resources.strDTXファイルではありませんMSG,
\r
835 Resources.str確認ダイアログのタイトル,
\r
836 MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1 );
\r
840 //-----------------
\r
843 this.dlgチップパレット.t一時的に隠蔽する();
\r
845 #region [「読み込み中です」ポップアップを表示する。]
\r
846 //-----------------
\r
848 = new Cメッセージポップアップ( Resources.str読み込み中ですMSG + Environment.NewLine + Resources.strしばらくお待ち下さいMSG );
\r
852 //-----------------
\r
861 #region [ DTXファイルを読み込む。]
\r
862 //-----------------
\r
864 // 全部を1つの string として読み込む。
\r
866 StreamReader reader = new StreamReader( strファイル名, Encoding.GetEncoding( 932/*Shift-JIS*/ ) );
\r
867 string str全入力文字列 = reader.ReadToEnd();
\r
871 // その string から DTX データを読み込む。
\r
873 new CDTX入出力( this ).tDTX入力( e種別, ref str全入力文字列 );
\r
876 // ファイル名、作業フォルダ名を更新する。
\r
878 this.strDTXファイル名 = Path.ChangeExtension( Path.GetFileName( strファイル名 ), ".dtx" ); // 拡張子は強制的に .dtx に変更。
\r
879 this.str作業フォルダ名 = Path.GetDirectoryName( strファイル名 ) + @"\"; // 読み込み後、カレントフォルダは、作業ファイルのあるフォルダに移動する。
\r
880 // #35399: カレントディレクトリの変更はしない。.NET4以降でbuildしたDTXMania本体で再生できなくなるため。
\r
881 //-----------------
\r
884 #region [ 読み込んだファイルを [ファイル]メニューの最近使ったファイル一覧に追加する。]
\r
885 //-----------------
\r
886 this.appアプリ設定.AddRecentUsedFile( this.str作業フォルダ名 + this.strDTXファイル名 );
\r
887 this.t最近使ったファイルをFileメニューへ追加する();
\r
888 //-----------------
\r
891 #region [ DTX以外を読み込んだ場合は、(DTXに変換されているので)最初から未保存フラグを立てる。]
\r
892 //-----------------
\r
893 if( e種別 != CDTX入出力.E種別.DTX )
\r
895 //-----------------
\r
899 #region [「読み込み中です」ポップアップを閉じる。 ]
\r
900 //-----------------
\r
902 this.Refresh(); // リスト内容等を消すために再描画する。
\r
903 //-----------------
\r
906 #region [ 未保存フラグをクリアする。]
\r
907 //-----------------
\r
908 this.b未保存 = true; // ウィンドウタイトルを書き換えるため、一度未保存フラグをtrueにして b未保存の setter を作動させる。
\r
910 //-----------------
\r
913 //-----------------
\r
915 #region [ 上書き保存/名前をつけて保存 ]
\r
916 //-----------------
\r
917 private void tシナリオ_上書き保存()
\r
920 bool bDoSave = true;
\r
922 this.dlgチップパレット.t一時的に隠蔽する();
\r
924 #region [「保存中です」ポップアップを表示する。 ]
\r
925 //-----------------
\r
926 var msg = new Cメッセージポップアップ( Resources.str保存中ですMSG + Environment.NewLine + Resources.strしばらくお待ち下さいMSG );
\r
930 //-----------------
\r
933 #region [ ファイル名がない → 初めての保存と見なし、ファイル保存ダイアログで保存ファイル名を指定させる。 ]
\r
934 //-----------------
\r
935 if( string.IsNullOrEmpty( this.strDTXファイル名 ) )
\r
937 // ダイアログでファイル名を取得する。
\r
939 string str絶対パスファイル名 = this.tファイル保存ダイアログを開いてファイル名を取得する();
\r
941 if (string.IsNullOrEmpty(str絶対パスファイル名))
\r
947 //this.str作業フォルダ名 = Directory.GetCurrentDirectory() + @"\"; // ダイアログでディレクトリを変更した場合、カレントディレクトリも変更されている。
\r
948 this.str作業フォルダ名 = Path.GetDirectoryName(str絶対パスファイル名) + @"\";
\r
949 this.strDTXファイル名 = Path.GetFileName(str絶対パスファイル名);
\r
951 // WAV・BMP・AVIリストにあるすべてのファイル名を、作業フォルダに対する相対パスに変換する。
\r
952 this.mgrWAVリスト管理者.tファイル名の相対パス化(this.str作業フォルダ名);
\r
953 this.mgrBMPリスト管理者.tファイル名の相対パス化(this.str作業フォルダ名);
\r
954 this.mgrAVIリスト管理者.tファイル名の相対パス化(this.str作業フォルダ名);
\r
957 //-----------------
\r
964 #region [ 選択モードだったなら選択を解除する。]
\r
965 //-----------------
\r
966 if (this.b選択モードである)
\r
967 this.mgr選択モード管理者.t全チップの選択を解除する();
\r
968 //-----------------
\r
971 #region [ DTXファイルを出力する。]
\r
972 //-----------------
\r
973 var sw = new StreamWriter(this.str作業フォルダ名 + this.strDTXファイル名, false, Encoding.GetEncoding("utf-16"));
\r
974 new CDTX入出力(this).tDTX出力(sw);
\r
976 //-----------------
\r
979 #region [ 出力したファイルのパスを、[ファイル]メニューの最近使ったファイル一覧に追加する。 ]
\r
980 //-----------------
\r
981 this.appアプリ設定.AddRecentUsedFile(this.str作業フォルダ名 + this.strDTXファイル名);
\r
982 this.t最近使ったファイルをFileメニューへ追加する();
\r
983 //-----------------
\r
986 #region [ Viewer用の一時ファイルを削除する (修正+保存、直後のViewer再生時に、直前の修正が反映されなくなることへの対応) ]
\r
987 tViewer用の一時ファイルを削除する();
\r
994 #region [「保存中です」ポップアップを閉じる。]
\r
995 //-----------------
\r
997 this.Refresh(); // リスト内容等を消すために再描画する。
\r
998 //-----------------
\r
1001 this.dlgチップパレット.t一時的な隠蔽を解除する();
\r
1003 private void tシナリオ_名前をつけて保存()
\r
1007 #region [ ユーザに保存ファイル名を入力させる。]
\r
1008 //-----------------
\r
1009 // ファイル保存ダイアログを表示し、出力するファイル名を指定させる。キャンセルされたらここで中断。
\r
1011 string str絶対パスファイル名 = this.tファイル保存ダイアログを開いてファイル名を取得する();
\r
1012 if( string.IsNullOrEmpty( str絶対パスファイル名 ) )
\r
1016 // フォルダ名とファイル名を更新。
\r
1018 //this.str作業フォルダ名 = Directory.GetCurrentDirectory() + @"\"; // ダイアログでディレクトリを変更した場合は、カレントディレクトリも変更されている。
\r
1019 this.str作業フォルダ名 = Path.GetDirectoryName(str絶対パスファイル名) + @"\";
\r
1020 this.strDTXファイル名 = Path.GetFileName( str絶対パスファイル名 );
\r
1021 //-----------------
\r
1024 #region [ WAV・BMP・AVIリストにあるすべてのファイル名を、作業フォルダに対する相対パスに変換する。 ]
\r
1025 //-----------------
\r
1026 this.mgrWAVリスト管理者.tファイル名の相対パス化( this.str作業フォルダ名 );
\r
1027 this.mgrBMPリスト管理者.tファイル名の相対パス化( this.str作業フォルダ名 );
\r
1028 this.mgrAVIリスト管理者.tファイル名の相対パス化( this.str作業フォルダ名 );
\r
1029 //-----------------
\r
1035 this.tシナリオ_上書き保存();
\r
1040 this.b未保存 = true; // ウィンドウタイトルに表示されているファイル名を変更するため一度 true にする。
\r
1041 this.b未保存 = false;
\r
1043 private string tファイル保存ダイアログを開いてファイル名を取得する()
\r
1045 // ダイアログでファイル名を取得。
\r
1047 this.dlgチップパレット.t一時的に隠蔽する();
\r
1049 var dialog = new SaveFileDialog() {
\r
1050 Title = "名前をつけて保存",
\r
1051 Filter = "DTXファイル(*.dtx)|*.dtx",
\r
1053 InitialDirectory = this.str作業フォルダ名
\r
1055 DialogResult result = dialog.ShowDialog();
\r
1057 this.dlgチップパレット.t一時的な隠蔽を解除する();
\r
1065 // キャンセルされたら "" を返す。
\r
1067 if( result != DialogResult.OK )
\r
1071 // ファイルの拡張子を .dtx に変更。
\r
1073 string fileName = dialog.FileName;
\r
1074 if( Path.GetExtension( fileName ).Length == 0 )
\r
1075 fileName = Path.ChangeExtension( fileName, ".dtx" );
\r
1079 //-----------------
\r
1082 //-----------------
\r
1083 private void tシナリオ_終了()
\r
1089 //-----------------
\r
1092 //-----------------
\r
1093 private void tシナリオ_検索()
\r
1095 this.mgr選択モード管理者.t検索する(); // モードによらず、検索はすべて選択モード管理者が行う。
\r
1097 private void tシナリオ_置換()
\r
1099 this.mgr選択モード管理者.t置換する(); // モードによらず、置換はすべて選択モード管理者が行う。
\r
1101 //-----------------
\r
1103 #region [ 小節長変更/小節の挿入/小節の削除 ]
\r
1104 //-----------------
\r
1105 private void tシナリオ_小節長を変更する( C小節 cs )
\r
1109 #region [ 小節長をユーザに入力させる。]
\r
1110 //-----------------
\r
1112 // 小節長ダイアログを表示し、小節長を取得する。
\r
1114 this.dlgチップパレット.t一時的に隠蔽する();
\r
1116 var dlg = new C小節長変更ダイアログ( cs.n小節番号0to3599 );
\r
1117 dlg.f倍率 = cs.f小節長倍率;
\r
1118 dlg.b後続変更 = false;
\r
1120 this.dlgチップパレット.t一時的な隠蔽を解除する();
\r
1123 // キャンセルされたらここで中断。
\r
1124 if( dlg.ShowDialog() != DialogResult.OK )
\r
1127 //-----------------
\r
1133 //-----------------
\r
1134 int n変更開始小節番号 = cs.n小節番号0to3599;
\r
1135 int n変更終了小節番号 = ( dlg.b後続変更 ) ? this.mgr譜面管理者.n現在の最大の小節番号を返す() : cs.n小節番号0to3599;
\r
1137 #region [ BEATレーンをすべてバックアップ(コピー)しておく。小節長変更でBEATチップが削除されると困るので。]
\r
1138 int laneBEAT = this.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "BEAT" );
\r
1139 List<Cチップ> listBEATチップ = new List<Cチップ>();
\r
1140 foreach ( KeyValuePair<int, C小節> pair in this.mgr譜面管理者.dic小節 )
\r
1142 C小節 c小節 = pair.Value;
\r
1143 for ( int index = 0; index < c小節.listチップ.Count; index++ )
\r
1145 if ( c小節.listチップ[ index ].nレーン番号0to == laneBEAT )
\r
1147 listBEATチップ.Add( c小節.listチップ[ index ] );
\r
1153 #region [ 小節長変更を実行する ]
\r
1154 for ( int n小節番号 = n変更開始小節番号; n小節番号 <= n変更終了小節番号; n小節番号++ )
\r
1156 #region [ 指定した小節が存在しなければ、中断 ]
\r
1157 C小節 c小節 = this.mgr譜面管理者.p小節を返す( n変更開始小節番号 );
\r
1158 if ( c小節 == null )
\r
1164 int n旧Grid数 = (int) ( c小節.f小節長倍率 * 192 + 0.5 );
\r
1165 int n新Grid数 = (int) ( dlg.f倍率 * 192 + 0.5 );
\r
1166 int nGrid増減 = n旧Grid数 - n新Grid数;
\r
1168 this.t小節長を変更する_小節単位( n小節番号, dlg.f倍率 );
\r
1170 // そして、Gridの増減があった分だけ、コピーしたBEATチップのGridを増減する
\r
1171 int nGrid_BAR = this.mgr譜面管理者.n譜面先頭からみた小節先頭の位置gridを返す( n変更開始小節番号 );
\r
1172 for ( int index = 0; index < listBEATチップ.Count; index++ )
\r
1174 // Gridを増減するのは、小節長変更した小節以降のチップだけ。
\r
1175 // 更に、小節長変更した小節上では、新しい小節長で溢れた分のチップだけGridを増減する。
\r
1176 // (この条件で、Grid数が増えた場合も対応できている)
\r
1178 ( n小節番号 > n変更開始小節番号 ) ||
\r
1179 ( ( n小節番号 == n変更開始小節番号 ) && ( nGrid_BAR + n新Grid数 < listBEATチップ[ index ].n位置grid ) )
\r
1182 Cチップ cc = new Cチップ();
\r
1183 cc.tコピーfrom( listBEATチップ[ index ] );
\r
1184 cc.n位置grid += nGrid増減;
\r
1185 listBEATチップ[ index ] = cc;
\r
1191 //-----------------
\r
1193 this.mgrUndoRedo管理者.tトランザクション記録を開始する();
\r
1195 #region [ BEATレーンのチップを全削除する ]
\r
1196 //this.mgr選択モード管理者.tレーン上の全チップを選択する( laneBEAT );
\r
1197 //this.tシナリオ・削除();
\r
1198 foreach ( KeyValuePair<int, C小節> pair in this.mgr譜面管理者.dic小節 )
\r
1200 C小節 c小節 = pair.Value;
\r
1201 for( int i = 0; i < c小節.listチップ.Count; i++ )
\r
1203 Cチップ cチップ = c小節.listチップ[ i ];
\r
1205 if( cチップ.nレーン番号0to == laneBEAT )
\r
1207 #region [ UndoRedo リストにこの操作(チップ削除)を記録する。]
\r
1208 //-----------------
\r
1209 var cc = new Cチップ();
\r
1210 cc.tコピーfrom( cチップ );
\r
1212 var ur = new Cチップ配置用UndoRedo( c小節.n小節番号0to3599, cc );
\r
1214 this.mgrUndoRedo管理者.tノードを追加する(
\r
1215 new CUndoRedoセル<Cチップ配置用UndoRedo>(
\r
1217 new DGUndoを実行する<Cチップ配置用UndoRedo>( this.mgr譜面管理者.tチップ削除のUndo ),
\r
1218 new DGRedoを実行する<Cチップ配置用UndoRedo>( this.mgr譜面管理者.tチップ削除のRedo ),
\r
1220 //-----------------
\r
1223 // チップを小節のチップリストから削除する。
\r
1224 c小節.listチップ.RemoveAt( i );
\r
1226 // リストが更新されたので、最初のチップから見直す。
\r
1233 #region [ コピーしておいた(そして、nGridを更新した))BEATチップを、BEATレーンに戻す ]
\r
1234 foreach ( Cチップ cチップ in listBEATチップ )
\r
1236 this.mgr編集モード管理者.tBeatチップを配置する( cチップ.n位置grid, cチップ.n値_整数1to1295, cチップ.f値_浮動小数, cチップ.b裏 );
\r
1242 this.mgrUndoRedo管理者.tトランザクション記録を終了する();
\r
1243 listBEATチップ.Clear();
\r
1244 listBEATチップ = null;
\r
1247 this.tUndoRedo用GUIの有効無効を設定する();
\r
1250 public void t小節長を変更する_小節単位( int n小節番号, float f倍率 )
\r
1254 #region [ 小節番号から小節オブジェクトを取得する。→ 指定された小節が存在しない場合はここで中断。]
\r
1255 //-----------------
\r
1257 C小節 c小節 = this.mgr譜面管理者.p小節を返す( n小節番号 );
\r
1262 //-----------------
\r
1268 this.mgrUndoRedo管理者.tトランザクション記録を開始する();
\r
1270 #region [ UndoRedo リストにこの操作(小節長変更)を記録する。 ]
\r
1271 //-----------------
\r
1272 var ur変更前 = new C小節用UndoRedo( c小節.n小節番号0to3599, c小節.f小節長倍率 );
\r
1273 var ur変更後 = new C小節用UndoRedo( c小節.n小節番号0to3599, f倍率 );
\r
1275 this.mgrUndoRedo管理者.tノードを追加する(
\r
1276 new CUndoRedoセル<C小節用UndoRedo>(
\r
1278 new DGUndoを実行する<C小節用UndoRedo>( this.mgr譜面管理者.t小節長変更のUndo ),
\r
1279 new DGRedoを実行する<C小節用UndoRedo>( this.mgr譜面管理者.t小節長変更のRedo ),
\r
1281 //-----------------
\r
1287 #region [ 小節長倍率を変更する。]
\r
1288 //-----------------
\r
1290 //-----------------
\r
1293 #region [ 小節からはみ出したチップを削除する。チップの削除操作は Undo/Redo に記録する。]
\r
1295 //-----------------
\r
1296 for( int i = 0; i < c小節.listチップ.Count; i++ )
\r
1298 Cチップ cチップ = c小節.listチップ[ i ];
\r
1300 if( cチップ.n位置grid >= c小節.n小節長倍率を考慮した現在の小節の高さgrid )
\r
1303 #region [ UndoRedo リストにこの操作(チップ削除)を記録する。]
\r
1304 //-----------------
\r
1305 var cc = new Cチップ();
\r
1306 cc.tコピーfrom( cチップ );
\r
1308 var ur = new Cチップ配置用UndoRedo( c小節.n小節番号0to3599, cc );
\r
1310 this.mgrUndoRedo管理者.tノードを追加する(
\r
1311 new CUndoRedoセル<Cチップ配置用UndoRedo>(
\r
1313 new DGUndoを実行する<Cチップ配置用UndoRedo>( this.mgr譜面管理者.tチップ削除のUndo ),
\r
1314 new DGRedoを実行する<Cチップ配置用UndoRedo>( this.mgr譜面管理者.tチップ削除のRedo ),
\r
1316 //-----------------
\r
1320 // チップを小節のチップリストから削除する。
\r
1322 c小節.listチップ.RemoveAt( i );
\r
1325 // リストが更新されたので、最初のチップから見直す。
\r
1330 //-----------------
\r
1336 this.mgrUndoRedo管理者.tトランザクション記録を終了する();
\r
1341 this.tUndoRedo用GUIの有効無効を設定する();
\r
1343 private void tシナリオ_小節を挿入する( int n挿入位置の小節番号 )
\r
1347 #region [ UndoRedo リストにこの操作(小節挿入)を記録する。]
\r
1348 //-----------------
\r
1349 this.mgrUndoRedo管理者.tノードを追加する(
\r
1350 new CUndoRedoセル<int>(
\r
1352 new DGUndoを実行する<int>( this.mgr譜面管理者.t小節挿入のUndo ),
\r
1353 new DGRedoを実行する<int>( this.mgr譜面管理者.t小節挿入のRedo ),
\r
1354 n挿入位置の小節番号, n挿入位置の小節番号 ) );
\r
1355 //-----------------
\r
1361 #region [ 挿入位置以降の小節を1つずつ後ろにずらす(小節番号を +1 していく)。 ]
\r
1362 //-----------------
\r
1363 for( int i = this.mgr譜面管理者.n現在の最大の小節番号を返す(); i >= n挿入位置の小節番号; i-- )
\r
1365 // ずらす小節オブジェクトを取得する。
\r
1367 C小節 cずらす小節 = this.mgr譜面管理者.p小節を返す( i );
\r
1368 if( cずらす小節 == null )
\r
1374 this.mgr譜面管理者.dic小節.Remove( i ); // 小節番号は Dictionary のキー値であるため、番号が変われば再登録が必要。
\r
1375 cずらす小節.n小節番号0to3599 = i + 1;
\r
1376 this.mgr譜面管理者.dic小節.Add( cずらす小節.n小節番号0to3599, cずらす小節 );
\r
1378 //-----------------
\r
1381 #region [ 新しい小節を作成し、譜面の持つ小節リストに追加する。 ]
\r
1382 //-----------------
\r
1386 this.mgr譜面管理者.dic小節.Add( n挿入位置の小節番号, new C小節( n挿入位置の小節番号 ) );
\r
1391 this.pictureBox譜面パネル.Refresh();
\r
1393 //-----------------
\r
1399 this.tUndoRedo用GUIの有効無効を設定する();
\r
1402 private void tシナリオ_小節を削除する( int n削除位置の小節番号 )
\r
1406 this.mgrUndoRedo管理者.tトランザクション記録を開始する();
\r
1411 #region [ 最大小節番号を取得する。]
\r
1412 //-----------------
\r
1413 int n最大小節番号 = this.mgr譜面管理者.n現在の最大の小節番号を返す(); // 小節を削除すると数が変わるので、削除前に取得する。
\r
1414 //-----------------
\r
1416 #region [ 削除する小節オブジェクトを取得する。]
\r
1417 //-----------------
\r
1418 C小節 c削除する小節 = this.mgr譜面管理者.p小節を返す( n削除位置の小節番号 );
\r
1419 //-----------------
\r
1422 #region [ その小節が持っているチップを全て削除する。チップの削除作業は、Undo/Redoリストに記録する。]
\r
1423 //-----------------
\r
1425 while( c削除する小節.listチップ.Count > 0 )
\r
1427 #region [ UndoRedo リストにこの操作(チップ削除)を記録する。]
\r
1428 //-----------------
\r
1429 var cc = new Cチップ();
\r
1430 cc.tコピーfrom( c削除する小節.listチップ[ 0 ] );
\r
1431 var redo = new Cチップ配置用UndoRedo( c削除する小節.n小節番号0to3599, cc );
\r
1433 this.mgrUndoRedo管理者.tノードを追加する(
\r
1434 new CUndoRedoセル<Cチップ配置用UndoRedo>(
\r
1436 new DGUndoを実行する<Cチップ配置用UndoRedo>( this.mgr譜面管理者.tチップ削除のUndo ),
\r
1437 new DGRedoを実行する<Cチップ配置用UndoRedo>( this.mgr譜面管理者.tチップ削除のRedo ),
\r
1439 //-----------------
\r
1444 c削除する小節.listチップ.RemoveAt( 0 );
\r
1447 //-----------------
\r
1450 #region [ UndoRedo リストにこの操作(小節削除)を記録する。]
\r
1451 //-----------------
\r
1452 this.mgrUndoRedo管理者.tノードを追加する(
\r
1453 new CUndoRedoセル<int>(
\r
1455 new DGUndoを実行する<int>( this.mgr譜面管理者.t小節削除のUndo ),
\r
1456 new DGRedoを実行する<int>( this.mgr譜面管理者.t小節削除のRedo ),
\r
1457 n削除位置の小節番号, n削除位置の小節番号 ) );
\r
1458 //-----------------
\r
1460 #region [ 該当小節を譜面の小節リストから削除する。]
\r
1461 //-----------------
\r
1462 this.mgr譜面管理者.dic小節.Remove( n削除位置の小節番号 );
\r
1463 //-----------------
\r
1465 #region [ 削除した小節より後方にある小節を1つずつ前にずらす。(小節番号を -1 していく)]
\r
1466 //-----------------
\r
1468 for( int i = n削除位置の小節番号 + 1; i <= n最大小節番号; i++ )
\r
1472 C小節 cずらす小節 = this.mgr譜面管理者.p小節を返す( i );
\r
1473 if( cずらす小節 == null )
\r
1478 this.mgr譜面管理者.dic小節.Remove( i ); // 小節番号は Dictionary のキー値であるため、番号が変われば再登録が必要。
\r
1479 cずらす小節.n小節番号0to3599--;
\r
1480 this.mgr譜面管理者.dic小節.Add( cずらす小節.n小節番号0to3599, cずらす小節 );
\r
1483 // 譜面内の小節が全部無くなったらさすがにまずいので、最低1個の小節は残す。
\r
1485 if( this.mgr譜面管理者.dic小節.Count == 0 )
\r
1486 this.mgr譜面管理者.dic小節.Add( 0, new C小節( 0 ) );
\r
1488 //-----------------
\r
1494 this.mgrUndoRedo管理者.tトランザクション記録を終了する();
\r
1499 this.tUndoRedo用GUIの有効無効を設定する();
\r
1500 this.pictureBox譜面パネル.Refresh();
\r
1503 //-----------------
\r
1505 #region [ 選択チップの切り取り/コピー/貼り付け/削除 ]
\r
1506 //-----------------
\r
1507 private void tシナリオ_切り取り()
\r
1511 #region [ 譜面にフォーカスが来てないなら何もしない。 ]
\r
1512 //-----------------
\r
1513 if( !this.pictureBox譜面パネル.Focused )
\r
1515 //-----------------
\r
1521 #region [ 切り取り = コピー + 削除 ]
\r
1522 //-----------------
\r
1525 //-----------------
\r
1528 private void tシナリオ_コピー()
\r
1532 #region [ 譜面にフォーカスが来てないなら何もしない。 ]
\r
1533 //-----------------
\r
1534 if( !this.pictureBox譜面パネル.Focused )
\r
1536 //-----------------
\r
1542 this.cbクリップボード.t現在選択されているチップをボードにコピーする();
\r
1547 #region [ 画面を再描画する。]
\r
1548 //-----------------
\r
1549 this.t選択チップの有無に応じて編集用GUIの有効無効を設定する();
\r
1550 this.pictureBox譜面パネル.Refresh();
\r
1551 //-----------------
\r
1554 private void tシナリオ_貼り付け( int n譜面先頭からの位置grid )
\r
1558 #region [ 譜面にフォーカスが来てないなら何もしない。 ]
\r
1559 //-----------------
\r
1560 if( !this.pictureBox譜面パネル.Focused )
\r
1562 //-----------------
\r
1568 #region [ 貼り付け先の小節と貼り付け開始位置を取得する。]
\r
1569 //-----------------
\r
1570 C小節 c小節 = this.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( n譜面先頭からの位置grid );
\r
1574 int n小節先頭からの位置grid =
\r
1575 n譜面先頭からの位置grid - this.mgr譜面管理者.n譜面先頭からみた小節先頭の位置gridを返す( c小節.n小節番号0to3599 );
\r
1576 //-----------------
\r
1579 #region [ クリップボードからチップを貼り付ける。]
\r
1580 //-----------------
\r
1581 this.cbクリップボード.tチップを指定位置から貼り付ける( c小節, n小節先頭からの位置grid );
\r
1582 //-----------------
\r
1588 #region [ 画面を再描画する。]
\r
1589 //-----------------
\r
1590 this.t選択チップの有無に応じて編集用GUIの有効無効を設定する();
\r
1591 this.pictureBox譜面パネル.Refresh();
\r
1592 //-----------------
\r
1595 private void tシナリオ_削除()
\r
1599 #region [ 譜面にフォーカスが来てないなら何もしない。 ]
\r
1600 //-----------------
\r
1601 if( !this.pictureBox譜面パネル.Focused )
\r
1603 //-----------------
\r
1609 this.mgrUndoRedo管理者.tトランザクション記録を開始する();
\r
1614 #region [ 譜面が持つすべての小節について、選択されているチップがあれば削除する。]
\r
1615 //-----------------
\r
1616 foreach( KeyValuePair<int, C小節> pair in this.mgr譜面管理者.dic小節 )
\r
1618 C小節 c小節 = pair.Value;
\r
1620 bool b削除されたチップがある = false;
\r
1621 bool b削除完了 = false;
\r
1622 int laneBEAT = this.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "BEAT" );
\r
1623 List<int> list削除処理済BEAT_index = new List<int>();
\r
1627 #region [ 小節の持つチップのうち、選択されているチップがあれば削除してループする。なくなったら抜ける。]
\r
1628 //-----------------
\r
1632 // 小節が持つすべてのチップについて……
\r
1633 foreach( Cチップ cチップ in c小節.listチップ )
\r
1637 #region [ UndoRedo リストにこの操作(チップ削除)を記録する。]
\r
1638 //-----------------
\r
1639 var cc = new Cチップ();
\r
1640 cc.tコピーfrom( cチップ );
\r
1641 var redo = new Cチップ配置用UndoRedo( c小節.n小節番号0to3599, cc );
\r
1643 this.mgrUndoRedo管理者.tノードを追加する(
\r
1644 new CUndoRedoセル<Cチップ配置用UndoRedo>(
\r
1646 new DGUndoを実行する<Cチップ配置用UndoRedo>( this.mgr譜面管理者.tチップ削除のUndo ),
\r
1647 new DGRedoを実行する<Cチップ配置用UndoRedo>( this.mgr譜面管理者.tチップ削除のRedo ),
\r
1649 //-----------------
\r
1653 #region [ チップオブジェクトを削除する。ただしBEATオブジェクトは削除禁止。表裏を反転するだけ。]
\r
1654 if ( cチップ.nレーン番号0to != laneBEAT )
\r
1656 c小節.listチップ.Remove( cチップ );
\r
1658 // フラグを設定してループする。(foreachのlistを更新しているため)
\r
1659 b削除完了 = false; // まだ終わらんよ
\r
1660 b削除されたチップがある = true;
\r
1665 int p = c小節.listチップ.IndexOf( cチップ );
\r
1666 if ( !list削除処理済BEAT_index.Contains( p ) ) // まだ裏表反転したことがないチップならば
\r
1668 cチップ.nチャンネル番号00toFF = ( cチップ.b裏 ) ? 0xF3 : 0xF8; // 表裏反転
\r
1669 cチップ.b裏 = !cチップ.b裏;
\r
1670 c小節.listチップ[ p ] = cチップ;
\r
1671 list削除処理済BEAT_index.Add( p );
\r
1673 // フラグを設定してループする。(foreachのlistを更新しているため)
\r
1674 b削除完了 = false; // まだ終わらんよ
\r
1675 b削除されたチップがある = true;
\r
1682 //-----------------
\r
1685 list削除処理済BEAT_index.Clear();
\r
1686 list削除処理済BEAT_index = null;
\r
1688 #region [ 1つでもチップを削除したなら、未保存フラグを立てる。 ]
\r
1689 //-----------------
\r
1690 if( b削除されたチップがある )
\r
1692 //-----------------
\r
1695 //-----------------
\r
1701 this.mgrUndoRedo管理者.tトランザクション記録を終了する();
\r
1706 this.tUndoRedo用GUIの有効無効を設定する();
\r
1707 this.t選択チップの有無に応じて編集用GUIの有効無効を設定する();
\r
1708 this.pictureBox譜面パネル.Refresh();
\r
1710 //-----------------
\r
1712 #region [ DTXViewer での再生・停止 ]
\r
1713 //-----------------
\r
1714 private void tシナリオ_Viewerで最初から再生する()
\r
1716 #region [ DTXViewer 用の一時ファイルを出力する。]
\r
1717 //-----------------
\r
1718 this.tViewer用の一時ファイルを出力する( false, this.b未保存 | !this.b前回BGMありで再生した | this.b再生速度を変更した | this.bDTXファイルを開いた );
\r
1719 this.b前回BGMありで再生した = true;
\r
1720 //-----------------
\r
1723 #region [ 再生開始オプション引数に一時ファイルを指定して DTXViewer プロセスを起動する。]
\r
1724 //-----------------
\r
1727 string strDTXViewerのパス = this.strDTXCのあるフォルダ名 + this.appアプリ設定.ViewerInfo.Path;
\r
1729 #region [ DTXViewer が起動していなければ起動する。]
\r
1730 //-----------------
\r
1731 // DTXManiaGR.exeはコンパクトモードで起動する必要があるため、「一旦起動してから再生オプションを渡す」やり方はやめる
\r
1732 // Process.Start( strDTXViewerのパス ).WaitForInputIdle( 20 * 1000 ); // 起動完了まで最大20秒待つ
\r
1733 //-----------------
\r
1736 #region [ 実行中の DTXViewer に再生オプションを渡す。 ]
\r
1737 //-----------------
\r
1738 Process.Start( strDTXViewerのパス,
\r
1739 this.appアプリ設定.ViewerInfo.PlaySoundOption + this.appアプリ設定.ViewerInfo.PlayStartOption + " " + this.strViewer演奏用一時ファイル名 ).WaitForInputIdle( 20 * 1000 );
\r
1740 //-----------------
\r
1743 catch( Exception )
\r
1745 #region [ 失敗ダイアログを表示する。]
\r
1746 //-----------------
\r
1748 Resources.strプロセスの起動に失敗しましたMSG,
\r
1749 Resources.strエラーダイアログのタイトル,
\r
1750 MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1 );
\r
1751 //-----------------
\r
1754 //-----------------
\r
1757 private void tシナリオ_Viewerで現在位置から再生する()
\r
1759 #region [ DTXViewer 用の一時ファイルを出力する。]
\r
1760 //-----------------
\r
1761 this.tViewer用の一時ファイルを出力する( false, this.b未保存 | !this.b前回BGMありで再生した | this.b再生速度を変更した | this.bDTXファイルを開いた );
\r
1762 this.b前回BGMありで再生した = true;
\r
1763 //-----------------
\r
1768 string strDTXViewerのパス = this.strDTXCのあるフォルダ名 + this.appアプリ設定.ViewerInfo.Path;
\r
1770 #region [ DTXViewer が起動していなければ起動する。]
\r
1771 //-----------------
\r
1772 // DTXManiaGR.exeはコンパクトモードで起動する必要があるため、「一旦起動してから再生オプションを渡す」やり方はやめる
\r
1773 // Process.Start( strDTXViewerのパス ).WaitForInputIdle( 20 * 1000 ); // 起動完了まで最大20秒待つ
\r
1774 //-----------------
\r
1777 #region [ 実行中の DTXViewer に再生オプションを渡す。 ]
\r
1778 //-----------------
\r
1781 this.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( this.mgr譜面管理者.n現在の譜面表示下辺の譜面先頭からの位置grid );
\r
1783 Process.Start( strDTXViewerのパス,
\r
1784 this.appアプリ設定.ViewerInfo.PlaySoundOption + this.appアプリ設定.ViewerInfo.PlayStartFromOption + c小節.n小節番号0to3599 + " " + this.strViewer演奏用一時ファイル名 ).WaitForInputIdle( 20 * 1000 );
\r
1786 //-----------------
\r
1789 catch( Exception )
\r
1791 #region [ 失敗ダイアログを表示する。]
\r
1792 //-----------------
\r
1794 Resources.strプロセスの起動に失敗しましたMSG,
\r
1795 Resources.strエラーダイアログのタイトル,
\r
1796 MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1 );
\r
1797 //-----------------
\r
1801 private void tシナリオ_Viewerで現在位置からBGMのみ再生する()
\r
1803 #region [ DTXViewer 用の一時ファイルを出力する。]
\r
1804 //-----------------
\r
1805 this.tViewer用の一時ファイルを出力する( true, this.b未保存 | this.b前回BGMありで再生した | this.b再生速度を変更した | this.bDTXファイルを開いた );
\r
1806 this.b前回BGMありで再生した = false;
\r
1807 //-----------------
\r
1812 string strDTXViewerのパス = this.strDTXCのあるフォルダ名 + this.appアプリ設定.ViewerInfo.Path;
\r
1814 #region [ DTXViewer が起動していなければ起動する。]
\r
1815 //-----------------
\r
1816 // DTXManiaGR.exeはコンパクトモードで起動する必要があるため、「一旦起動してから再生オプションを渡す」やり方はやめる
\r
1817 // Process.Start( strDTXViewerのパス ).WaitForInputIdle( 20 * 1000 ); // 起動完了まで最大20秒待つ
\r
1818 //-----------------
\r
1821 #region [ 実行中の DTXViewer に再生オプションを渡す。 ]
\r
1822 //-----------------
\r
1823 C小節 c小節 = this.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( this.mgr譜面管理者.n現在の譜面表示下辺の譜面先頭からの位置grid );
\r
1824 Process.Start( strDTXViewerのパス,
\r
1825 this.appアプリ設定.ViewerInfo.PlaySoundOption + this.appアプリ設定.ViewerInfo.PlayStartFromOption + c小節.n小節番号0to3599 + " " + this.strViewer演奏用一時ファイル名 ).WaitForInputIdle( 20 * 1000 );
\r
1826 //-----------------
\r
1829 catch( Exception )
\r
1831 #region [ 失敗ダイアログを表示する。]
\r
1832 //-----------------
\r
1834 Resources.strプロセスの起動に失敗しましたMSG,
\r
1835 Resources.strエラーダイアログのタイトル,
\r
1836 MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1 );
\r
1837 //-----------------
\r
1841 private void tシナリオ_Viewerを再生停止する()
\r
1845 string strViewerのパス = this.strDTXCのあるフォルダ名 + this.appアプリ設定.ViewerInfo.Path;
\r
1847 #region [ 実行中の DTXViewer に再生停止オプションを渡す。 ]
\r
1848 //-----------------
\r
1850 // 停止のときは1回のプロセス起動で完結(BMSV仕様)
\r
1852 Process.Start( strViewerのパス, this.appアプリ設定.ViewerInfo.PlayStopOption );
\r
1854 //-----------------
\r
1858 catch( Exception )
\r
1860 #region [ 失敗ダイアログを表示する。]
\r
1861 //-----------------
\r
1863 Resources.strプロセスの起動に失敗しましたMSG,
\r
1864 Resources.strエラーダイアログのタイトル,
\r
1865 MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1 );
\r
1866 //-----------------
\r
1871 private string strViewer演奏用一時ファイル名 = "";
\r
1872 private void tViewer用の一時ファイルを出力する( bool bBGMのみ出力, bool b前回から更新があった )
\r
1876 // 前回から更新がなければ(連続して再生ボタンを押した、など)、前回の生成ファイルをそのまま返す。
\r
1877 // (初めての再生の場合は、tempファイル未生成のため、このまま生成フローを続ける。)
\r
1878 if ( !b前回から更新があった && File.Exists( Path.Combine( this.mgr譜面管理者.strPATH_WAV, this.strViewer演奏用一時ファイル名 ) ) )
\r
1883 // 再生速度変更フラグをリセット。
\r
1884 b再生速度を変更した = false;
\r
1885 bDTXファイルを開いた = false;
\r
1887 //this.strViewer演奏用一時ファイル名 = Path.GetTempFileName(); //
\r
1888 this.strViewer演奏用一時ファイル名 = makeTempDTX.GetTempFileName(); // #24746 2011.4.1 yyagi add; a countermeasure for temp-flooding
\r
1892 this.mgr譜面管理者.strPATH_WAV = this.str作業フォルダ名;
\r
1896 #region [ もし小数点にコンマを使うcultureなら、一時的に(小数点を使う)"en-GB"に切り替える。(DTXVはピリオドしか使えないため) ]
\r
1897 string currentCultureEnglishName = CultureInfo.CurrentCulture.Name;
\r
1898 bool bSwitchCulture = false;
\r
1899 if (CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator == ",")
\r
1901 Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB", false); // #24241, #24790 2011.4.8 yyagi: switch culture where the country uses period as the decimal point
\r
1902 bSwitchCulture = true; // I mistook here using CurrentUICulture. Use CurrentCulture to work correctly.
\r
1905 #region [ 一時ファイルにDTXを出力する。 ]
\r
1906 //-----------------
\r
1907 StreamWriter sw = new StreamWriter( this.strViewer演奏用一時ファイル名, false, Encoding.GetEncoding( 0x3a4 ) );
\r
1908 new CDTX入出力( this ).tDTX出力( sw, bBGMのみ出力 );
\r
1910 //-----------------
\r
1912 #region [ cultureを元に戻す。 ]
\r
1913 if (bSwitchCulture)
\r
1915 Thread.CurrentThread.CurrentCulture = new CultureInfo(currentCultureEnglishName, false);
\r
1921 this.mgr譜面管理者.strPATH_WAV = "";
\r
1924 private void tViewer用の一時ファイルを削除する()
\r
1926 this.strViewer演奏用一時ファイル名 = ""; // #35351 2015.7.23 yyagi add; to fix viewer plyback correctly just after save.
\r
1928 //-----------------
\r
1930 #region [ Undo / Redo ]
\r
1931 //-----------------
\r
1932 private void tシナリオ_Undoする()
\r
1936 #region [ Undo する対象を Undo/Redo リストから取得する。]
\r
1937 //-----------------
\r
1939 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す();
\r
1941 if( oセル仮想 == null )
\r
1944 //-----------------
\r
1947 oセル仮想.tUndoを実行する();
\r
1952 #region [ GUI を再描画する。]
\r
1953 //-----------------
\r
1954 this.tUndoRedo用GUIの有効無効を設定する();
\r
1955 this.t選択チップの有無に応じて編集用GUIの有効無効を設定する();
\r
1956 this.pictureBox譜面パネル.Refresh();
\r
1957 //-----------------
\r
1960 private void tシナリオ_Redoする()
\r
1964 #region [ Redo する対象を Undo/Redo リストから取得する。]
\r
1965 //-----------------
\r
1967 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tRedoするノードを取得して返す();
\r
1969 if( oセル仮想 == null )
\r
1972 //-----------------
\r
1975 oセル仮想.tRedoを実行する();
\r
1980 #region [ GUI を再描画する。]
\r
1981 //-----------------
\r
1982 this.tUndoRedo用GUIの有効無効を設定する();
\r
1983 this.t選択チップの有無に応じて編集用GUIの有効無効を設定する();
\r
1984 this.pictureBox譜面パネル.Refresh();
\r
1985 //-----------------
\r
1988 //-----------------
\r
1994 public enum Eタブ種別 : int
\r
2003 public void t選択モードにする()
\r
2005 this.toolStripButton選択モード.CheckState = CheckState.Checked;
\r
2006 this.toolStripButton編集モード.CheckState = CheckState.Unchecked;
\r
2007 this.toolStripMenuItem選択モード.CheckState = CheckState.Checked;
\r
2008 this.toolStripMenuItem編集モード.CheckState = CheckState.Unchecked;
\r
2010 public void t編集モードにする()
\r
2012 this.mgr選択モード管理者.t全チップの選択を解除する();
\r
2013 this.pictureBox譜面パネル.Refresh();
\r
2014 this.toolStripButton選択モード.CheckState = CheckState.Unchecked;
\r
2015 this.toolStripButton編集モード.CheckState = CheckState.Checked;
\r
2016 this.toolStripMenuItem選択モード.CheckState = CheckState.Unchecked;
\r
2017 this.toolStripMenuItem編集モード.CheckState = CheckState.Checked;
\r
2019 public void t選択チップの有無に応じて編集用GUIの有効無効を設定する()
\r
2021 bool b譜面上に選択チップがある = this.b選択チップがある;
\r
2022 bool bクリップボードに選択チップがある = ( this.cbクリップボード != null ) && ( this.cbクリップボード.nセル数 > 0 );
\r
2027 this.toolStripMenuItemコピー.Enabled = b譜面上に選択チップがある;
\r
2028 this.toolStripMenuItem切り取り.Enabled = b譜面上に選択チップがある;
\r
2029 this.toolStripMenuItem貼り付け.Enabled = bクリップボードに選択チップがある;
\r
2030 this.toolStripMenuItem削除.Enabled = b譜面上に選択チップがある;
\r
2035 this.toolStripButtonコピー.Enabled = b譜面上に選択チップがある;
\r
2036 this.toolStripButton切り取り.Enabled = b譜面上に選択チップがある;
\r
2037 this.toolStripButton貼り付け.Enabled = bクリップボードに選択チップがある;
\r
2038 this.toolStripButton削除.Enabled = b譜面上に選択チップがある;
\r
2043 this.toolStripMenuItem選択チップのコピー.Enabled = b譜面上に選択チップがある;
\r
2044 this.toolStripMenuItem選択チップの切り取り.Enabled = b譜面上に選択チップがある;
\r
2045 this.toolStripMenuItem選択チップの貼り付け.Enabled = bクリップボードに選択チップがある;
\r
2046 this.toolStripMenuItem選択チップの削除.Enabled = b譜面上に選択チップがある;
\r
2048 public void t選択モードのコンテクストメニューを表示する( int x, int y )
\r
2050 // メニューの左上隅座標を控えておく。
\r
2052 this.pt選択モードのコンテクストメニューを開いたときのマウスの位置 = new Point( x, y );
\r
2054 #region [ クリックされた箇所のレーン番号を取得する。]
\r
2055 //-----------------
\r
2056 int lane = this.mgr譜面管理者.nX座標dotが位置するレーン番号を返す( pt選択モードのコンテクストメニューを開いたときのマウスの位置.X );
\r
2057 string strLane = (lane < 0)? "" : this.mgr譜面管理者.listレーン[ lane ].strレーン名;
\r
2058 //-----------------
\r
2061 #region [ クリックされた箇所の小節番号を取得する。]
\r
2062 //-----------------
\r
2063 int n譜面先頭からの位置grid = this.mgr譜面管理者.nY座標dotが位置するgridを返す_ガイド幅単位( pt選択モードのコンテクストメニューを開いたときのマウスの位置.Y );
\r
2064 C小節 csクリックされた小節 = this.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( n譜面先頭からの位置grid );
\r
2065 if ( csクリックされた小節 == null ) return; // 小節が生成されていないところで右クリックした場合は何もしない(NullReferenceException回避)
\r
2066 int nPartNo = csクリックされた小節.n小節番号0to3599;
\r
2067 string strPartNo = C変換.str小節番号を文字列3桁に変換して返す( nPartNo );
\r
2068 //-----------------
\r
2071 #region [ コンテクストメニューの[選択]項目に、レーン名と小節番号の情報をを付与する。 ]
\r
2072 int indexMenuLaneSelect1 = this.contextMenuStrip譜面右メニュー.Items.IndexOfKey( "toolStripMenuItemレーン内のすべてのチップの選択1" );
\r
2073 int indexMenuLaneSelect2 = this.contextMenuStrip譜面右メニュー.Items.IndexOfKey( "toolStripMenuItemレーン内のすべてのチップの選択_特定小節以降2" );
\r
2074 int indexMenuPartSelect = this.contextMenuStrip譜面右メニュー.Items.IndexOfKey( "toolStripMenuItem小節内のすべてのチップの選択" );
\r
2076 string strItemMenuLaneSelect = this.contextMenuStrip譜面右メニュー.Items[ indexMenuLaneSelect1 ].Text;
\r
2077 strItemMenuLaneSelect = System.Text.RegularExpressions.Regex.Replace(
\r
2078 strItemMenuLaneSelect , @"\[(.*)\]", "[" + strLane + "]" );
\r
2079 this.contextMenuStrip譜面右メニュー.Items[ indexMenuLaneSelect1 ].Text = strItemMenuLaneSelect;
\r
2081 strItemMenuLaneSelect = this.contextMenuStrip譜面右メニュー.Items[ indexMenuLaneSelect2 ].Text;
\r
2082 strItemMenuLaneSelect = System.Text.RegularExpressions.Regex.Replace(
\r
2083 strItemMenuLaneSelect, @"\[(.*)\]", "[" + strLane + "]" );
\r
2084 this.contextMenuStrip譜面右メニュー.Items[ indexMenuLaneSelect2 ].Text = strItemMenuLaneSelect;
\r
2086 string strItemMenuPartSelect = this.contextMenuStrip譜面右メニュー.Items[ indexMenuPartSelect ].Text;
\r
2087 strItemMenuPartSelect = System.Text.RegularExpressions.Regex.Replace(
\r
2088 strItemMenuPartSelect, @"\[(.*)\]", "[" + strPartNo + "]" );
\r
2089 this.contextMenuStrip譜面右メニュー.Items[ indexMenuPartSelect ].Text = strItemMenuPartSelect;
\r
2094 this.contextMenuStrip譜面右メニュー.Show( this.pictureBox譜面パネル, x, y );
\r
2096 public void t最近使ったファイルをFileメニューへ追加する()
\r
2098 #region [ [ファイル] メニューから、最近使ったファイルの一覧をクリアする。]
\r
2099 //-----------------
\r
2100 for( int i = 0; i < this.toolStripMenuItemファイル.DropDownItems.Count; i++ )
\r
2102 ToolStripItem item = this.toolStripMenuItemファイル.DropDownItems[ i ];
\r
2104 // ↓削除したくないサブメニューの一覧。これ以外のサブメニュー項目はすべて削除する。
\r
2105 if( item != this.toolStripMenuItem新規 &&
\r
2106 item != this.toolStripMenuItem開く &&
\r
2107 item != this.toolStripMenuItem上書き保存 &&
\r
2108 item != this.toolStripMenuItem名前を付けて保存 &&
\r
2109 item != this.toolStripSeparator1 &&
\r
2110 item != this.toolStripMenuItem終了 )
\r
2112 this.toolStripMenuItemファイル.DropDownItems.Remove( item );
\r
2113 i = -1; // 要素数が変わったので列挙しなおし
\r
2116 //-----------------
\r
2119 #region [ 表示しないオプション設定であるか、履歴が0件ならここで終了する。]
\r
2120 //-----------------
\r
2121 if( !this.appアプリ設定.ShowRecentFiles || this.appアプリ設定.RecentUsedFile.Count == 0 )
\r
2123 //-----------------
\r
2126 #region [ アプリ設定が持つ履歴にそって、[ファイル] メニューにサブメニュー項目リストを追加する(ただし最大表示数まで)。 ]
\r
2127 //-----------------
\r
2129 // [ファイル] のサブメニューリストに項目が1つでもある場合は、履歴サブメニュー項目の追加の前に「終了」の下にセパレータを入れる。手動で。
\r
2131 bool bセパレータの追加がまだ = true;
\r
2134 // すべての「最近使ったファイル」について...
\r
2136 for( int i = 0; i < this.appアプリ設定.RecentUsedFile.Count; i++ )
\r
2138 #region [ 最大表示数を越えたらここで終了。 ]
\r
2139 //-----------------
\r
2140 if( i >= this.appアプリ設定.RecentFilesNum )
\r
2142 //-----------------
\r
2145 #region [ ファイル名を、サブメニュー項目として [ファイル] メニューに追加する。 ]
\r
2146 //-----------------
\r
2147 string path = this.appアプリ設定.RecentUsedFile[ i ];
\r
2149 if( path.Length == 0 )
\r
2152 #region [ セパレータの追加がまだなら追加する。]
\r
2153 //-----------------
\r
2154 if( bセパレータの追加がまだ )
\r
2156 var separator = new ToolStripSeparator();
\r
2157 separator.Size = this.toolStripSeparator1.Size;
\r
2158 this.toolStripMenuItemファイル.DropDownItems.Add( separator );
\r
2159 bセパレータの追加がまだ = false;
\r
2161 //-----------------
\r
2164 #region [ ToolStripMenuItem を手動で作って [ファイル] のサブメニューリストに追加する。]
\r
2165 //-----------------
\r
2166 string strShotenPath = AdjustPathString( path ); // #35890 2016.1.3 yyagi; shorten "RecentFiles" text if needed
\r
2167 var item2 = new ToolStripMenuItem() {
\r
2168 Name = "最近使ったファイル" + i,
\r
2169 Size = this.toolStripMenuItem終了.Size,
\r
2170 Text = "&" + i + " " + strShotenPath,
\r
2171 ToolTipText = path,
\r
2173 item2.Click += new EventHandler( this.toolStripMenuItem最近使ったファイル_Click );
\r
2174 this.toolStripMenuItemファイル.DropDownItems.Add( item2 );
\r
2175 //-----------------
\r
2178 #region [ 追加したファイルが既に存在していないなら項目を無効化(グレー表示)する。]
\r
2179 //-----------------
\r
2180 if( !File.Exists( path ) )
\r
2181 item2.Enabled = false;
\r
2182 //-----------------
\r
2185 //-----------------
\r
2188 //-----------------
\r
2191 // 参考: http://gushwell.ldblog.jp/archives/50815731.html
\r
2192 private string AdjustPathString( string text )
\r
2194 int nTargetWidth = (int)(this.Width * 0.8f);
\r
2195 Bitmap bmp = new Bitmap(nTargetWidth, this.Height);
\r
2196 Graphics g = Graphics.FromImage( bmp );
\r
2197 var item = new ToolStripMenuItem();
\r
2198 SizeF size = g.MeasureString( text, item.Font );
\r
2199 //Debug.WriteLine( "WinWidth"+ this.Width + ", now=" + size.Width + ", font=" + this.Font.ToString());
\r
2200 while ( nTargetWidth < size.Width )
\r
2202 string text2 = ShortenPathString( text );
\r
2203 if ( text == text2 )
\r
2205 size = g.MeasureString( text2, this.Font );
\r
2207 //Debug.WriteLine( "winWidth" + this.Width + ", now=" + size.Width + ", font=" + this.Font.ToString() );
\r
2214 private string ShortenPathString( string text )
\r
2216 int nWidth = this.Width;
\r
2217 List<string> list = new List<string>(text.Split('\\'));
\r
2218 int i = list.Count / 2;
\r
2219 if ( list[i] != "..." )
\r
2225 if ( list.Count % 2 == 0 && i > 1 )
\r
2226 list.RemoveAt(i - 1);
\r
2227 else if ( list.Count % 2 == 1 && i < list.Count - 2 )
\r
2228 list.RemoveAt(i + 1);
\r
2230 StringBuilder sb = new StringBuilder(list[0]);
\r
2231 for ( int n = 1; n < list.Count; n++ ) {
\r
2232 sb.Append('\\').Append(list[n]);
\r
2234 //Debug.WriteLine( "org:" + text );
\r
2235 //Debug.WriteLine( "now:" + sb );
\r
2236 return sb.ToString();
\r
2238 public void tWAV_BMP_AVIリストのカーソルを全部同じ行に合わせる( int nIndex番号0to1294 )
\r
2240 if( nIndex番号0to1294 >= 0 && nIndex番号0to1294 <= 1294 )
\r
2242 this.mgrWAVリスト管理者.tItemを選択する( nIndex番号0to1294 );
\r
2243 this.mgrBMPリスト管理者.tItemを選択する( nIndex番号0to1294 );
\r
2244 this.mgrAVIリスト管理者.tItemを選択する( nIndex番号0to1294 );
\r
2246 this.n現在選択中のWAV_BMP_AVIリストの行番号0to1294 = nIndex番号0to1294;
\r
2249 public string strファイルの存在するディレクトリを絶対パスで返す( string strファイル )
\r
2251 string strファイルの絶対パス = strファイル;
\r
2255 // ファイルが絶対パスかどうかを判定する。(new Uri() は相対パスを指定されると例外が発生するので、それを利用する。)
\r
2257 new Uri( strファイル );
\r
2261 // 例外が発生したので相対パスとみなし、絶対パスに直す。
\r
2263 strファイルの絶対パス = this.str作業フォルダ名 + strファイル;
\r
2266 // 正規化する。(\a\b\c\..\d を \a\b\d にする)
\r
2268 // FileInfo fi = new FileInfo( strファイルの絶対パス );
\r
2269 //\ strファイルの絶対パス = fi.FullName;
\r
2271 return strファイルの絶対パス;
\r
2273 public Point pt現在のマウス位置を譜面の可視領域相対の座標dotで返す()
\r
2275 Point p = new Point( Cursor.Position.X, Cursor.Position.Y );
\r
2276 return this.splitContainerタブと譜面を分割.Panel2.PointToClient( p );
\r
2278 public Size sz譜面の可視領域の大きさdotを返す()
\r
2280 return new Size( this.splitContainerタブと譜面を分割.Panel2.Width, this.pictureBox譜面パネル.Height );
\r
2282 public void tUndoRedo用GUIの有効無効を設定する()
\r
2284 this.toolStripMenuItemアンドゥ.Enabled = this.mgrUndoRedo管理者.nUndo可能な回数 > 0;
\r
2285 this.toolStripMenuItemリドゥ.Enabled = this.mgrUndoRedo管理者.nRedo可能な回数 > 0;
\r
2286 this.toolStripButtonアンドゥ.Enabled = this.mgrUndoRedo管理者.nUndo可能な回数 > 0;
\r
2287 this.toolStripButtonリドゥ.Enabled = this.mgrUndoRedo管理者.nRedo可能な回数 > 0;
\r
2289 public void tタブを選択する( Eタブ種別 eタブ種別 )
\r
2291 this.tabControl情報パネル.SelectedIndex = (int) eタブ種別;
\r
2297 #region [ private ]
\r
2298 //-----------------
\r
2299 private bool _b未保存 = true;
\r
2300 private bool b前回BGMありで再生した = true;
\r
2301 private bool b再生速度を変更した = false;
\r
2302 private bool bDTXファイルを開いた = false;
\r
2303 private Point pt選択モードのコンテクストメニューを開いたときのマウスの位置;
\r
2304 private int n現在のガイド間隔4to64or0 = 16; // 初期は16分間隔
\r
2305 private bool b選択チップがある
\r
2309 foreach( KeyValuePair<int, C小節> pair in this.mgr譜面管理者.dic小節 )
\r
2311 foreach( Cチップ cチップ in pair.Value.listチップ )
\r
2321 public void tDTXV演奏関連のボタンとメニューのEnabledの設定()
\r
2323 if( File.Exists( this.strDTXCのあるフォルダ名 + this.appアプリ設定.ViewerInfo.Path ) )
\r
2325 // DTXViewer(DTXManiaGR) が存在するなら Enable
\r
2327 this.toolStripButton先頭から再生.Enabled = true;
\r
2328 this.toolStripButton現在位置から再生.Enabled = true;
\r
2329 this.toolStripButton現在位置からBGMのみ再生.Enabled = true;
\r
2330 this.toolStripButton再生停止.Enabled = true;
\r
2331 this.toolStripMenuItem先頭から再生.Enabled = true;
\r
2332 this.toolStripMenuItem現在位置から再生.Enabled = true;
\r
2333 this.toolStripMenuItem現在位置からBGMのみ再生.Enabled = true;
\r
2334 this.toolStripMenuItem再生停止.Enabled = true;
\r
2338 // DTXViewer(DTXManiaGR) が存在しないなら Disable
\r
2340 this.toolStripButton先頭から再生.Enabled = false;
\r
2341 this.toolStripButton現在位置から再生.Enabled = false;
\r
2342 this.toolStripButton現在位置からBGMのみ再生.Enabled = false;
\r
2343 this.toolStripButton再生停止.Enabled = false;
\r
2344 this.toolStripMenuItem先頭から再生.Enabled = false;
\r
2345 this.toolStripMenuItem現在位置から再生.Enabled = false;
\r
2346 this.toolStripMenuItem現在位置からBGMのみ再生.Enabled = false;
\r
2347 this.toolStripMenuItem再生停止.Enabled = false;
\r
2350 private string tファイル選択ダイアログでファイルを選択し相対パスにして返す( string strタイトル, string strフィルタ, string str初期フォルダ )
\r
2352 string str相対ファイル名 = "";
\r
2354 this.dlgチップパレット.t一時的に隠蔽する();
\r
2356 var dialog = new OpenFileDialog() {
\r
2360 InitialDirectory = str初期フォルダ,
\r
2362 if( dialog.ShowDialog() == DialogResult.OK )
\r
2364 str相対ファイル名 = Cファイル選択_パス変換.str基点からの相対パスに変換して返す( dialog.FileName, this.str作業フォルダ名 );
\r
2365 str相対ファイル名.Replace( '/', '\\' );
\r
2370 this.dlgチップパレット.t一時的な隠蔽を解除する();
\r
2372 return str相対ファイル名;
\r
2374 public DialogResult t未保存なら保存する()
\r
2376 var result = DialogResult.OK;
\r
2382 this.dlgチップパレット.t一時的に隠蔽する();
\r
2383 result = MessageBox.Show( Resources.str編集中のデータを保存しますかMSG, Resources.str確認ダイアログのタイトル, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1 );
\r
2384 this.dlgチップパレット.t一時的な隠蔽を解除する();
\r
2389 if( result == DialogResult.Yes )
\r
2390 this.tシナリオ_上書き保存();
\r
2399 private void t次のプロパティ変更処理がUndoRedoリストに載らないようにする()
\r
2401 CUndoRedo管理.bUndoRedoした直後 = true;
\r
2403 private void t次のプロパティ変更処理がUndoRedoリストに載るようにする()
\r
2405 CUndoRedo管理.bUndoRedoした直後 = false;
\r
2409 /// <para>n分 … 4分間隔なら 4、8分間隔なら 8 など、フリー間隔なら 0 を指定する。</para>
\r
2411 private void tガイド間隔を変更する( int n分 )
\r
2415 #region [ 新しいガイド間隔を設定。 ]
\r
2416 //-----------------
\r
2418 this.n現在のガイド間隔4to64or0 = n分;
\r
2420 this.mgr譜面管理者.n現在のガイド幅grid =
\r
2421 ( n分 == 0 ) ? 1 : ( C小節.n基準の高さgrid / n分 );
\r
2423 //-----------------
\r
2427 // ガイド間隔メニュー GUI を更新。
\r
2429 #region [ 一度すべてのガイド間隔メニューのチェックをはずし、制定された分数のメニューのみチェックする。 ]
\r
2430 //-----------------
\r
2431 this.toolStripMenuItemガイド間隔4分.CheckState = CheckState.Unchecked;
\r
2432 this.toolStripMenuItemガイド間隔8分.CheckState = CheckState.Unchecked;
\r
2433 this.toolStripMenuItemガイド間隔12分.CheckState = CheckState.Unchecked;
\r
2434 this.toolStripMenuItemガイド間隔16分.CheckState = CheckState.Unchecked;
\r
2435 this.toolStripMenuItemガイド間隔24分.CheckState = CheckState.Unchecked;
\r
2436 this.toolStripMenuItemガイド間隔32分.CheckState = CheckState.Unchecked;
\r
2437 this.toolStripMenuItemガイド間隔48分.CheckState = CheckState.Unchecked;
\r
2438 this.toolStripMenuItemガイド間隔64分.CheckState = CheckState.Unchecked;
\r
2439 this.toolStripMenuItemガイド間隔フリー.CheckState = CheckState.Unchecked;
\r
2444 this.toolStripMenuItemガイド間隔8分.CheckState = CheckState.Checked;
\r
2445 this.toolStripComboBoxガイド間隔.SelectedIndex = 1;
\r
2449 this.toolStripMenuItemガイド間隔12分.CheckState = CheckState.Checked;
\r
2450 this.toolStripComboBoxガイド間隔.SelectedIndex = 2;
\r
2454 this.toolStripMenuItemガイド間隔フリー.CheckState = CheckState.Checked;
\r
2455 this.toolStripComboBoxガイド間隔.SelectedIndex = 8;
\r
2459 this.toolStripMenuItemガイド間隔4分.CheckState = CheckState.Checked;
\r
2460 this.toolStripComboBoxガイド間隔.SelectedIndex = 0;
\r
2464 this.toolStripMenuItemガイド間隔16分.CheckState = CheckState.Checked;
\r
2465 this.toolStripComboBoxガイド間隔.SelectedIndex = 3;
\r
2469 this.toolStripMenuItemガイド間隔24分.CheckState = CheckState.Checked;
\r
2470 this.toolStripComboBoxガイド間隔.SelectedIndex = 4;
\r
2474 this.toolStripMenuItemガイド間隔32分.CheckState = CheckState.Checked;
\r
2475 this.toolStripComboBoxガイド間隔.SelectedIndex = 5;
\r
2479 this.toolStripMenuItemガイド間隔48分.CheckState = CheckState.Checked;
\r
2480 this.toolStripComboBoxガイド間隔.SelectedIndex = 6;
\r
2484 this.toolStripMenuItemガイド間隔64分.CheckState = CheckState.Checked;
\r
2485 this.toolStripComboBoxガイド間隔.SelectedIndex = 7;
\r
2488 //-----------------
\r
2494 #region [ 画面を再描画する。]
\r
2495 //-----------------
\r
2496 this.pictureBox譜面パネル.Invalidate();
\r
2497 //-----------------
\r
2504 #region [ GUIイベント:メインフォーム ]
\r
2505 //-----------------
\r
2506 private void Cメインフォーム_DragDrop( object sender, DragEventArgs e )
\r
2508 string[] data = (string[]) e.Data.GetData( DataFormats.FileDrop );
\r
2509 if( data.Length >= 1 )
\r
2511 this.tシナリオ_DragDropされたファイルを開く( data );
\r
2514 private void Cメインフォーム_DragEnter( object sender, DragEventArgs e )
\r
2516 if( e.Data.GetDataPresent( DataFormats.FileDrop ) )
\r
2518 e.Effect = DragDropEffects.Copy;
\r
2522 e.Effect = DragDropEffects.None;
\r
2525 private void Cメインフォーム_FormClosing( object sender, FormClosingEventArgs e )
\r
2527 if( this.t未保存なら保存する() == DialogResult.Cancel )
\r
2533 this.tアプリ終了時に行う終了処理();
\r
2536 private void Cメインフォーム_Load( object sender, EventArgs e )
\r
2538 this.tアプリ起動時に一度だけ行う初期化処理();
\r
2539 // this.t譜面を初期化する(); // 2011.8.29 yyagi; removed this.t譜面を初期化する() because it has already done in this.tアプリ起動時に一度だけ行う初期化処理().
\r
2541 //-----------------
\r
2543 #region [ GUIイベント:pictureBox譜面パネル、Panel2、スクロールバー関連 ]
\r
2544 //-----------------
\r
2545 private void pictureBox譜面パネル_MouseClick( object sender, MouseEventArgs e )
\r
2549 this.pictureBox譜面パネル.Focus();
\r
2552 // 選択・編集のいずれかの管理者へ処理を引き継ぐ。
\r
2554 if( this.b選択モードである )
\r
2556 this.mgr選択モード管理者.MouseClick( e );
\r
2560 this.mgr編集モード管理者.MouseClick( e );
\r
2563 private void pictureBox譜面パネル_MouseDown( object sender, MouseEventArgs e )
\r
2565 if( this.b選択モードである )
\r
2566 this.mgr選択モード管理者.MouseDown( e );
\r
2568 private void pictureBox譜面パネル_MouseEnter( object sender, EventArgs e )
\r
2570 #region [ オートフォーカスが有効の場合、譜面にマウスが入ったら譜面がフォーカスを得る。 ]
\r
2571 //-----------------
\r
2572 if( this.appアプリ設定.AutoFocus )
\r
2573 this.pictureBox譜面パネル.Focus();
\r
2574 //-----------------
\r
2577 private void pictureBox譜面パネル_MouseLeave( object sender, EventArgs e )
\r
2579 if( this.b編集モードである )
\r
2580 this.mgr編集モード管理者.MouseLeave( e );
\r
2582 private void pictureBox譜面パネル_MouseMove( object sender, MouseEventArgs e )
\r
2584 // 選択・編集のいずれかの管理者へ処理を引き継ぐ。
\r
2586 if( this.b選択モードである )
\r
2588 this.mgr選択モード管理者.MouseMove( e );
\r
2592 this.mgr編集モード管理者.MouseMove( e );
\r
2595 private void pictureBox譜面パネル_Paint( object sender, PaintEventArgs e )
\r
2597 if( this.mgr譜面管理者 == null )
\r
2598 return; // まだ初期化が終わってないうちに Paint が呼び出される場合がある。
\r
2600 #region [ 小節数が変わってたら、スクロールバーの値域を調整する。]
\r
2601 //-----------------
\r
2602 int n全譜面の高さgrid = this.mgr譜面管理者.n全小節の高さgridの合計を返す();
\r
2604 if( this.vScrollBar譜面用垂直スクロールバー.Maximum != n全譜面の高さgrid - 1 ) // 小節数が変わっている
\r
2606 // 譜面の高さ(grid)がどれだけ変わったか?
\r
2608 int n増加分grid = ( n全譜面の高さgrid - 1 ) - this.vScrollBar譜面用垂直スクロールバー.Maximum;
\r
2613 #region [ スクロールバーの状態を新しい譜面の高さに合わせる。]
\r
2614 //-----------------
\r
2615 this.vScrollBar譜面用垂直スクロールバー.Maximum = n全譜面の高さgrid - 1;
\r
2617 if( ( this.vScrollBar譜面用垂直スクロールバー.Value + n増加分grid ) < 0 )
\r
2619 this.vScrollBar譜面用垂直スクロールバー.Value = 0;
\r
2623 this.vScrollBar譜面用垂直スクロールバー.Value += n増加分grid;
\r
2625 //-----------------
\r
2631 #region [ 譜面表示下辺の位置を更新する。 ]
\r
2632 //-----------------
\r
2633 this.mgr譜面管理者.n現在の譜面表示下辺の譜面先頭からの位置grid =
\r
2634 ( ( this.vScrollBar譜面用垂直スクロールバー.Maximum - this.vScrollBar譜面用垂直スクロールバー.LargeChange ) + 1 ) - this.vScrollBar譜面用垂直スクロールバー.Value;
\r
2635 //-----------------
\r
2638 //-----------------
\r
2641 #region [ 譜面を描画する。]
\r
2642 //-----------------
\r
2643 int nPicBoxの幅 = this.pictureBox譜面パネル.ClientSize.Width;
\r
2644 int nPanel2の幅 = this.splitContainerタブと譜面を分割.Panel2.Width;
\r
2646 var rc可視領域 = new Rectangle() {
\r
2647 X = -this.pictureBox譜面パネル.Location.X,
\r
2649 Width = ( nPanel2の幅 > nPicBoxの幅 ) ? nPicBoxの幅 : nPanel2の幅,
\r
2650 Height = this.pictureBox譜面パネル.ClientSize.Height,
\r
2653 this.mgr譜面管理者.t譜面を描画する( e.Graphics, this.pictureBox譜面パネル.ClientSize, rc可視領域 );
\r
2654 //-----------------
\r
2657 #region [ 現在のモード管理者の Paint() を呼び出す。]
\r
2658 //-----------------
\r
2659 if( this.b選択モードである )
\r
2661 if( this.mgr選択モード管理者 != null )
\r
2662 this.mgr選択モード管理者.Paint( e );
\r
2666 if( this.mgr編集モード管理者 != null )
\r
2667 this.mgr編集モード管理者.Paint( e );
\r
2669 //-----------------
\r
2672 private void pictureBox譜面パネル_PreviewKeyDown( object sender, PreviewKeyDownEventArgs e )
\r
2674 if( e.KeyCode == Keys.Prior )
\r
2676 #region [ PageUp → 移動量に対応する grid だけ垂直つまみを移動させる。あとはこの移動で生じる ChangedValue イベントで処理。]
\r
2677 //-----------------
\r
2678 int n移動すべき数grid = -C小節.n基準の高さgrid;
\r
2679 int n新しい位置 = this.vScrollBar譜面用垂直スクロールバー.Value + n移動すべき数grid;
\r
2680 int n最小値 = this.vScrollBar譜面用垂直スクロールバー.Minimum;
\r
2681 int n最大値 = ( this.vScrollBar譜面用垂直スクロールバー.Maximum + 1 ) - this.vScrollBar譜面用垂直スクロールバー.LargeChange;
\r
2683 if( n新しい位置 < n最小値 )
\r
2687 else if( n新しい位置 > n最大値 )
\r
2692 this.vScrollBar譜面用垂直スクロールバー.Value = n新しい位置;
\r
2693 //-----------------
\r
2696 else if( e.KeyCode == Keys.Next )
\r
2698 #region [ PageDown → 移動量に対応する grid だけ垂直つまみを移動させる。あとはこの移動で生じる ChangedValue イベントで処理。]
\r
2699 //-----------------
\r
2700 int n移動すべき数grid = C小節.n基準の高さgrid;
\r
2701 int n新しい位置 = this.vScrollBar譜面用垂直スクロールバー.Value + n移動すべき数grid;
\r
2702 int n最小値 = this.vScrollBar譜面用垂直スクロールバー.Minimum;
\r
2703 int n最大値 = ( this.vScrollBar譜面用垂直スクロールバー.Maximum + 1 ) - this.vScrollBar譜面用垂直スクロールバー.LargeChange;
\r
2705 if( n新しい位置 < n最小値 )
\r
2709 else if( n新しい位置 > n最大値 )
\r
2714 this.vScrollBar譜面用垂直スクロールバー.Value = n新しい位置;
\r
2715 //-----------------
\r
2720 private void splitContainerタブと譜面を分割_MouseWheel( object sender, MouseEventArgs e )
\r
2722 if ( ( Control.ModifierKeys & Keys.Shift ) == Keys.Shift )
\r
2724 #region [ Shiftを押しながらホイール操作すると、横スクロール。]
\r
2725 if ( e.Delta == 0 )
\r
2728 // e.Delta は、スクロールバーを下へ動かしたいときに負、上へ動かしたいときに正となる。
\r
2730 int n移動すべき行数 = ( -e.Delta * SystemInformation.MouseWheelScrollLines ) / 120;
\r
2732 // 1行=1レーン とする。(が、実際には適当に設定しただけ。1レーンには設定していない)
\r
2734 int n移動すべき数grid = n移動すべき行数 * 16;
\r
2737 // スクロールバーのつまみを移動。
\r
2739 int n新しい位置 = this.hScrollBar譜面用水平スクロールバー.Value + n移動すべき数grid;
\r
2740 int n最小値 = this.hScrollBar譜面用水平スクロールバー.Minimum;
\r
2741 int n最大値 = ( this.hScrollBar譜面用水平スクロールバー.Maximum + 1 ) - this.hScrollBar譜面用水平スクロールバー.LargeChange;
\r
2743 if ( n新しい位置 < n最小値 )
\r
2747 else if ( n新しい位置 > n最大値 )
\r
2752 this.hScrollBar譜面用水平スクロールバー.Value = n新しい位置;
\r
2753 //-----------------
\r
2758 #region [ 移動量に対応する grid だけ垂直つまみを移動させる。あとはこの移動で生じる ChangedValue イベントで処理する。]
\r
2759 //-----------------
\r
2760 if ( e.Delta == 0 )
\r
2764 // e.Delta は、スクロールバーを下へ動かしたいときに負、上へ動かしたいときに正となる。
\r
2766 int n移動すべき行数 = ( -e.Delta * SystemInformation.MouseWheelScrollLines ) / 120;
\r
2769 // 1行=1拍(64/4=16グリッド)とする。
\r
2771 int n移動すべき数grid = n移動すべき行数 * 16;
\r
2774 // スクロールバーのつまみを移動。
\r
2776 int n新しい位置 = this.vScrollBar譜面用垂直スクロールバー.Value + n移動すべき数grid;
\r
2777 int n最小値 = this.vScrollBar譜面用垂直スクロールバー.Minimum;
\r
2778 int n最大値 = ( this.vScrollBar譜面用垂直スクロールバー.Maximum + 1 ) - this.vScrollBar譜面用垂直スクロールバー.LargeChange;
\r
2780 if ( n新しい位置 < n最小値 )
\r
2784 else if ( n新しい位置 > n最大値 )
\r
2789 this.vScrollBar譜面用垂直スクロールバー.Value = n新しい位置;
\r
2790 //-----------------
\r
2794 private void splitContainerタブと譜面を分割_Panel2_SizeChanged( object sender, EventArgs e )
\r
2796 if( this.mgr譜面管理者 != null ) // 初期化前に呼び出されることがある。
\r
2798 this.mgr譜面管理者.t水平スクロールバーと譜面パネル左右位置の調整();
\r
2799 this.mgr譜面管理者.t垂直スクロールバーと譜面可視領域の上下位置の調整();
\r
2803 private void hScrollBar譜面用水平スクロールバー_ValueChanged( object sender, EventArgs e )
\r
2805 if( this.mgr譜面管理者 != null )
\r
2806 this.mgr譜面管理者.t水平スクロールバーと譜面パネル左右位置の調整();
\r
2808 private void vScrollBar譜面用垂直スクロールバー_ValueChanged( object sender, EventArgs e )
\r
2810 if( mgr譜面管理者 != null )
\r
2811 this.mgr譜面管理者.t垂直スクロールバーと譜面可視領域の上下位置の調整();
\r
2813 //-----------------
\r
2815 #region [ GUIイベント:譜面右メニュー関連 ]
\r
2816 //-----------------
\r
2817 private void toolStripMenuItem選択チップの切り取り_Click( object sender, EventArgs e )
\r
2819 this.tシナリオ_切り取り();
\r
2821 private void toolStripMenuItem選択チップのコピー_Click( object sender, EventArgs e )
\r
2825 private void toolStripMenuItem選択チップの貼り付け_Click( object sender, EventArgs e )
\r
2829 Point ptMenu = new Point( this.contextMenuStrip譜面右メニュー.Left, this.contextMenuStrip譜面右メニュー.Top );
\r
2830 Point ptMenuClient = this.contextMenuStrip譜面右メニュー.SourceControl.PointToClient( ptMenu );
\r
2833 // Y座標から位置gridを得て、そこへ貼り付ける。
\r
2835 this.tシナリオ_貼り付け( this.mgr譜面管理者.nY座標dotが位置するgridを返す_ガイド幅単位( ptMenuClient.Y ) );
\r
2837 private void toolStripMenuItem選択チップの削除_Click( object sender, EventArgs e )
\r
2842 private void toolStripMenuItemすべてのチップの選択_Click( object sender, EventArgs e )
\r
2844 // 編集モードなら強制的に選択モードにする。
\r
2846 if( this.b編集モードである )
\r
2852 this.mgr選択モード管理者.t全チップを選択する();
\r
2854 private void toolStripMenuItemレーン内のすべてのチップの選択_Click( object sender, EventArgs e )
\r
2856 // 編集モードなら強制的に選択モードにする。
\r
2858 if ( this.b編集モードである )
\r
2861 // メニューが開かれたときのマウスの座標を取得。
\r
2862 // ※メニューは必ずマウス位置を左上にして表示されるとは限らないため、
\r
2863 // メニューの表示位置からは取得しないこと。
\r
2865 Point ptマウスの位置 = this.pt選択モードのコンテクストメニューを開いたときのマウスの位置;
\r
2870 #region [ クリックされた箇所のレーン番号を取得する。]
\r
2871 //-----------------
\r
2872 int lane = this.mgr譜面管理者.nX座標dotが位置するレーン番号を返す( ptマウスの位置.X );
\r
2874 return; // クリックされた箇所にレーンがない
\r
2876 //-----------------
\r
2879 this.mgr選択モード管理者.tレーン上の全チップを選択する( lane );
\r
2882 private void toolStripMenuItemレーン内のすべてのチップの選択_特定小節以降_Click( object sender, EventArgs e )
\r
2884 // 編集モードなら強制的に選択モードにする。
\r
2886 if ( this.b編集モードである )
\r
2889 // メニューが開かれたときのマウスの座標を取得。
\r
2890 // ※メニューは必ずマウス位置を左上にして表示されるとは限らないため、
\r
2891 // メニューの表示位置からは取得しないこと。
\r
2893 Point ptマウスの位置 = this.pt選択モードのコンテクストメニューを開いたときのマウスの位置;
\r
2895 #region [ クリックされた箇所のレーン番号を取得する。]
\r
2896 //-----------------
\r
2897 int lane = this.mgr譜面管理者.nX座標dotが位置するレーン番号を返す( ptマウスの位置.X );
\r
2899 return; // クリックされた箇所にレーンがない
\r
2901 //-----------------
\r
2903 #region [ クリックされた箇所の小節を取得する。]
\r
2904 //-----------------
\r
2905 if ( this.mgr譜面管理者.nX座標dotが位置するレーン番号を返す( ptマウスの位置.X ) < 0 )
\r
2906 return; // クリックされた箇所にレーンがない
\r
2908 int n譜面先頭からの位置grid = this.mgr譜面管理者.nY座標dotが位置するgridを返す_ガイド幅単位( ptマウスの位置.Y );
\r
2910 C小節 csクリックされた小節 = this.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( n譜面先頭からの位置grid );
\r
2911 //-----------------
\r
2914 this.mgr選択モード管理者.tレーン上の全チップを選択する( lane, csクリックされた小節.n小節番号0to3599 );
\r
2917 private void toolStripMenuItem小節内のすべてのチップの選択_Click( object sender, EventArgs e )
\r
2919 // 編集モードなら強制的に選択モードにする。
\r
2921 if ( this.b編集モードである )
\r
2924 // メニューが開かれたときのマウスの座標を取得。
\r
2925 // ※メニューは必ずマウス位置を左上にして表示されるとは限らないため、
\r
2926 // メニューの表示位置からは取得しないこと。
\r
2928 Point ptマウスの位置 = this.pt選択モードのコンテクストメニューを開いたときのマウスの位置;
\r
2930 #region [ クリックされた箇所の小節を取得する。]
\r
2931 //-----------------
\r
2932 if ( this.mgr譜面管理者.nX座標dotが位置するレーン番号を返す( ptマウスの位置.X ) < 0 )
\r
2933 return; // クリックされた箇所にレーンがない
\r
2935 int n譜面先頭からの位置grid = this.mgr譜面管理者.nY座標dotが位置するgridを返す_ガイド幅単位( ptマウスの位置.Y );
\r
2936 C小節 csクリックされた小節 = this.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( n譜面先頭からの位置grid );
\r
2937 //-----------------
\r
2940 this.mgr選択モード管理者.t小節上の全チップを選択する( csクリックされた小節.n小節番号0to3599 );
\r
2943 private void toolStripMenuItem小節長変更_Click( object sender, EventArgs e )
\r
2945 // メニューが開かれたときのマウスの座標を取得。
\r
2946 // ※メニューは必ずマウス位置を左上にして表示されるとは限らないため、
\r
2947 // メニューの表示位置からは取得しないこと。
\r
2949 Point ptマウス位置 = this.pt選択モードのコンテクストメニューを開いたときのマウスの位置;
\r
2954 #region [ クリックされた小節を取得する。]
\r
2955 //-----------------
\r
2956 if( this.mgr譜面管理者.nX座標dotが位置するレーン番号を返す( ptマウス位置.X ) < 0 )
\r
2957 return; // クリックされた箇所にレーンがないなら無視。
\r
2959 int n譜面先頭からの位置grid = this.mgr譜面管理者.nY座標dotが位置するgridを返す_ガイド幅単位( ptマウス位置.Y );
\r
2960 C小節 csクリックされた小節 = this.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( n譜面先頭からの位置grid );
\r
2961 //-----------------
\r
2964 #region [ 取得した小節の小節長を変更する。]
\r
2965 //-----------------
\r
2966 if( csクリックされた小節 != null )
\r
2967 this.tシナリオ_小節長を変更する( csクリックされた小節 );
\r
2968 //-----------------
\r
2971 private void toolStripMenuItem小節の挿入_Click( object sender, EventArgs e )
\r
2973 // メニューが開かれたときのマウスの座標を取得。
\r
2974 // ※メニューは必ずマウス位置を左上にして表示されるとは限らないため、
\r
2975 // メニューの表示位置からは取得しないこと。
\r
2977 Point ptマウスの位置 = this.pt選択モードのコンテクストメニューを開いたときのマウスの位置;
\r
2982 #region [ クリックされた箇所の小節を取得する。]
\r
2983 //-----------------
\r
2984 if( this.mgr譜面管理者.nX座標dotが位置するレーン番号を返す( ptマウスの位置.X ) < 0 )
\r
2985 return; // クリックされた箇所にレーンがない
\r
2987 int n譜面先頭からの位置grid = this.mgr譜面管理者.nY座標dotが位置するgridを返す_ガイド幅単位( ptマウスの位置.Y );
\r
2988 C小節 csクリックされた小節 = this.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( n譜面先頭からの位置grid );
\r
2989 //-----------------
\r
2992 #region [ 該当小節の下へ新しい小節を挿入する。]
\r
2993 //-----------------
\r
2994 if( csクリックされた小節 != null )
\r
2995 this.tシナリオ_小節を挿入する( csクリックされた小節.n小節番号0to3599 );
\r
2996 //-----------------
\r
2999 private void toolStripMenuItem小節の削除_Click( object sender, EventArgs e )
\r
3001 // メニューが開かれたときのマウスの座標を取得。
\r
3002 // ※メニューは必ずマウス位置を左上にして表示されるとは限らないため、
\r
3003 // メニューの表示位置からは取得しないこと。
\r
3005 Point ptマウス位置 = this.pt選択モードのコンテクストメニューを開いたときのマウスの位置;
\r
3010 #region [ クリックされた箇所の小節を取得する。 ]
\r
3011 //-----------------
\r
3012 if( this.mgr譜面管理者.nX座標dotが位置するレーン番号を返す( ptマウス位置.X ) < 0 )
\r
3013 return; // クリックされた箇所にレーンがないなら無視。
\r
3015 int n譜面先頭からの位置grid = this.mgr譜面管理者.nY座標dotが位置するgridを返す_ガイド幅単位( ptマウス位置.Y );
\r
3016 C小節 cs削除する小節 = this.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( n譜面先頭からの位置grid );
\r
3017 //-----------------
\r
3020 #region [ 該当小節を削除する。]
\r
3021 //-----------------
\r
3022 if( cs削除する小節 != null )
\r
3023 this.tシナリオ_小節を削除する( cs削除する小節.n小節番号0to3599 );
\r
3024 //-----------------
\r
3027 //-----------------
\r
3030 #region [ GUIイベント:基本情報関連 ]
\r
3031 //-----------------
\r
3033 private string textBox曲名_以前の値 = "";
\r
3034 private void textBox曲名_TextChanged( object sender, EventArgs e )
\r
3036 // Undo/Redo リストを修正する。
\r
3038 #region [ Undo/Redo リストを修正。]
\r
3039 //-----------------
\r
3040 if( !CUndoRedo管理.bUndoRedoした直後 )
\r
3042 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();
\r
3044 if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBox曲名 ) )
\r
3048 ( (CUndoRedoセル<string>) oセル仮想 ).変更後の値 = this.textBox曲名.Text;
\r
3054 this.mgrUndoRedo管理者.tノードを追加する(
\r
3055 new CUndoRedoセル<string>(
\r
3057 new DGUndoを実行する<string>( this.textBox曲名_Undo ),
\r
3058 new DGRedoを実行する<string>( this.textBox曲名_Redo ),
\r
3059 this.textBox曲名_以前の値, this.textBox曲名.Text ) );
\r
3062 // Undo ボタンを有効にする。
\r
3064 this.tUndoRedo用GUIの有効無効を設定する();
\r
3067 //-----------------
\r
3071 // Undo 用に値を保管しておく。
\r
3073 this.textBox曲名_以前の値 = this.textBox曲名.Text;
\r
3078 CUndoRedo管理.bUndoRedoした直後 = false;
\r
3081 private void textBox曲名_Leave( object sender, EventArgs e )
\r
3083 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();
\r
3085 if( oセル仮想 != null )
\r
3086 oセル仮想.t所有権の放棄( this.textBox曲名 );
\r
3088 private void textBox曲名_Undo( string str変更前, string str変更後 )
\r
3092 this.tタブを選択する( Eタブ種別.基本情報 );
\r
3094 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
3095 this.textBox曲名.Text = str変更前;
\r
3097 this.textBox曲名.Focus();
\r
3099 private void textBox曲名_Redo( string str変更前, string str変更後 )
\r
3103 this.tタブを選択する( Eタブ種別.基本情報 );
\r
3105 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
3106 this.textBox曲名.Text = str変更後;
\r
3108 this.textBox曲名.Focus();
\r
3111 #region [ Author ]
\r
3112 private string textBox製作者_以前の値 = "";
\r
3113 private void textBox製作者_TextChanged( object sender, EventArgs e )
\r
3115 // Undo/Redo リストを修正する。
\r
3117 #region [ Undo/Redo リストを修正。]
\r
3118 //-----------------
\r
3119 if( !CUndoRedo管理.bUndoRedoした直後 )
\r
3121 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();
\r
3123 if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBox製作者 ) )
\r
3127 ( (CUndoRedoセル<string>) oセル仮想 ).変更後の値 = this.textBox製作者.Text;
\r
3133 this.mgrUndoRedo管理者.tノードを追加する(
\r
3134 new CUndoRedoセル<string>(
\r
3136 new DGUndoを実行する<string>( this.textBox製作者_Undo ),
\r
3137 new DGRedoを実行する<string>( this.textBox製作者_Redo ),
\r
3138 this.textBox製作者_以前の値, this.textBox製作者.Text ) );
\r
3141 // Undo ボタンを有効にする。
\r
3143 this.tUndoRedo用GUIの有効無効を設定する();
\r
3146 //-----------------
\r
3150 // Undo 用に値を保管しておく。
\r
3152 this.textBox製作者_以前の値 = this.textBox製作者.Text;
\r
3157 CUndoRedo管理.bUndoRedoした直後 = false;
\r
3160 private void textBox製作者_Leave( object sender, EventArgs e )
\r
3162 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();
\r
3164 if( oセル仮想 != null )
\r
3165 oセル仮想.t所有権の放棄( this.textBox製作者 );
\r
3167 private void textBox製作者_Undo( string str変更前, string str変更後 )
\r
3171 this.tタブを選択する( Eタブ種別.基本情報 );
\r
3173 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
3174 this.textBox製作者.Text = str変更前;
\r
3176 this.textBox製作者.Focus();
\r
3178 private void textBox製作者_Redo( string str変更前, string str変更後 )
\r
3182 this.tタブを選択する( Eタブ種別.基本情報 );
\r
3184 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
3185 this.textBox製作者.Text = str変更後;
\r
3187 this.textBox製作者.Focus();
\r
3190 #region [ Comment ]
\r
3191 private string textBoxコメント_以前の値 = "";
\r
3192 private void textBoxコメント_TextChanged( object sender, EventArgs e )
\r
3194 // Undo/Redo リストを修正する。
\r
3196 #region [ Undo/Redo リストを修正。]
\r
3197 //-----------------
\r
3198 if( !CUndoRedo管理.bUndoRedoした直後 )
\r
3200 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();
\r
3202 if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBoxコメント ) )
\r
3206 ( (CUndoRedoセル<string>) oセル仮想 ).変更後の値 = this.textBoxコメント.Text;
\r
3212 this.mgrUndoRedo管理者.tノードを追加する(
\r
3213 new CUndoRedoセル<string>(
\r
3214 this.textBoxコメント,
\r
3215 new DGUndoを実行する<string>( this.textBoxコメント_Undo ),
\r
3216 new DGRedoを実行する<string>( this.textBoxコメント_Redo ),
\r
3217 this.textBoxコメント_以前の値, this.textBoxコメント.Text ) );
\r
3219 // Undo ボタンを有効にする。
\r
3221 this.tUndoRedo用GUIの有効無効を設定する();
\r
3224 //-----------------
\r
3228 // Undo 用に値を保管しておく。
\r
3230 this.textBoxコメント_以前の値 = this.textBoxコメント.Text;
\r
3235 CUndoRedo管理.bUndoRedoした直後 = false;
\r
3238 private void textBoxコメント_Leave( object sender, EventArgs e )
\r
3240 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();
\r
3242 if( oセル仮想 != null )
\r
3243 oセル仮想.t所有権の放棄( this.textBoxコメント );
\r
3245 private void textBoxコメント_Undo( string str変更前, string str変更後 )
\r
3249 this.tタブを選択する( Eタブ種別.基本情報 );
\r
3251 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
3252 this.textBoxコメント.Text = str変更前;
\r
3254 this.textBoxコメント.Focus();
\r
3256 private void textBoxコメント_Redo( string str変更前, string str変更後 )
\r
3260 this.tタブを選択する( Eタブ種別.基本情報 );
\r
3262 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
3263 this.textBoxコメント.Text = str変更後;
\r
3265 this.textBoxコメント.Focus();
\r
3269 private string textBoxGenre_以前の値 = "";
\r
3270 private void textBoxGenre_TextChanged( object sender, EventArgs e )
\r
3272 // Undo/Redo リストを修正する。
\r
3274 #region [ Undo/Redo リストを修正。]
\r
3275 //-----------------
\r
3276 if ( !CUndoRedo管理.bUndoRedoした直後 )
\r
3278 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();
\r
3280 if ( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBoxGenre ) )
\r
3284 ( (CUndoRedoセル<string>) oセル仮想 ).変更後の値 = this.textBoxGenre.Text;
\r
3290 this.mgrUndoRedo管理者.tノードを追加する(
\r
3291 new CUndoRedoセル<string>(
\r
3292 this.textBoxGenre,
\r
3293 new DGUndoを実行する<string>( this.textBoxGenre_Undo ),
\r
3294 new DGRedoを実行する<string>( this.textBoxGenre_Redo ),
\r
3295 this.textBoxGenre_以前の値, this.textBoxGenre.Text ) );
\r
3297 // Undo ボタンを有効にする。
\r
3299 this.tUndoRedo用GUIの有効無効を設定する();
\r
3302 //-----------------
\r
3306 // Undo 用に値を保管しておく。
\r
3308 this.textBoxGenre_以前の値 = this.textBoxGenre.Text;
\r
3313 CUndoRedo管理.bUndoRedoした直後 = false;
\r
3316 private void textBoxGenre_Leave( object sender, EventArgs e )
\r
3318 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();
\r
3320 if ( oセル仮想 != null )
\r
3321 oセル仮想.t所有権の放棄( this.textBoxGenre );
\r
3323 private void textBoxGenre_Undo( string str変更前, string str変更後 )
\r
3327 this.tタブを選択する( Eタブ種別.基本情報 );
\r
3329 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
3330 this.textBoxGenre.Text = str変更前;
\r
3332 this.textBoxGenre.Focus();
\r
3334 private void textBoxGenre_Redo( string str変更前, string str変更後 )
\r
3338 this.tタブを選択する( Eタブ種別.基本情報 );
\r
3340 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
3341 this.textBoxGenre.Text = str変更後;
\r
3343 this.textBoxGenre.Focus();
\r
3348 private decimal numericUpDownBPM_以前の値 = 120.0M;
\r
3349 private void numericUpDownBPM_ValueChanged( object sender, EventArgs e )
\r
3351 // Undo/Redo リストを修正する。
\r
3353 #region [ Undo/Redo リストの修正。]
\r
3354 //-----------------
\r
3355 if( !CUndoRedo管理.bUndoRedoした直後 )
\r
3357 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();
\r
3359 if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.numericUpDownBPM ) )
\r
3363 ( (CUndoRedoセル<decimal>) oセル仮想 ).変更後の値 = this.numericUpDownBPM.Value;
\r
3369 this.mgrUndoRedo管理者.tノードを追加する(
\r
3370 new CUndoRedoセル<decimal>(
\r
3371 this.numericUpDownBPM,
\r
3372 new DGUndoを実行する<decimal>( this.numericUpDownBPM_Undo ),
\r
3373 new DGRedoを実行する<decimal>( this.numericUpDownBPM_Redo ),
\r
3374 this.numericUpDownBPM_以前の値, this.numericUpDownBPM.Value ) );
\r
3379 this.tUndoRedo用GUIの有効無効を設定する();
\r
3382 //-----------------
\r
3386 // Undo 用に値を保管しておく。
\r
3388 this.numericUpDownBPM_以前の値 = this.numericUpDownBPM.Value;
\r
3393 CUndoRedo管理.bUndoRedoした直後 = false;
\r
3396 private void numericUpDownBPM_Leave( object sender, EventArgs e )
\r
3398 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();
\r
3400 if( oセル仮想 != null )
\r
3401 oセル仮想.t所有権の放棄( this.numericUpDownBPM );
\r
3403 private void numericUpDownBPM_Undo( decimal dec変更前, decimal dec変更後 )
\r
3407 this.tタブを選択する( Eタブ種別.基本情報 );
\r
3409 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
3410 this.numericUpDownBPM.Value = dec変更前;
\r
3412 this.numericUpDownBPM.Focus();
\r
3414 private void numericUpDownBPM_Redo( decimal dec変更前, decimal dec変更後 )
\r
3418 this.tタブを選択する( Eタブ種別.基本情報 );
\r
3420 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
3421 this.numericUpDownBPM.Value = dec変更後;
\r
3423 this.numericUpDownBPM.Focus();
\r
3427 #region [ DLEVEL ]
\r
3428 private int nDLEVEL_以前の値 = 50;
\r
3429 private void textBoxDLEVEL_TextChanged( object sender, EventArgs e )
\r
3431 // 何もしない。→ 数字以外が入力されていることもあるため、Leaveまで待つ。
\r
3433 private void textBoxDLEVEL_Leave( object sender, EventArgs e )
\r
3435 if( this.textBoxDLEVEL.Text.Length > 0 )
\r
3440 if( !int.TryParse( this.textBoxDLEVEL.Text, out n値 ) )
\r
3448 else if( n値 > 100 )
\r
3454 // 値を水平スクロールバーにも反映。
\r
3456 if( this.hScrollBarDLEVEL.Value != n値 )
\r
3458 this.t次のプロパティ変更処理がUndoRedoリストに載るようにする();
\r
3459 this.hScrollBarDLEVEL.Value = n値; // ここで hScrollBarDLEVEL_ValueChanged が発動 → UndoRedo処理はそちらで。
\r
3463 private void hScrollBarDLEVEL_ValueChanged( object sender, EventArgs e )
\r
3465 // 値をテキストボックスにも反映。
\r
3467 this.textBoxDLEVEL.Text = this.hScrollBarDLEVEL.Value.ToString();
\r
3470 // Undo/Redo リストを修正。
\r
3472 #region [ Undo/Redo リストを修正する。]
\r
3473 //-----------------
\r
3474 if( !CUndoRedo管理.bUndoRedoした直後 )
\r
3476 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();
\r
3478 if( oセル仮想 != null && oセル仮想.b所有権がある( this.hScrollBarDLEVEL ) )
\r
3482 ( (CUndoRedoセル<int>) oセル仮想 ).変更後の値 = this.hScrollBarDLEVEL.Value;
\r
3488 this.mgrUndoRedo管理者.tノードを追加する(
\r
3489 new CUndoRedoセル<int>(
\r
3490 this.hScrollBarDLEVEL,
\r
3491 new DGUndoを実行する<int>( this.nDLEVEL_Undo ),
\r
3492 new DGRedoを実行する<int>( this.nDLEVEL_Redo ),
\r
3493 this.nDLEVEL_以前の値, this.hScrollBarDLEVEL.Value ) );
\r
3496 // Undo ボタンを有効にする。
\r
3498 this.tUndoRedo用GUIの有効無効を設定する();
\r
3501 //-----------------
\r
3505 // Undo 用に値を保管しておく。
\r
3507 this.nDLEVEL_以前の値 = this.hScrollBarDLEVEL.Value;
\r
3512 CUndoRedo管理.bUndoRedoした直後 = false;
\r
3515 private void nDLEVEL_Undo( int n変更前, int n変更後 )
\r
3519 this.tタブを選択する( Eタブ種別.基本情報 );
\r
3521 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
3522 this.textBoxDLEVEL.Text = n変更前.ToString();
\r
3524 this.textBoxDLEVEL.Focus();
\r
3527 // 値を水平スクロールバーにも反映。
\r
3529 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
3530 this.hScrollBarDLEVEL.Value = n変更前;
\r
3532 private void nDLEVEL_Redo( int n変更前, int n変更後 )
\r
3536 this.tタブを選択する( Eタブ種別.基本情報 );
\r
3538 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
3539 this.textBoxDLEVEL.Text = n変更後.ToString();
\r
3541 this.textBoxDLEVEL.Focus();
\r
3544 // 値を水平スクロールバーにも反映。
\r
3546 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
3547 this.hScrollBarDLEVEL.Value = n変更後;
\r
3550 #region [ GLEVEL ]
\r
3551 private int nGLEVEL_以前の値;
\r
3552 private void textBoxGLEVEL_TextChanged( object sender, EventArgs e )
\r
3554 // 何もしない。→ 数字以外が入力されていることもあるため、Leaveまで待つ。
\r
3556 private void textBoxGLEVEL_Leave( object sender, EventArgs e )
\r
3558 if( this.textBoxGLEVEL.Text.Length > 0 )
\r
3563 if( !int.TryParse( this.textBoxGLEVEL.Text, out n値 ) )
\r
3571 else if( n値 > 100 )
\r
3577 // 値を水平スクロールバーにも反映。
\r
3579 if( this.hScrollBarGLEVEL.Value != n値 )
\r
3581 this.t次のプロパティ変更処理がUndoRedoリストに載るようにする();
\r
3582 this.hScrollBarGLEVEL.Value = n値; // ここで hScrollBarGLEVEL_ValueChanged が発動 → UndoRedo処理はそちらで。
\r
3586 private void hScrollBarGLEVEL_ValueChanged( object sender, EventArgs e )
\r
3588 // 値をテキストボックスにも反映。
\r
3590 this.textBoxGLEVEL.Text = this.hScrollBarGLEVEL.Value.ToString();
\r
3592 // Undo/Redo リストを修正。
\r
3594 #region [ Undo/Redo リストを修正する。]
\r
3595 //-----------------
\r
3596 if( !CUndoRedo管理.bUndoRedoした直後 )
\r
3598 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();
\r
3600 if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.hScrollBarGLEVEL ) )
\r
3604 ( (CUndoRedoセル<int>) oセル仮想 ).変更後の値 = this.hScrollBarGLEVEL.Value;
\r
3610 this.mgrUndoRedo管理者.tノードを追加する(
\r
3611 new CUndoRedoセル<int>(
\r
3612 this.hScrollBarGLEVEL,
\r
3613 new DGUndoを実行する<int>( this.nGLEVEL_Undo ),
\r
3614 new DGRedoを実行する<int>( this.nGLEVEL_Redo ),
\r
3615 this.nGLEVEL_以前の値, this.hScrollBarGLEVEL.Value ) );
\r
3618 // Undo ボタンを有効にする。
\r
3620 this.tUndoRedo用GUIの有効無効を設定する();
\r
3623 //-----------------
\r
3627 // Undo 用に値を保管しておく。
\r
3629 this.nGLEVEL_以前の値 = this.hScrollBarGLEVEL.Value;
\r
3634 CUndoRedo管理.bUndoRedoした直後 = false;
\r
3637 private void nGLEVEL_Undo( int n変更前, int n変更後 )
\r
3641 this.tタブを選択する( Eタブ種別.基本情報 );
\r
3643 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
3644 this.textBoxGLEVEL.Text = n変更前.ToString();
\r
3646 this.textBoxGLEVEL.Focus();
\r
3649 // 値を水平スクロールバーにも反映する。
\r
3651 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
3652 this.hScrollBarGLEVEL.Value = n変更前;
\r
3654 private void nGLEVEL_Redo( int n変更前, int n変更後 )
\r
3658 this.tタブを選択する( Eタブ種別.基本情報 );
\r
3660 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
3661 this.textBoxGLEVEL.Text = n変更後.ToString();
\r
3663 this.textBoxGLEVEL.Focus();
\r
3666 // 値を水平スクロールバーにも反映する。
\r
3668 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
3669 this.hScrollBarGLEVEL.Value = n変更後;
\r
3672 #region [ BLEVEL ]
\r
3673 private int nBLEVEL_以前の値;
\r
3674 private void textBoxBLEVEL_TextChanged( object sender, EventArgs e )
\r
3676 // 何もしない。→ 数字以外が入力されていることもあるため、Leaveまで待つ。
\r
3678 private void textBoxBLEVEL_Leave( object sender, EventArgs e )
\r
3680 if( this.textBoxBLEVEL.Text.Length > 0 )
\r
3685 if( !int.TryParse( this.textBoxBLEVEL.Text, out n値 ) )
\r
3693 else if( n値 > 100 )
\r
3699 // 値を水平スクロールバーにも反映。
\r
3701 if( this.hScrollBarBLEVEL.Value != n値 )
\r
3703 this.t次のプロパティ変更処理がUndoRedoリストに載るようにする();
\r
3704 this.hScrollBarBLEVEL.Value = n値; // ここで hScrollBarBLEVEL_ValueChanged が発動 → UndoRedo処理はそちらで。
\r
3708 private void hScrollBarBLEVEL_ValueChanged( object sender, EventArgs e )
\r
3710 // 値をテキストボックスにも反映。
\r
3712 this.textBoxBLEVEL.Text = this.hScrollBarBLEVEL.Value.ToString();
\r
3715 // Undo/Redo リストを修正。
\r
3717 #region [ Undo/Redo リストを修正する。]
\r
3718 //-----------------
\r
3719 if( !CUndoRedo管理.bUndoRedoした直後 )
\r
3721 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();
\r
3723 if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.hScrollBarBLEVEL ) )
\r
3727 ( (CUndoRedoセル<int>) oセル仮想 ).変更後の値 = this.hScrollBarBLEVEL.Value;
\r
3733 this.mgrUndoRedo管理者.tノードを追加する(
\r
3734 new CUndoRedoセル<int>(
\r
3735 this.hScrollBarBLEVEL,
\r
3736 new DGUndoを実行する<int>( this.nBLEVEL_Undo ),
\r
3737 new DGRedoを実行する<int>( this.nBLEVEL_Redo ),
\r
3738 this.nBLEVEL_以前の値, this.hScrollBarBLEVEL.Value ) );
\r
3741 // Undo ボタンを有効にする。
\r
3743 this.tUndoRedo用GUIの有効無効を設定する();
\r
3746 //-----------------
\r
3750 // Undo 用に値を保管しておく。
\r
3752 this.nBLEVEL_以前の値 = this.hScrollBarBLEVEL.Value;
\r
3757 CUndoRedo管理.bUndoRedoした直後 = false;
\r
3760 private void nBLEVEL_Undo( int n変更前, int n変更後 )
\r
3764 this.tタブを選択する( Eタブ種別.基本情報 );
\r
3766 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
3767 this.textBoxBLEVEL.Text = n変更前.ToString();
\r
3769 this.textBoxBLEVEL.Focus();
\r
3772 // 値を水平スクロールバーにも反映。
\r
3774 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
3775 this.hScrollBarBLEVEL.Value = n変更前;
\r
3777 private void nBLEVEL_Redo( int n変更前, int n変更後 )
\r
3781 this.tタブを選択する( Eタブ種別.基本情報 );
\r
3783 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
3784 this.textBoxBLEVEL.Text = n変更後.ToString();
\r
3786 this.textBoxBLEVEL.Focus();
\r
3789 // 値を水平スクロールバーにも反映。
\r
3791 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
3792 this.hScrollBarBLEVEL.Value = n変更後;
\r
3797 private string textBoxパネル_以前の値 = "";
\r
3798 private void textBoxパネル_TextChanged( object sender, EventArgs e )
\r
3800 // Undo/Redo リストを修正。
\r
3802 #region [ Undo/Redo リストを修正する。]
\r
3803 //-----------------
\r
3804 if( !CUndoRedo管理.bUndoRedoした直後 )
\r
3806 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();
\r
3808 if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBoxパネル ) )
\r
3812 ( (CUndoRedoセル<string>) oセル仮想 ).変更後の値 = this.textBoxパネル.Text;
\r
3818 this.mgrUndoRedo管理者.tノードを追加する(
\r
3819 new CUndoRedoセル<string>(
\r
3821 new DGUndoを実行する<string>( this.textBoxパネル_Undo ),
\r
3822 new DGRedoを実行する<string>( this.textBoxパネル_Redo ),
\r
3823 this.textBoxパネル_以前の値, this.textBoxパネル.Text ) );
\r
3828 this.tUndoRedo用GUIの有効無効を設定する();
\r
3831 //-----------------
\r
3835 // Undo 用に値を保管しておく。
\r
3837 this.textBoxパネル_以前の値 = this.textBoxパネル.Text;
\r
3842 CUndoRedo管理.bUndoRedoした直後 = false;
\r
3845 private void textBoxパネル_Leave( object sender, EventArgs e )
\r
3847 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();
\r
3849 if( oセル仮想 != null )
\r
3850 oセル仮想.t所有権の放棄( this.textBoxパネル );
\r
3852 private void textBoxパネル_Undo( string str変更前, string str変更後 )
\r
3856 this.tタブを選択する( Eタブ種別.基本情報 );
\r
3858 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
3859 this.textBoxパネル.Text = str変更前;
\r
3861 this.textBoxパネル.Focus();
\r
3863 private void textBoxパネル_Redo( string str変更前, string str変更後 )
\r
3867 this.tタブを選択する( Eタブ種別.基本情報 );
\r
3869 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
3870 this.textBoxパネル.Text = str変更後;
\r
3872 this.textBoxパネル.Focus();
\r
3875 #region [ PREVIEW ]
\r
3876 private string textBoxPREVIEW_以前の値 = "";
\r
3877 private void textBoxPREVIEW_TextChanged( object sender, EventArgs e )
\r
3879 // Undo/Redo リストを修正。
\r
3881 #region [ Undo/Redo リストを修正する。]
\r
3882 //-----------------
\r
3883 if( !CUndoRedo管理.bUndoRedoした直後 )
\r
3885 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();
\r
3887 if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBoxPREVIEW ) )
\r
3891 ( (CUndoRedoセル<string>) oセル仮想 ).変更後の値 = this.textBoxPREVIEW.Text;
\r
3897 this.mgrUndoRedo管理者.tノードを追加する(
\r
3898 new CUndoRedoセル<string>(
\r
3899 this.textBoxPREVIEW,
\r
3900 new DGUndoを実行する<string>( this.textBoxPREVIEW_Undo ),
\r
3901 new DGRedoを実行する<string>( this.textBoxPREVIEW_Redo ),
\r
3902 this.textBoxPREVIEW_以前の値, this.textBoxPREVIEW.Text ) );
\r
3905 // Undo ボタンを有効にする。
\r
3907 this.tUndoRedo用GUIの有効無効を設定する();
\r
3910 //-----------------
\r
3914 // Undo 用に値を保管しておく。
\r
3916 this.textBoxPREVIEW_以前の値 = this.textBoxPREVIEW.Text;
\r
3921 CUndoRedo管理.bUndoRedoした直後 = false;
\r
3924 private void textBoxPREVIEW_Leave( object sender, EventArgs e )
\r
3926 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();
\r
3928 if( oセル仮想 != null )
\r
3929 oセル仮想.t所有権の放棄( this.textBoxPREVIEW );
\r
3931 private void textBoxPREVIEW_Undo( string str変更前, string str変更後 )
\r
3935 this.tタブを選択する( Eタブ種別.基本情報 );
\r
3937 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
3938 this.textBoxPREVIEW.Text = str変更前;
\r
3940 this.textBoxPREVIEW.Focus();
\r
3942 private void textBoxPREVIEW_Redo( string str変更前, string str変更後 )
\r
3946 this.tタブを選択する( Eタブ種別.基本情報 );
\r
3948 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
3949 this.textBoxPREVIEW.Text = str変更後;
\r
3951 this.textBoxPREVIEW.Focus();
\r
3954 #region [ PREIMAGE ]
\r
3955 private string textBoxPREIMAGE_以前の値 = "";
\r
3956 private void textBoxPREIMAGE_TextChanged( object sender, EventArgs e )
\r
3958 // Undo/Redo リストを修正。
\r
3960 #region [ Undo/Redo リストを修正する。]
\r
3961 //-----------------
\r
3962 if( !CUndoRedo管理.bUndoRedoした直後 )
\r
3964 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();
\r
3966 if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBoxPREIMAGE ) )
\r
3970 ( (CUndoRedoセル<string>) oセル仮想 ).変更後の値 = this.textBoxPREIMAGE.Text;
\r
3976 this.mgrUndoRedo管理者.tノードを追加する(
\r
3977 new CUndoRedoセル<string>(
\r
3978 this.textBoxPREIMAGE,
\r
3979 new DGUndoを実行する<string>( this.textBoxPREIMAGE_Undo ),
\r
3980 new DGRedoを実行する<string>( this.textBoxPREIMAGE_Redo ),
\r
3981 this.textBoxPREIMAGE_以前の値, this.textBoxPREIMAGE.Text ) );
\r
3984 // Undo ボタンを有効にする。
\r
3986 this.tUndoRedo用GUIの有効無効を設定する();
\r
3989 //-----------------
\r
3993 // Undo用に値を保管しておく。]
\r
3995 this.textBoxPREIMAGE_以前の値 = this.textBoxPREIMAGE.Text;
\r
4000 CUndoRedo管理.bUndoRedoした直後 = false;
\r
4003 private void textBoxPREIMAGE_Leave( object sender, EventArgs e )
\r
4005 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();
\r
4007 if( oセル仮想 != null )
\r
4008 oセル仮想.t所有権の放棄( this.textBoxPREIMAGE );
\r
4010 private void textBoxPREIMAGE_Undo( string str変更前, string str変更後 )
\r
4014 this.tタブを選択する( Eタブ種別.基本情報 );
\r
4016 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
4017 this.textBoxPREIMAGE.Text = str変更前;
\r
4019 this.textBoxPREIMAGE.Focus();
\r
4021 private void textBoxPREIMAGE_Redo( string str変更前, string str変更後 )
\r
4025 this.tタブを選択する( Eタブ種別.基本情報 );
\r
4027 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
4028 this.textBoxPREIMAGE.Text = str変更後;
\r
4030 this.textBoxPREIMAGE.Focus();
\r
4033 #region [ STAGEFILE ]
\r
4034 private string textBoxSTAGEFILE_以前の値 = "";
\r
4035 private void textBoxSTAGEFILE_TextChanged( object sender, EventArgs e )
\r
4037 // Undo/Redo リストを修正。
\r
4039 #region [ Undo/Redo リストを修正する。]
\r
4040 //-----------------
\r
4041 if( !CUndoRedo管理.bUndoRedoした直後 )
\r
4043 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();
\r
4045 if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBoxSTAGEFILE ) )
\r
4049 ( (CUndoRedoセル<string>) oセル仮想 ).変更後の値 = this.textBoxSTAGEFILE.Text;
\r
4055 this.mgrUndoRedo管理者.tノードを追加する(
\r
4056 new CUndoRedoセル<string>(
\r
4057 this.textBoxSTAGEFILE,
\r
4058 new DGUndoを実行する<string>( this.textBoxSTAGEFILE_Undo ),
\r
4059 new DGRedoを実行する<string>( this.textBoxSTAGEFILE_Redo ),
\r
4060 this.textBoxSTAGEFILE_以前の値, this.textBoxSTAGEFILE.Text ) );
\r
4063 // Undo ボタンを有効にする。
\r
4065 this.tUndoRedo用GUIの有効無効を設定する();
\r
4068 //-----------------
\r
4072 // Undo 用に値を保管しておく。
\r
4074 this.textBoxSTAGEFILE_以前の値 = this.textBoxSTAGEFILE.Text;
\r
4079 CUndoRedo管理.bUndoRedoした直後 = false;
\r
4082 private void textBoxSTAGEFILE_Leave( object sender, EventArgs e )
\r
4084 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();
\r
4086 if( oセル仮想 != null )
\r
4087 oセル仮想.t所有権の放棄( this.textBoxSTAGEFILE );
\r
4089 private void textBoxSTAGEFILE_Undo( string str変更前, string str変更後 )
\r
4093 this.tタブを選択する( Eタブ種別.基本情報 );
\r
4095 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
4096 this.textBoxSTAGEFILE.Text = str変更前;
\r
4098 this.textBoxSTAGEFILE.Focus();
\r
4100 private void textBoxSTAGEFILE_Redo( string str変更前, string str変更後 )
\r
4104 this.tタブを選択する( Eタブ種別.基本情報 );
\r
4106 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
4107 this.textBoxSTAGEFILE.Text = str変更後;
\r
4109 this.textBoxSTAGEFILE.Focus();
\r
4112 #region [ BACKGROUND ]
\r
4113 private string textBoxBACKGROUND_以前の値 = "";
\r
4114 private void textBoxBACKGROUND_TextChanged( object sender, EventArgs e )
\r
4116 // Undo/Redo リストを修正。
\r
4118 #region [ Undo/Redo リストを修正する。]
\r
4119 //-----------------
\r
4120 if( !CUndoRedo管理.bUndoRedoした直後 )
\r
4122 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();
\r
4124 if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBoxBACKGROUND ) )
\r
4128 ( (CUndoRedoセル<string>) oセル仮想 ).変更後の値 = this.textBoxBACKGROUND.Text;
\r
4134 this.mgrUndoRedo管理者.tノードを追加する(
\r
4135 new CUndoRedoセル<string>(
\r
4136 this.textBoxBACKGROUND,
\r
4137 new DGUndoを実行する<string>( this.textBoxBACKGROUND_Undo ),
\r
4138 new DGRedoを実行する<string>( this.textBoxBACKGROUND_Redo ),
\r
4139 this.textBoxBACKGROUND_以前の値, this.textBoxBACKGROUND.Text ) );
\r
4142 // Undo ボタンを有効にする。
\r
4144 this.tUndoRedo用GUIの有効無効を設定する();
\r
4147 //-----------------
\r
4151 // Undo 用の値を保管しておく。
\r
4153 this.textBoxBACKGROUND_以前の値 = this.textBoxBACKGROUND.Text;
\r
4158 CUndoRedo管理.bUndoRedoした直後 = false;
\r
4161 private void textBoxBACKGROUND_Leave( object sender, EventArgs e )
\r
4163 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();
\r
4165 if( oセル仮想 != null )
\r
4166 oセル仮想.t所有権の放棄( this.textBoxBACKGROUND );
\r
4168 private void textBoxBACKGROUND_Undo( string str変更前, string str変更後 )
\r
4172 this.tタブを選択する( Eタブ種別.基本情報 );
\r
4174 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
4175 this.textBoxBACKGROUND.Text = str変更前;
\r
4177 this.textBoxBACKGROUND.Focus();
\r
4179 private void textBoxBACKGROUND_Redo( string str変更前, string str変更後 )
\r
4183 this.tタブを選択する( Eタブ種別.基本情報 );
\r
4185 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
4186 this.textBoxBACKGROUND.Text = str変更後;
\r
4188 this.textBoxBACKGROUND.Focus();
\r
4191 #region [ RESULTIMAGE ]
\r
4192 private string textBoxRESULTIMAGE_以前の値 = "";
\r
4193 private void textBoxRESULTIMAGE_TextChanged( object sender, EventArgs e )
\r
4195 // Undo/Redo リストを修正。
\r
4197 #region [ Undo/Redo リストを修正する。]
\r
4198 //-----------------
\r
4199 if( !CUndoRedo管理.bUndoRedoした直後 )
\r
4201 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();
\r
4203 if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBoxRESULTIMAGE ) )
\r
4207 ( (CUndoRedoセル<string>) oセル仮想 ).変更後の値 = this.textBoxRESULTIMAGE.Text;
\r
4213 this.mgrUndoRedo管理者.tノードを追加する(
\r
4214 new CUndoRedoセル<string>(
\r
4215 this.textBoxRESULTIMAGE,
\r
4216 new DGUndoを実行する<string>( this.textBoxRESULTIMAGE_Undo ),
\r
4217 new DGRedoを実行する<string>( this.textBoxRESULTIMAGE_Redo ),
\r
4218 this.textBoxRESULTIMAGE_以前の値, this.textBoxRESULTIMAGE.Text ) );
\r
4221 // Undo ボタンを有効にする。
\r
4223 this.tUndoRedo用GUIの有効無効を設定する();
\r
4226 //-----------------
\r
4230 // Undo 用に値を保管しておく。
\r
4232 this.textBoxRESULTIMAGE_以前の値 = this.textBoxRESULTIMAGE.Text;
\r
4237 CUndoRedo管理.bUndoRedoした直後 = false;
\r
4240 private void textBoxRESULTIMAGE_Leave( object sender, EventArgs e )
\r
4242 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();
\r
4244 if( oセル仮想 != null )
\r
4245 oセル仮想.t所有権の放棄( this.textBoxRESULTIMAGE );
\r
4247 private void textBoxRESULTIMAGE_Undo( string str変更前, string str変更後 )
\r
4251 this.tタブを選択する( Eタブ種別.基本情報 );
\r
4253 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
4254 this.textBoxRESULTIMAGE.Text = str変更前;
\r
4256 this.textBoxRESULTIMAGE.Focus();
\r
4258 private void textBoxRESULTIMAGE_Redo( string str変更前, string str変更後 )
\r
4262 this.tタブを選択する( Eタブ種別.基本情報 );
\r
4264 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
4265 this.textBoxRESULTIMAGE.Text = str変更後;
\r
4267 this.textBoxRESULTIMAGE.Focus();
\r
4271 #region [ PREVIEW参照ボタン ]
\r
4272 private void buttonPREVIEW参照_Click( object sender, EventArgs e )
\r
4274 string str初期フォルダ名 = this.str作業フォルダ名;
\r
4276 if( this.textBoxPREVIEW.Text.Length > 0 )
\r
4277 str初期フォルダ名 = this.strファイルの存在するディレクトリを絶対パスで返す( this.textBoxPREVIEW.Text );
\r
4279 string strファイル名 = this.tファイル選択ダイアログでファイルを選択し相対パスにして返す(
\r
4280 Resources.strプレビュー音ファイル選択ダイアログのタイトル,
\r
4281 Resources.strサウンドファイル選択ダイアログのフィルタ,
\r
4284 if( strファイル名.Length > 0 )
\r
4286 this.textBoxPREVIEW.Text = strファイル名;
\r
4291 #region [ PREIMAGE参照ボタン ]
\r
4292 private void buttonPREIMAGE参照_Click( object sender, EventArgs e )
\r
4294 string str初期フォルダ名 = this.str作業フォルダ名;
\r
4296 if( this.textBoxPREIMAGE.Text.Length > 0 )
\r
4297 str初期フォルダ名 = this.strファイルの存在するディレクトリを絶対パスで返す( this.textBoxPREIMAGE.Text );
\r
4299 string strファイル名 = this.tファイル選択ダイアログでファイルを選択し相対パスにして返す(
\r
4300 Resources.strプレビュー画像ファイル選択ダイアログのタイトル,
\r
4301 Resources.str画像ファイル選択ダイアログのフィルタ,
\r
4304 if( strファイル名.Length > 0 )
\r
4306 this.textBoxPREIMAGE.Text = strファイル名;
\r
4311 #region [ STAGEFILE参照ボタン ]
\r
4312 private void buttonSTAGEFILE参照_Click( object sender, EventArgs e )
\r
4314 string str初期フォルダ名 = this.str作業フォルダ名;
\r
4316 if( this.textBoxSTAGEFILE.Text.Length > 0 )
\r
4317 str初期フォルダ名 = this.strファイルの存在するディレクトリを絶対パスで返す( this.textBoxSTAGEFILE.Text );
\r
4319 string strファイル名 = this.tファイル選択ダイアログでファイルを選択し相対パスにして返す(
\r
4320 Resources.strステージ画像ファイル選択ダイアログのタイトル,
\r
4321 Resources.str画像ファイル選択ダイアログのフィルタ,
\r
4324 if( strファイル名.Length > 0 )
\r
4326 this.textBoxSTAGEFILE.Text = strファイル名;
\r
4331 #region [ BACKGROUND参照ボタン ]
\r
4332 private void buttonBACKGROUND参照_Click( object sender, EventArgs e )
\r
4334 string str初期フォルダ名 = this.str作業フォルダ名;
\r
4336 if( this.textBoxBACKGROUND.Text.Length > 0 )
\r
4337 str初期フォルダ名 = this.strファイルの存在するディレクトリを絶対パスで返す( this.textBoxBACKGROUND.Text );
\r
4339 string strファイル名 = this.tファイル選択ダイアログでファイルを選択し相対パスにして返す(
\r
4340 Resources.str背景画像ファイル選択ダイアログのタイトル,
\r
4341 Resources.str画像ファイル選択ダイアログのフィルタ,
\r
4344 if( strファイル名.Length > 0 )
\r
4346 this.textBoxBACKGROUND.Text = strファイル名;
\r
4351 #region [ RESULTIMAGE参照ボタン ]
\r
4352 private void buttonRESULTIMAGE参照_Click( object sender, EventArgs e )
\r
4354 string str初期フォルダ名 = this.str作業フォルダ名;
\r
4356 if( this.textBoxRESULTIMAGE.Text.Length > 0 )
\r
4357 str初期フォルダ名 = this.strファイルの存在するディレクトリを絶対パスで返す( this.textBoxRESULTIMAGE.Text );
\r
4359 string strファイル名 = this.tファイル選択ダイアログでファイルを選択し相対パスにして返す(
\r
4360 Resources.str結果画像ファイル選択ダイアログのタイトル,
\r
4361 Resources.str画像ファイル選択ダイアログのフィルタ,
\r
4364 if( strファイル名.Length > 0 )
\r
4366 this.textBoxRESULTIMAGE.Text = strファイル名;
\r
4371 #region [ Use 556 x 710 BGA/AVI ]
\r
4372 private bool check556x710BGAAVI_以前の値 = false;
\r
4373 private void check556x710BGAAVI_CheckedChanged(object sender, EventArgs e)
\r
4375 // Undo/Redo リストを修正する。
\r
4377 #region [ Undo/Redo リストを修正。]
\r
4378 //-----------------
\r
4379 if (!CUndoRedo管理.bUndoRedoした直後)
\r
4381 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();
\r
4383 if ((oセル仮想 != null) && oセル仮想.b所有権がある(this.check556x710BGAAVI))
\r
4387 ((CUndoRedoセル<bool>)oセル仮想).変更後の値 = this.check556x710BGAAVI.Checked;
\r
4393 this.mgrUndoRedo管理者.tノードを追加する(
\r
4394 new CUndoRedoセル<bool>(
\r
4395 this.check556x710BGAAVI.Checked,
\r
4396 new DGUndoを実行する<bool>(this.check556x710BGAAVI_Undo),
\r
4397 new DGRedoを実行する<bool>(this.check556x710BGAAVI_Redo),
\r
4398 this.check556x710BGAAVI_以前の値, this.check556x710BGAAVI.Checked));
\r
4400 // Undo ボタンを有効にする。
\r
4402 this.tUndoRedo用GUIの有効無効を設定する();
\r
4405 //-----------------
\r
4409 // Undo 用に値を保管しておく。
\r
4411 this.check556x710BGAAVI_以前の値 = this.check556x710BGAAVI.Checked;
\r
4416 CUndoRedo管理.bUndoRedoした直後 = false;
\r
4419 private void check556x710BGAAVI_Leave(object sender, EventArgs e)
\r
4421 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();
\r
4423 if (oセル仮想 != null)
\r
4424 oセル仮想.t所有権の放棄(this.check556x710BGAAVI);
\r
4426 private void check556x710BGAAVI_Undo(bool b変更前, bool b変更後)
\r
4430 this.tタブを選択する(Eタブ種別.基本情報);
\r
4432 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
4433 this.check556x710BGAAVI.Checked = b変更前;
\r
4435 this.check556x710BGAAVI.Focus();
\r
4437 private void check556x710BGAAVI_Redo(bool b変更前, bool b変更後)
\r
4441 this.tタブを選択する(Eタブ種別.基本情報);
\r
4443 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
4444 this.check556x710BGAAVI.Checked = b変更後;
\r
4446 this.check556x710BGAAVI.Focus();
\r
4449 //-----------------
\r
4451 #region [ GUIイベント:WAVリスト関連 ]
\r
4452 //-----------------
\r
4453 private void listViewWAVリスト_Click( object sender, EventArgs e )
\r
4455 #region [ プレビュー音を再生する。]
\r
4456 //-----------------
\r
4457 if( this.listViewWAVリスト.SelectedIndices.Count > 0 && this.toolStripButtonWAVリストプレビュースイッチ.Checked )
\r
4459 ListViewItem item = this.listViewWAVリスト.Items[ this.listViewWAVリスト.SelectedIndices[ 0 ] ];
\r
4460 this.mgrWAVリスト管理者.tプレビュー音を再生する( C変換.n36進数2桁の文字列を数値に変換して返す( item.SubItems[ 1 ].Text ) );
\r
4462 //-----------------
\r
4465 private void listViewWAVリスト_DoubleClick( object sender, EventArgs e )
\r
4467 #region [ サウンドプロパティを開いて編集する。]
\r
4468 //-----------------
\r
4469 if( this.mgrWAVリスト管理者.n現在選択中のItem番号0to1294 < 0 )
\r
4470 return; // 選択されていない
\r
4472 this.mgrWAVリスト管理者.tサウンドプロパティを開いて編集する( this.mgrWAVリスト管理者.n現在選択中のItem番号0to1294 + 1, this.str作業フォルダ名 );
\r
4473 //-----------------
\r
4476 private void listViewWAVリスト_ItemDrag( object sender, ItemDragEventArgs e )
\r
4478 #region [ CWAVデータをDragDrop用データに格納し、DoDragDrop()を呼び出す。]
\r
4479 //-----------------
\r
4480 var item = (ListViewItem) e.Item;
\r
4482 var data = new Cチップパレット向けDragDropデータ() {
\r
4484 strラベル名 = item.SubItems[ 0 ].Text,
\r
4485 n番号1to1295 = C変換.n36進数2桁の文字列を数値に変換して返す( item.SubItems[ 1 ].Text ),
\r
4486 strファイル名 = item.SubItems[ 2 ].Text,
\r
4487 col文字色 = item.ForeColor,
\r
4488 col背景色 = item.BackColor,
\r
4491 this.DoDragDrop( data, DragDropEffects.Copy );
\r
4493 //-----------------
\r
4496 private void listViewWAVリスト_KeyPress( object sender, KeyPressEventArgs e )
\r
4498 #region [ ENTER が押下されたら、サウンドプロパティを開いて編集する。]
\r
4499 //-----------------
\r
4500 if( e.KeyChar == (char) Keys.Return )
\r
4502 if( this.mgrWAVリスト管理者.n現在選択中のItem番号0to1294 < 0 )
\r
4503 return; // 選択されていない
\r
4505 this.mgrWAVリスト管理者.tサウンドプロパティを開いて編集する( this.mgrWAVリスト管理者.n現在選択中のItem番号0to1294 + 1, this.str作業フォルダ名 );
\r
4507 //-----------------
\r
4510 private void listViewWAVリスト_MouseEnter( object sender, EventArgs e )
\r
4512 #region [ WAVリストにフォーカスを移動する。]
\r
4513 //-----------------
\r
4514 if( this.appアプリ設定.AutoFocus )
\r
4515 this.mgrWAVリスト管理者.tWAVリストにフォーカスを当てる();
\r
4516 //-----------------
\r
4519 private void listViewWAVリスト_RetrieveVirtualItem( object sender, RetrieveVirtualItemEventArgs e )
\r
4521 e.Item = this.mgrWAVリスト管理者.tCWAVとListViewItemを生成して返す( e.ItemIndex + 1 );
\r
4523 private void listViewWAVリスト_SelectedIndexChanged( object sender, EventArgs e )
\r
4525 #region [ WAV, BMP, AVI のカーソルを、選択された行に全部合わせる。]
\r
4526 //-----------------
\r
4527 if( this.listViewWAVリスト.SelectedIndices.Count > 0 )
\r
4528 this.tWAV_BMP_AVIリストのカーソルを全部同じ行に合わせる( this.listViewWAVリスト.SelectedIndices[ 0 ] );
\r
4529 //-----------------
\r
4533 private void toolStripButtonWAVリストプレビュースイッチ_CheckStateChanged( object sender, EventArgs e )
\r
4535 #region [ 再生ボタンと停止ボタンの有効・無効を設定する。]
\r
4536 //-----------------
\r
4537 bool b再生有効 = ( this.toolStripButtonWAVリストプレビュースイッチ.CheckState == CheckState.Checked ) ? true : false;
\r
4538 this.toolStripButtonWAVリストプレビュー再生開始.Enabled = b再生有効;
\r
4539 this.toolStripButtonWAVリストプレビュー再生停止.Enabled = b再生有効;
\r
4540 //-----------------
\r
4543 #region [ 無効かつ再生中ならプレビュー音を停止する。]
\r
4544 //-----------------
\r
4546 this.mgrWAVリスト管理者.tプレビュー音を停止する();
\r
4547 //-----------------
\r
4550 private void toolStripButtonWAVリストプレビュー再生開始_Click( object sender, EventArgs e )
\r
4552 #region [ 現在選択中のWAVのプレビュー音を再生する。]
\r
4553 //-----------------
\r
4554 if( this.listViewWAVリスト.SelectedIndices.Count <= 0 )
\r
4555 return; // 選択されてない
\r
4557 bool b再生有効 = ( this.toolStripButtonWAVリストプレビュースイッチ.CheckState == CheckState.Checked ) ? true : false;
\r
4561 int nWAV番号1to1295 = this.mgrWAVリスト管理者.n現在選択中のItem番号0to1294 + 1;
\r
4562 this.mgrWAVリスト管理者.tプレビュー音を再生する( nWAV番号1to1295 );
\r
4564 //-----------------
\r
4567 private void toolStripButtonWAVリストプレビュー再生停止_Click( object sender, EventArgs e )
\r
4569 this.mgrWAVリスト管理者.tプレビュー音を停止する();
\r
4571 private void toolStripButtonWAVリスト上移動_Click( object sender, EventArgs e )
\r
4573 #region [ 上の行とWAVを交換する。]
\r
4574 //-----------------
\r
4575 if( this.listViewWAVリスト.SelectedIndices.Count <= 0 )
\r
4576 return; // 選択されていない
\r
4578 int n選択されたItem番号0to1294 = this.listViewWAVリスト.SelectedIndices[ 0 ];
\r
4580 if( n選択されたItem番号0to1294 == 0 )
\r
4581 return; // 最上行なので無視
\r
4583 this.mgrWAVリスト管理者.tItemを交換する( n選択されたItem番号0to1294, n選択されたItem番号0to1294 - 1 );
\r
4584 //-----------------
\r
4587 private void toolStripButtonWAVリスト下移動_Click( object sender, EventArgs e )
\r
4589 if( this.listViewWAVリスト.SelectedIndices.Count <= 0 )
\r
4590 return; // 選択されていない
\r
4592 int n選択されたItem番号0to1294 = this.listViewWAVリスト.SelectedIndices[ 0 ];
\r
4594 if( n選択されたItem番号0to1294 >= 1294 )
\r
4595 return; // 最下行なので無視
\r
4597 this.mgrWAVリスト管理者.tItemを交換する( n選択されたItem番号0to1294, n選択されたItem番号0to1294 + 1 );
\r
4599 //-----------------
\r
4601 #region [ GUIイベント:BMPリスト関連 ]
\r
4602 //-----------------
\r
4603 private void listViewBMPリスト_Click( object sender, EventArgs e )
\r
4607 private void listViewBMPリスト_DoubleClick( object sender, EventArgs e )
\r
4609 #region [ 画像プロパティを開いて編集する。]
\r
4610 //-----------------
\r
4611 if( this.mgrBMPリスト管理者.n現在選択中のItem番号0to1294 < 0 )
\r
4612 return; // 選択されていない
\r
4614 this.mgrBMPリスト管理者.t画像プロパティを開いて編集する( this.mgrBMPリスト管理者.n現在選択中のItem番号0to1294 + 1, this.str作業フォルダ名 );
\r
4615 //-----------------
\r
4618 private void listViewBMPリスト_ItemDrag( object sender, ItemDragEventArgs e )
\r
4620 #region [ CBMPデータをDragDrop用データに格納し、DoDragDrop()を呼び出す。]
\r
4621 //-----------------
\r
4622 var item = (ListViewItem) e.Item;
\r
4624 var data = new Cチップパレット向けDragDropデータ() {
\r
4626 strラベル名 = item.SubItems[ 1 ].Text,
\r
4627 n番号1to1295 = C変換.n36進数2桁の文字列を数値に変換して返す( item.SubItems[ 2 ].Text ),
\r
4628 strファイル名 = item.SubItems[ 3 ].Text,
\r
4629 col文字色 = item.ForeColor,
\r
4630 col背景色 = item.BackColor,
\r
4633 this.DoDragDrop( data, DragDropEffects.Copy );
\r
4634 //-----------------
\r
4637 private void listViewBMPリスト_KeyPress( object sender, KeyPressEventArgs e )
\r
4639 #region [ ENTER が押下されたら、画像プロパティを開いて編集する。]
\r
4640 //-----------------
\r
4641 if( e.KeyChar == (char) Keys.Return )
\r
4643 if( this.mgrBMPリスト管理者.n現在選択中のItem番号0to1294 < 0 )
\r
4644 return; // 選択されていない
\r
4646 this.mgrBMPリスト管理者.t画像プロパティを開いて編集する( this.mgrBMPリスト管理者.n現在選択中のItem番号0to1294 + 1, this.str作業フォルダ名 );
\r
4648 //-----------------
\r
4651 private void listViewBMPリスト_MouseEnter( object sender, EventArgs e )
\r
4653 #region [ BMPリストにフォーカスを移動する。]
\r
4654 //-----------------
\r
4655 if( this.appアプリ設定.AutoFocus )
\r
4656 this.mgrBMPリスト管理者.tBMPリストにフォーカスを当てる();
\r
4657 //-----------------
\r
4660 private void listViewBMPリスト_RetrieveVirtualItem( object sender, RetrieveVirtualItemEventArgs e )
\r
4662 e.Item = this.mgrBMPリスト管理者.tCBMPとListViewItemを生成して返す( e.ItemIndex + 1 );
\r
4664 private void listViewBMPリスト_SelectedIndexChanged( object sender, EventArgs e )
\r
4666 #region [ WAV, BMP, AVI のカーソルを、選択された行に全部合わせる。]
\r
4667 //-----------------
\r
4668 if( this.listViewBMPリスト.SelectedIndices.Count > 0 )
\r
4669 this.tWAV_BMP_AVIリストのカーソルを全部同じ行に合わせる( this.listViewBMPリスト.SelectedIndices[ 0 ] );
\r
4670 //-----------------
\r
4674 private void toolStripButtonBMPリスト上移動_Click( object sender, EventArgs e )
\r
4676 #region [ 上の行とBMPを交換する。]
\r
4677 //-----------------
\r
4678 if( this.listViewBMPリスト.SelectedIndices.Count <= 0 )
\r
4679 return; // 選択されていない
\r
4681 int n選択されたItem番号0to1294 = this.listViewBMPリスト.SelectedIndices[ 0 ];
\r
4683 if( n選択されたItem番号0to1294 != 0 )
\r
4684 this.mgrBMPリスト管理者.tItemを交換する( n選択されたItem番号0to1294, n選択されたItem番号0to1294 - 1 );
\r
4685 //-----------------
\r
4688 private void toolStripButtonBMPリスト下移動_Click( object sender, EventArgs e )
\r
4690 #region [ 下の行とBMPを交換する。]
\r
4691 //-----------------
\r
4692 if( this.listViewBMPリスト.SelectedIndices.Count <= 0 )
\r
4693 return; // 選択されていない
\r
4695 int n選択されたItem番号0to1294 = this.listViewBMPリスト.SelectedIndices[ 0 ];
\r
4697 if( n選択されたItem番号0to1294 >= 1294 )
\r
4698 return; // 最下行なので無視
\r
4700 this.mgrBMPリスト管理者.tItemを交換する( n選択されたItem番号0to1294, n選択されたItem番号0to1294 + 1 );
\r
4701 //-----------------
\r
4704 //-----------------
\r
4706 #region [ GUIイベント:AVIリスト関連 ]
\r
4707 //-----------------
\r
4708 private void listViewAVIリスト_Click( object sender, EventArgs e )
\r
4712 private void listViewAVIリスト_DoubleClick( object sender, EventArgs e )
\r
4714 #region [ 動画プロパティを開いて編集する。]
\r
4715 //-----------------
\r
4716 if( this.mgrAVIリスト管理者.n現在選択中のItem番号0to1294 < 0 )
\r
4717 return; // 選択されていない
\r
4719 this.mgrAVIリスト管理者.t動画プロパティを開いて編集する( this.mgrAVIリスト管理者.n現在選択中のItem番号0to1294 + 1, this.str作業フォルダ名 );
\r
4720 //-----------------
\r
4723 private void listViewAVIリスト_ItemDrag( object sender, ItemDragEventArgs e )
\r
4725 #region [ CAVIデータをDragDrop用データに格納してDoDragDrop()を呼び出す。]
\r
4726 //-----------------
\r
4727 var item = (ListViewItem) e.Item;
\r
4729 var data = new Cチップパレット向けDragDropデータ() {
\r
4731 strラベル名 = item.SubItems[ 0 ].Text,
\r
4732 n番号1to1295 = C変換.n36進数2桁の文字列を数値に変換して返す( item.SubItems[ 1 ].Text ),
\r
4733 strファイル名 = item.SubItems[ 2 ].Text,
\r
4734 col文字色 = item.ForeColor,
\r
4735 col背景色 = item.BackColor,
\r
4738 this.DoDragDrop( data, DragDropEffects.Copy );
\r
4739 //-----------------
\r
4742 private void listViewAVIリスト_KeyPress( object sender, KeyPressEventArgs e )
\r
4744 #region [ ENTER が押下されたら、動画プロパティを開いて編集する。]
\r
4745 //-----------------
\r
4746 if( e.KeyChar == (char) Keys.Return )
\r
4748 if( this.mgrAVIリスト管理者.n現在選択中のItem番号0to1294 < 0 )
\r
4749 return; // 選択されてない
\r
4751 this.mgrAVIリスト管理者.t動画プロパティを開いて編集する( this.mgrAVIリスト管理者.n現在選択中のItem番号0to1294 + 1, this.str作業フォルダ名 );
\r
4753 //-----------------
\r
4756 private void listViewAVIリスト_MouseEnter( object sender, EventArgs e )
\r
4758 #region [ AVIリストにフォーカスを移動する。]
\r
4759 //-----------------
\r
4760 if( this.appアプリ設定.AutoFocus )
\r
4761 this.mgrAVIリスト管理者.tAVIリストにフォーカスを当てる();
\r
4762 //-----------------
\r
4765 private void listViewAVIリスト_RetrieveVirtualItem( object sender, RetrieveVirtualItemEventArgs e )
\r
4767 e.Item = this.mgrAVIリスト管理者.tCAVIとListViewItemを生成して返す( e.ItemIndex + 1 );
\r
4769 private void listViewAVIリスト_SelectedIndexChanged( object sender, EventArgs e )
\r
4771 #region [ WAV, BMP, AVI のカーソルを、選択された行に全部合わせる。]
\r
4772 //-----------------
\r
4773 if( this.listViewAVIリスト.SelectedIndices.Count > 0 )
\r
4774 this.tWAV_BMP_AVIリストのカーソルを全部同じ行に合わせる( this.listViewAVIリスト.SelectedIndices[ 0 ] );
\r
4775 //-----------------
\r
4779 private void toolStripButtonAVIリスト上移動_Click( object sender, EventArgs e )
\r
4781 #region [ 上の行とAVIを交換する。]
\r
4782 //-----------------
\r
4783 if( this.listViewAVIリスト.SelectedIndices.Count <= 0 )
\r
4784 return; // 選択されていない
\r
4786 int n選択されたItem番号0to1294 = this.listViewAVIリスト.SelectedIndices[ 0 ];
\r
4788 if( n選択されたItem番号0to1294 == 0 )
\r
4789 return; // 最上行なので無視
\r
4791 this.mgrAVIリスト管理者.tItemを交換する( n選択されたItem番号0to1294, n選択されたItem番号0to1294 - 1 );
\r
4792 //-----------------
\r
4795 private void toolStripButtonAVIリスト下移動_Click( object sender, EventArgs e )
\r
4797 #region [ 下の行とAVIを交換する。]
\r
4798 //-----------------
\r
4799 if( this.listViewAVIリスト.SelectedIndices.Count <= 0 )
\r
4800 return; // 選択されていない
\r
4802 int n選択されたItem番号0to1294 = this.listViewAVIリスト.SelectedIndices[ 0 ];
\r
4804 if( n選択されたItem番号0to1294 >= 1294 )
\r
4805 return; // 最下行なので無視
\r
4807 this.mgrAVIリスト管理者.tItemを交換する( n選択されたItem番号0to1294, n選択されたItem番号0to1294 + 1 );
\r
4808 //-----------------
\r
4811 //-----------------
\r
4813 #region [ GUIイベント:自由入力関連 ]
\r
4814 //-----------------
\r
4815 private string textBox自由入力欄_以前の値 = "";
\r
4816 private void textBox自由入力欄_TextChanged( object sender, EventArgs e )
\r
4818 // Undo/Redo リストを修正。
\r
4820 #region [ Undo/Redo リストを修正する。]
\r
4821 //-----------------
\r
4822 if( !CUndoRedo管理.bUndoRedoした直後 )
\r
4824 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();
\r
4826 if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBox自由入力欄 ) )
\r
4830 ( (CUndoRedoセル<string>) oセル仮想 ).変更後の値 = this.textBox自由入力欄.Text;
\r
4836 this.mgrUndoRedo管理者.tノードを追加する(
\r
4837 new CUndoRedoセル<string>(
\r
4838 this.textBox自由入力欄,
\r
4839 new DGUndoを実行する<string>( this.textBox自由入力欄_Undo ),
\r
4840 new DGRedoを実行する<string>( this.textBox自由入力欄_Redo ),
\r
4841 this.textBox自由入力欄_以前の値, this.textBox自由入力欄.Text ) );
\r
4846 this.tUndoRedo用GUIの有効無効を設定する();
\r
4849 //-----------------
\r
4853 // Undo 用に値を保管しておく。
\r
4855 this.textBox自由入力欄_以前の値 = this.textBox自由入力欄.Text;
\r
4860 CUndoRedo管理.bUndoRedoした直後 = false;
\r
4863 private void textBox自由入力欄_Leave( object sender, EventArgs e )
\r
4865 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();
\r
4867 if( oセル仮想 != null )
\r
4868 oセル仮想.t所有権の放棄( this.textBox自由入力欄 );
\r
4870 private void textBox自由入力欄_Undo( string str変更前, string str変更後 )
\r
4874 this.tタブを選択する( Eタブ種別.自由入力 );
\r
4876 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
4877 this.textBox自由入力欄.Text = str変更前;
\r
4879 this.textBox自由入力欄.Focus();
\r
4881 private void textBox自由入力欄_Redo( string str変更前, string str変更後 )
\r
4885 this.tタブを選択する( Eタブ種別.自由入力 );
\r
4887 this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();
\r
4888 this.textBox自由入力欄.Text = str変更後;
\r
4890 this.textBox自由入力欄.Focus();
\r
4892 //-----------------
\r
4895 #region [ GUIイベント:メニューバー [ファイル] ]
\r
4896 //-----------------
\r
4897 private void toolStripMenuItem新規_Click( object sender, EventArgs e )
\r
4899 this.tシナリオ_新規作成();
\r
4901 private void toolStripMenuItem開く_Click( object sender, EventArgs e )
\r
4905 private void toolStripMenuItem上書き保存_Click( object sender, EventArgs e )
\r
4907 this.tシナリオ_上書き保存();
\r
4909 private void toolStripMenuItem名前を付けて保存_Click( object sender, EventArgs e )
\r
4911 this.tシナリオ_名前をつけて保存();
\r
4913 private void toolStripMenuItem終了_Click( object sender, EventArgs e )
\r
4917 private void toolStripMenuItem最近使ったファイル_Click( object sender, EventArgs e )
\r
4919 // ※このイベントハンドラに対応する「toolStripMenuItem最近使ったファイル」というアイテムはデザイナにはないので注意。
\r
4920 // this.t最近使ったファイルをFileメニューへ追加する() の中で、手動で作って追加したアイテムに対するハンドラである。
\r
4922 if( this.t未保存なら保存する() == DialogResult.Cancel )
\r
4925 this.t演奏ファイルを開いて読み込む( ( (ToolStripMenuItem) sender ).Text.Substring( 3 ) );
\r
4927 //-----------------
\r
4929 #region [ GUIイベント:メニューバー [編集] ]
\r
4930 //-----------------
\r
4931 private void toolStripMenuItemアンドゥ_Click( object sender, EventArgs e )
\r
4933 this.tシナリオ_Undoする();
\r
4935 private void toolStripMenuItemリドゥ_Click( object sender, EventArgs e )
\r
4937 this.tシナリオ_Redoする();
\r
4939 private void toolStripMenuItem切り取り_Click( object sender, EventArgs e )
\r
4941 this.tシナリオ_切り取り();
\r
4943 private void toolStripMenuItemコピー_Click( object sender, EventArgs e )
\r
4947 private void toolStripMenuItem貼り付け_Click( object sender, EventArgs e )
\r
4949 // マウスが譜面上にあるならそこから貼り付ける。
\r
4951 Point ptマウス位置 = this.pt現在のマウス位置を譜面の可視領域相対の座標dotで返す();
\r
4952 Size sz譜面の可視サイズ = this.sz譜面の可視領域の大きさdotを返す();
\r
4955 if( ( ( ptマウス位置.X < 0 ) || ( ptマウス位置.Y < 0 ) ) || ( ( ptマウス位置.X > sz譜面の可視サイズ.Width ) || ( ptマウス位置.Y > sz譜面の可視サイズ.Height ) ) )
\r
4957 // マウスが譜面上になかった → 表示領域下辺から貼り付ける
\r
4959 this.tシナリオ_貼り付け( this.mgr譜面管理者.n現在の譜面表示下辺の譜面先頭からの位置grid );
\r
4965 this.tシナリオ_貼り付け( this.mgr譜面管理者.nY座標dotが位置するgridを返す_ガイド幅単位( ptマウス位置.Y ) );
\r
4968 private void toolStripMenuItem削除_Click( object sender, EventArgs e )
\r
4972 private void toolStripMenuItemすべて選択_Click( object sender, EventArgs e )
\r
4974 // 編集モードなら強制的に選択モードにする。
\r
4976 if( this.b編集モードである )
\r
4982 this.mgr選択モード管理者.t全チップを選択する();
\r
4984 private void toolStripMenuItem選択モード_Click( object sender, EventArgs e )
\r
4988 private void toolStripMenuItem編集モード_Click( object sender, EventArgs e )
\r
4992 private void toolStripMenuItemモード切替_Click( object sender, EventArgs e )
\r
4994 if( this.b選択モードである )
\r
5003 private void toolStripMenuItem検索_Click( object sender, EventArgs e )
\r
5007 private void toolStripMenuItem置換_Click( object sender, EventArgs e )
\r
5011 //-----------------
\r
5013 #region [ GUIイベント:メニューバー [表示] ]
\r
5014 //-----------------
\r
5015 private void toolStripMenuItemチップパレット_Click( object sender, EventArgs e )
\r
5017 if( this.toolStripMenuItemチップパレット.CheckState == CheckState.Checked )
\r
5019 this.dlgチップパレット.t表示する();
\r
5023 this.dlgチップパレット.t隠す();
\r
5026 private void toolStripMenuItemガイド間隔4分_Click( object sender, EventArgs e )
\r
5028 this.tガイド間隔を変更する( 4 );
\r
5030 private void toolStripMenuItemガイド間隔8分_Click( object sender, EventArgs e )
\r
5032 this.tガイド間隔を変更する( 8 );
\r
5034 private void toolStripMenuItemガイド間隔12分_Click( object sender, EventArgs e )
\r
5036 this.tガイド間隔を変更する( 12 );
\r
5038 private void toolStripMenuItemガイド間隔16分_Click( object sender, EventArgs e )
\r
5040 this.tガイド間隔を変更する( 0x10 );
\r
5042 private void toolStripMenuItemガイド間隔24分_Click( object sender, EventArgs e )
\r
5044 this.tガイド間隔を変更する( 0x18 );
\r
5046 private void toolStripMenuItemガイド間隔32分_Click( object sender, EventArgs e )
\r
5048 this.tガイド間隔を変更する( 0x20 );
\r
5050 private void toolStripMenuItemガイド間隔48分_Click( object sender, EventArgs e )
\r
5052 this.tガイド間隔を変更する( 0x30 );
\r
5054 private void toolStripMenuItemガイド間隔64分_Click( object sender, EventArgs e )
\r
5056 this.tガイド間隔を変更する( 0x40 );
\r
5058 private void toolStripMenuItemガイド間隔フリー_Click( object sender, EventArgs e )
\r
5060 this.tガイド間隔を変更する( 0 );
\r
5062 private void toolStripMenuItemガイド間隔拡大_Click( object sender, EventArgs e )
\r
5064 switch( this.n現在のガイド間隔4to64or0 )
\r
5067 case 8: this.tガイド間隔を変更する( 4 ); break;
\r
5068 case 12: this.tガイド間隔を変更する( 8 ); break;
\r
5069 case 16: this.tガイド間隔を変更する( 12 ); break;
\r
5070 case 24: this.tガイド間隔を変更する( 16 ); break;
\r
5071 case 32: this.tガイド間隔を変更する( 24 ); break;
\r
5072 case 48: this.tガイド間隔を変更する( 32 ); break;
\r
5073 case 64: this.tガイド間隔を変更する( 48 ); break;
\r
5074 case 0: this.tガイド間隔を変更する( 64 ); break;
\r
5077 private void toolStripMenuItemガイド間隔縮小_Click( object sender, EventArgs e )
\r
5079 switch( this.n現在のガイド間隔4to64or0 )
\r
5081 case 4: this.tガイド間隔を変更する( 8 ); break;
\r
5082 case 8: this.tガイド間隔を変更する( 12 ); break;
\r
5083 case 12: this.tガイド間隔を変更する( 16 ); break;
\r
5084 case 16: this.tガイド間隔を変更する( 24 ); break;
\r
5085 case 24: this.tガイド間隔を変更する( 32 ); break;
\r
5086 case 32: this.tガイド間隔を変更する( 48 ); break;
\r
5087 case 48: this.tガイド間隔を変更する( 64 ); break;
\r
5088 case 64: this.tガイド間隔を変更する( 0 ); break;
\r
5092 //-----------------
\r
5094 #region [ GUIイベント:メニューバー [再生] ]
\r
5095 //-----------------
\r
5096 private void toolStripMenuItem先頭から再生_Click( object sender, EventArgs e )
\r
5098 this.tシナリオ_Viewerで最初から再生する();
\r
5100 private void toolStripMenuItem現在位置から再生_Click( object sender, EventArgs e )
\r
5102 this.tシナリオ_Viewerで現在位置から再生する();
\r
5104 private void toolStripMenuItem現在位置からBGMのみ再生_Click( object sender, EventArgs e )
\r
5106 this.tシナリオ_Viewerで現在位置からBGMのみ再生する();
\r
5108 private void toolStripMenuItem再生停止_Click( object sender, EventArgs e )
\r
5110 this.tシナリオ_Viewerを再生停止する();
\r
5112 //-----------------
\r
5114 #region [ GUIイベント:メニューバー [ツール] ]
\r
5115 //-----------------
\r
5116 private void toolStripMenuItemオプション_Click( object sender, EventArgs e )
\r
5118 this.mgrオプション管理者.tオプションダイアログを開いて編集し結果をアプリ設定に格納する();
\r
5119 this.mgr譜面管理者.tRefreshDisplayLanes(); // レーンの表示/非表示切り替えに備えて追加
\r
5121 private void toolStripMenuItemMIDIImport_Click( object sender, EventArgs e)
\r
5123 this.mgrMIDIインポート管理者.tMIDIインポート管理をインポートメニューから開く();
\r
5124 this.mgr譜面管理者.tRefreshDisplayLanes(); // レーンの表示/非表示切り替えに備えて追加
\r
5126 //-----------------
\r
5128 #region [ GUIイベント:メニューバー [ヘルプ] ]
\r
5129 //-----------------
\r
5130 private void toolStripMenuItemDTXCreaterマニュアル_Click( object sender, EventArgs e )
\r
5134 // マニュアルを別プロセスとして開く。
\r
5136 Process.Start( this.strDTXCのあるフォルダ名 + @"\Manual.chm" );
\r
5140 this.toolStripMenuItemDTXCreaterマニュアル.Enabled = false;
\r
5143 private void toolStripMenuItemバージョン_Click( object sender, EventArgs e )
\r
5145 this.dlgチップパレット.t一時的に隠蔽する();
\r
5147 Cバージョン情報 cバージョン情報 = new Cバージョン情報();
\r
5148 cバージョン情報.ShowDialog();
\r
5149 cバージョン情報.Dispose();
\r
5151 this.dlgチップパレット.t一時的な隠蔽を解除する();
\r
5153 //-----------------
\r
5156 #region [ GUIイベント:ツールバー ]
\r
5157 //-----------------
\r
5158 private void toolStripButton新規作成_Click( object sender, EventArgs e )
\r
5160 this.tシナリオ_新規作成();
\r
5162 private void toolStripButton開く_Click( object sender, EventArgs e )
\r
5166 private void toolStripButton上書き保存_Click( object sender, EventArgs e )
\r
5168 this.tシナリオ_上書き保存();
\r
5170 private void toolStripButton切り取り_Click( object sender, EventArgs e )
\r
5172 this.tシナリオ_切り取り();
\r
5174 private void toolStripButtonコピー_Click( object sender, EventArgs e )
\r
5178 private void toolStripButton貼り付け_Click( object sender, EventArgs e )
\r
5180 // マウスが譜面上にあるならそこから貼り付ける。
\r
5182 Point ptマウスの位置 = this.pt現在のマウス位置を譜面の可視領域相対の座標dotで返す();
\r
5183 Size sz譜面の可視サイズ = this.sz譜面の可視領域の大きさdotを返す();
\r
5186 if( ( ( ptマウスの位置.X < 0 ) || ( ptマウスの位置.Y < 0 ) ) || ( ( ptマウスの位置.X > sz譜面の可視サイズ.Width ) || ( ptマウスの位置.Y > sz譜面の可視サイズ.Height ) ) )
\r
5188 // マウスが譜面上になかった → 表示領域下辺から貼り付ける
\r
5190 this.tシナリオ_貼り付け( this.mgr譜面管理者.n現在の譜面表示下辺の譜面先頭からの位置grid );
\r
5196 this.tシナリオ_貼り付け( this.mgr譜面管理者.nY座標dotが位置するgridを返す_ガイド幅単位( ptマウスの位置.Y ) );
\r
5199 private void toolStripButton削除_Click( object sender, EventArgs e )
\r
5203 private void toolStripButtonアンドゥ_Click( object sender, EventArgs e )
\r
5205 this.tシナリオ_Undoする();
\r
5207 private void toolStripButtonリドゥ_Click( object sender, EventArgs e )
\r
5209 this.tシナリオ_Redoする();
\r
5211 private void toolStripButtonチップパレット_Click( object sender, EventArgs e )
\r
5213 if( this.toolStripButtonチップパレット.CheckState == CheckState.Checked )
\r
5215 this.dlgチップパレット.t表示する();
\r
5219 this.dlgチップパレット.t隠す();
\r
5222 private void toolStripComboBox譜面拡大率_SelectedIndexChanged( object sender, EventArgs e )
\r
5224 C小節.n基準の高さdot = 192 * ( this.toolStripComboBox譜面拡大率.SelectedIndex + 1 );
\r
5226 this.pictureBox譜面パネル.Refresh();
\r
5228 private void toolStripComboBoxガイド間隔_SelectedIndexChanged( object sender, EventArgs e )
\r
5230 switch( this.toolStripComboBoxガイド間隔.SelectedIndex )
\r
5233 this.tガイド間隔を変更する( 4 );
\r
5237 this.tガイド間隔を変更する( 8 );
\r
5241 this.tガイド間隔を変更する( 12 );
\r
5245 this.tガイド間隔を変更する( 16 );
\r
5249 this.tガイド間隔を変更する( 24 );
\r
5253 this.tガイド間隔を変更する( 32 );
\r
5257 this.tガイド間隔を変更する( 48 );
\r
5261 this.tガイド間隔を変更する( 64 );
\r
5265 this.tガイド間隔を変更する( 0 );
\r
5269 private void toolStripButton選択モード_Click( object sender, EventArgs e )
\r
5273 private void toolStripButton編集モード_Click( object sender, EventArgs e )
\r
5277 private void toolStripButton先頭から再生_Click( object sender, EventArgs e )
\r
5279 this.tシナリオ_Viewerで最初から再生する();
\r
5281 private void toolStripButton現在位置から再生_Click( object sender, EventArgs e )
\r
5283 this.tシナリオ_Viewerで現在位置から再生する();
\r
5285 private void toolStripButton現在位置からBGMのみ再生_Click( object sender, EventArgs e )
\r
5287 this.tシナリオ_Viewerで現在位置からBGMのみ再生する();
\r
5289 private void toolStripButton再生停止_Click( object sender, EventArgs e )
\r
5291 this.tシナリオ_Viewerを再生停止する();
\r
5294 //private void ToolStripMenuItemBeatChipsGeneration_Click( object sender, EventArgs e ) // Beat Detections
\r
5296 // GenarateBeatChip_Main();
\r
5300 // 2度続けて実行するとチップが増えておかしくなる?要調査。
\r
5301 private void GenarateBeatChip_Main()
\r
5303 string filename = "";
\r
5305 #region [ BGM, BPM, BEATレーンのレーン番号を取得 ]
\r
5306 int laneBGM = this.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "BGM" );
\r
5307 int laneBPM = this.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "BPM" );
\r
5308 int laneBEAT = this.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "BEAT" );
\r
5311 #region [ BGMレーンにあるチップを抽出して、beat検出する対象のサウンドファイルを決める ]
\r
5312 // とりあえずBGMチップは1個しかない前提で進める。追々、複数のBGMチップでも動作するようにはしたい。
\r
5313 #region [ BGMチップ抽出 ]
\r
5314 int nBGMチップの小節番号 = -1;
\r
5315 int nBGMチップのindex = -1;
\r
5316 foreach ( KeyValuePair<int, C小節> pair in this.mgr譜面管理者.dic小節 )
\r
5318 C小節 c小節 = pair.Value;
\r
5319 nBGMチップのindex = c小節.listチップ.FindIndex(
\r
5320 delegate( Cチップ cチップ )
\r
5322 return ( cチップ.nレーン番号0to == laneBGM );
\r
5325 if ( nBGMチップのindex >= 0 )
\r
5327 nBGMチップの小節番号 = c小節.n小節番号0to3599;
\r
5328 filename = this.mgrWAVリスト管理者.tファイル名を絶対パスで返す( c小節.listチップ[ nBGMチップのindex ].n値_整数1to1295);
\r
5329 Debug.WriteLine( filename );
\r
5330 break; // とりあえず1個見つけたらbreakしちゃう
\r
5332 //for ( int i = 0; i < c小節.listチップ.Count; i++ )
\r
5334 //Cチップ cチップ = c小節.listチップ[ i ];
\r
5335 //if ( cチップ.nレーン番号0to == lane )
\r
5337 // nBGMチップのindex = i;
\r
5338 // filename = this.mgrWAVリスト管理者.tファイル名を絶対パスで返す( cチップ.n値・整数1to1295 );
\r
5339 // Debug.WriteLine( filename );
\r
5343 if ( filename == "" )
\r
5345 MessageBox.Show( "BGMチップが配置されていません。BGMチップを1つ配置してください。", "BGMチップ検出エラー", MessageBoxButtons.OK, MessageBoxIcon.Error );
\r
5351 #region [ マウスカーソルを待機中に変更 (アプリウインドウ外で右クリックメニュー選択していると、効果がない・・・) ]
\r
5352 this.Cursor = Cursors.WaitCursor;
\r
5355 #region [ BPM,BEATレーンの情報を消去 ]
\r
5356 this.mgr選択モード管理者.tレーン上の全チップを選択する( laneBPM );
\r
5358 this.mgr選択モード管理者.tレーン上の全チップを選択する( laneBEAT );
\r
5363 #region [ BASSFXのBeat detectionを実行する ]
\r
5364 FDK.CBeatDetect cbd = new CBeatDetect( filename );
\r
5366 float tempo = cbd.GetTempo();
\r
5367 // Debug.WriteLine( "BPM=" + tempo );
\r
5369 List<FDK.CBeatDetect.stBeatPos> listBeatPositions = cbd.GetBeatPositions();
\r
5370 // Debug.WriteLine( "Count: " + listBeatPositions.Count );
\r
5373 // 四分音符以下、8分音符以下などと選べるようにしたい。
\r
5374 #region [ 四分音符以下の間隔で検出されたbeatを、端折る。端折らないと、検出beat数が多過ぎて、人が扱えなくなる。ただ、端折り方はもう少し熟慮が必要。]
\r
5376 float minBeatDelta = 60.0f / tempo; // 4分音符の長さ
\r
5379 // 最初の10個くらいは、端折らない。まず拍の頭をとるのに必要な情報を落とすわけにはいかないので。
\r
5380 // 10個目以降は、四分音符未満の長さのbeatを、端折る。(裏BEATレーンに回す)
\r
5381 //if ( listBeatPositions.Count > 10 )
\r
5383 // for ( int i = count; i < listBeatPositions.Count; i++ )
\r
5385 // if ( listBeatPositions[ i ].fBeatTime - last < minBeatDelta )
\r
5387 // FDK.CBeatDetect.stBeatPos sbp = new CBeatDetect.stBeatPos(
\r
5388 // listBeatPositions[ i ].fBeatTime,
\r
5392 // ( listBeatPositions[ i ].fBeatTime - last < minBeatDelta ),
\r
5396 // listBeatPositions[ i ] = sbp;
\r
5398 // last = listBeatPositions[ i ].fBeatTime;
\r
5403 #region [ ただのデバッグ表示 ]
\r
5405 //for ( int i = 0; i < listBeatPositions.Count; i++ )
\r
5407 // //Debug.WriteLine( listBeatPositionsLight[ i ] - last );
\r
5408 // Debug.WriteLine( listBeatPositions[ i ].fBeatTime );
\r
5409 // last = listBeatPositions[ i ].fBeatTime;
\r
5411 //Debug.WriteLine( "========================" );
\r
5414 #region [ 未使用: 端折った区間内で、それぞれBPMを再取得してみる → これは意味なし。1つのbeatしか得られないため、正しいBPMを取得できない。]
\r
5415 //List<float> listTempo_interval = new List<float>();
\r
5417 //for ( int i = 0; i < listBeatPositionsLight.Count - 1; i++ )
\r
5419 // listTempo_interval.Add( cbd.GetTempo( last, listBeatPositionsLight[ i ] ) );
\r
5420 // last = listBeatPositionsLight[ i ];
\r
5421 // Debug.WriteLine( listTempo_interval[ i ] );
\r
5426 int n1拍目のBeatPositionIndex = 0;
\r
5428 #region [ 1小節目の頭に1発目の拍が来るよう、BGMチップをずらす。ただしこれだけだと、最大1grid分の時間誤差が発生する。(BPM=125時に最大10msの誤差)]
\r
5429 int nBGM位置grid = 0;
\r
5430 if ( nBGMチップの小節番号 >= 0 && nBGMチップのindex >= 0 )
\r
5432 // float f小節長倍率 = 1.0f;
\r
5433 C小節 c小節_0小節目 = this.mgr譜面管理者.dic小節[ nBGMチップの小節番号 ];
\r
5434 Cチップ cチップBGM = c小節_0小節目.listチップ[ nBGMチップのindex ];
\r
5435 nBGM位置grid = (int) ( 192f * c小節_0小節目.f小節長倍率 * listBeatPositions[ n1拍目のBeatPositionIndex ].fBeatTime / ( ( 60 * 4 ) / tempo ) + 0.5 );
\r
5436 // ここでnBGM位置Gridが192(x小節長)を超えることがある
\r
5437 // → 192(x小節長)をひいて、次の小節に回す。(小節ごとに小節長倍率が変化する可能性があることに注意)
\r
5438 // → スマン、この実装ではまだ、DTXデータの最初はしばらく小節倍率が一定である前提になっちゃってる・・
\r
5439 cチップBGM.n位置grid = (int) ( 192 * c小節_0小節目.f小節長倍率 + 0.5f ) - ( nBGM位置grid % 192 ); // "192-" が必要なことに注意
\r
5440 c小節_0小節目.listチップ[ nBGMチップのindex ] = cチップBGM;
\r
5441 this.mgr譜面管理者.dic小節[ nBGMチップの小節番号 ] = c小節_0小節目;
\r
5445 #region [ 0小節目のBPMを設定し、1つ目の拍が1小節目の頭に来るようにする。]
\r
5446 // まず、0小節の頭にBPM設定を追加する。
\r
5447 this.mgr編集モード管理者.tBPMチップを配置する( 0 * 192, tempo ); // 既にBPMチップが配置されている場合の処理は????????????????
\r
5448 this.numericUpDownBPM.Value = (decimal) ( (int) ( tempo + 0.5 ) );
\r
5449 numericUpDownBPM_ValueChanged( null, null );
\r
5450 numericUpDownBPM_Leave( null, null );
\r
5452 // 更に、先の1グリッド分の誤差をなくすために、BGMチップの位置だけでなく、0小節目のBPMも微調整する。
\r
5453 float f小節長倍率_ = this.mgr譜面管理者.dic小節[ nBGMチップの小節番号 ].f小節長倍率; // 手抜き。すまん。
\r
5454 float fBGM再生直後のBPM = ( 60 * 4 ) * nBGM位置grid / ( 192.0f * f小節長倍率_ ) / listBeatPositions[ n1拍目のBeatPositionIndex ].fBeatTime;
\r
5455 this.mgr編集モード管理者.tBPMチップを配置する( 192 - ( nBGM位置grid % 192 ), fBGM再生直後のBPM );
\r
5460 // 頭の1個目のBEATチップがちゃんと配置されてないよ!!!!!
\r
5464 #region [ BEATレーンにチップを配置する ]
\r
5465 // int lastGrid = (int) ( 192 * this.mgr譜面管理者.dic小節[ 0 ].f小節長倍率 ); // 0小節目の倍率
\r
5466 //int last小節内Grid = 0;
\r
5467 //int last小節番号 = nBGMチップの小節番号;
\r
5468 int n最初の拍のある小節番号 = 1 + ( nBGM位置grid / 192 );
\r
5469 float lastBeatTime = listBeatPositions[ n1拍目のBeatPositionIndex ].fBeatTime;
\r
5470 int lastnGrid = -1;
\r
5472 for ( int index = n1拍目のBeatPositionIndex; index < listBeatPositions.Count; index++ )
\r
5474 //Debug.Write( "[" + index + "] " );
\r
5476 // 今注目しているBEATチップが、どの小節・拍(grid)に収まるかを計算する
\r
5477 // // 誤差を小さくするため、直前のBEATポイントからの相対位置として計算すること。
\r
5478 // // 絶対位置で計算すると、最初のBPM計算の誤差がそのままBEAT位置に現れる。 // やり残し★★★★★★
\r
5479 // // ...としたいのだが、まだできてない。全部絶対位置で計算している。
\r
5480 FDK.CBeatDetect.stBeatPos sbp = listBeatPositions[ index ];
\r
5482 float deltatime = sbp.fBeatTime - lastBeatTime;
\r
5483 //Debug.Write( "delta=" + deltatime );
\r
5484 int n小節番号 = n最初の拍のある小節番号;
\r
5485 float f1小節の時間 = ( 60 / tempo ) * 4;
\r
5486 #region [ 0小節目の場合 ]
\r
5487 if ( deltatime < 0 )
\r
5489 while ( n小節番号 >= 0 && deltatime < 0 )
\r
5492 deltatime += f1小節の時間 * this.mgr譜面管理者.dic小節[ n小節番号 ].f小節長倍率;
\r
5493 //(int) ( 192 * this.mgr譜面管理者.dic小節[ n小節番号 ].f小節長倍率 ); // 0小節目の倍率
\r
5495 if ( deltatime < 0 )
\r
5497 Debug.WriteLine( "[" + index + "]: deltatime < 0; error (" + deltatime );
\r
5502 #region [ 1小節目以降の場合 ]
\r
5505 //Debug.Write( " + " + f1小節の時間 * this.mgr譜面管理者.dic小節[ n小節番号 ].f小節長倍率 * last小節内Grid / 192 + "(" + lastGrid + "|" + last小節内Grid +")=" );
\r
5506 // deltatime += f1小節の時間 * this.mgr譜面管理者.dic小節[ n小節番号 ].f小節長倍率 * last小節内Grid / 192; // 直前のgrid(その小節の頭から)の分
\r
5507 //Debug.WriteLine( deltatime );
\r
5510 if ( deltatime < f1小節の時間 * this.mgr譜面管理者.dic小節[ n小節番号 ].f小節長倍率 )
\r
5516 #region [ 小節ノードが不足しているなら、追加する ]
\r
5517 if ( this.mgr譜面管理者.n現在の最大の小節番号を返す() < n小節番号 )
\r
5519 for ( int i = n小節番号; i < n小節番号 + 5; i++ )
\r
5521 this.mgr譜面管理者.dic小節.Add( i, new C小節( i ) );
\r
5522 this.mgrUndoRedo管理者.tノードを追加する( new CUndoRedoセル<int>( null, new DGUndoを実行する<int>( this.mgr譜面管理者.t小節挿入のUndo ), new DGRedoを実行する<int>( this.mgr譜面管理者.t小節挿入のRedo ), i, i ) );
\r
5527 deltatime -= f1小節の時間 * this.mgr譜面管理者.dic小節[ n小節番号 ].f小節長倍率;
\r
5529 if ( deltatime < 0 )
\r
5531 Debug.WriteLine( "[" + index + "]: deltatime < 0; error (" + deltatime );
\r
5537 // ここまでで、n小節番号を得ている
\r
5538 // ここで、更にgridを得たうえで、16分音符相当にquantizeして、BEATチップの位置とする
\r
5540 #region [ BEATチップを置く ]
\r
5541 float f小節長倍率 = this.mgr譜面管理者.dic小節[ n小節番号 ].f小節長倍率;
\r
5542 int n小節内Grid = (int) ( 192f * f小節長倍率 * deltatime / ( ( 60 * 4 ) / tempo ) + 0.5 );
\r
5544 #region [ Gridを16分音符単位(==12grid単位)でquantizeする ]
\r
5545 //Debug.Write( "nGrid: " + n小節内Grid + " -> " );
\r
5546 n小節内Grid = ( ( n小節内Grid + 6 ) / 12 ) * 12;
\r
5547 //Debug.WriteLine( n小節内Grid );
\r
5550 int nGrid = this.mgr譜面管理者.n譜面先頭からみた小節先頭の位置gridを返す( n小節番号 ) + n小節内Grid;
\r
5552 if ( lastnGrid != nGrid )
\r
5554 // indexを+1しているのは、チップ番号を01から開始するため。
\r
5555 this.mgr編集モード管理者.tBeatチップを配置する( nGrid, index + 1, sbp.fBeatTime, sbp.b無効 );
\r
5556 // this.mgr編集モード管理者.tHHチップを配置する( nGrid, 1, sbp.b無効 ); // デバッグ用・見やすくするために暫定的に。
\r
5557 sbp.nGrid = nGrid;
\r
5558 sbp.n小節番号 = n小節番号;
\r
5559 listBeatPositions[ index ] = sbp; // Grid情報を入れて、listを更新 (この情報はBPx挿入時に使う)
\r
5560 lastnGrid = nGrid;
\r
5564 //lastGrid = nGrid;
\r
5565 //last小節内Grid = n小節内Grid;
\r
5566 //last小節番号 = n小節番号;
\r
5567 //lastBeatTime = sbp.fBeatTime;
\r
5570 //Debug.WriteLine( "[" + index + "]: n小節番号=" + n小節番号 + ", Grid= " + n小節内Grid + "/" + nGrid + ", BeatTime=" + sbp.fBeatTime + ", 裏=" + sbp.b無効 );
\r
5574 BPMchipsGeneneration_Main();
\r
5579 #region [ Beatレーンを表示する ]
\r
5580 this.mgr譜面管理者.listレーン[ laneBEAT ].bIsVisible = true;
\r
5583 #region [ 画面の再描画 ]
\r
5584 this.pictureBox譜面パネル.Invalidate();
\r
5588 #region [ listBeatPositionsの開放 ]
\r
5589 listBeatPositions.Clear();
\r
5590 listBeatPositions = null;
\r
5593 #region [ マウスカーソルの形を元に戻す ]
\r
5594 this.Cursor = Cursors.Default;
\r
5598 //private void ToolStripMenuItemBPMChipsGeneration_Click( object sender, EventArgs e )
\r
5600 // BPMchipsGeneneration_Main();
\r
5603 private void BPMchipsGeneneration_Main()
\r
5605 #region [ BPMレーンとHHレーンを消去(0小節目を除く) ]
\r
5606 int laneBPM = this.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "BPM" );
\r
5607 this.mgr選択モード管理者.tレーン上の全チップを選択する( laneBPM, 1 );
\r
5610 #region [ デバッグ用: HHレーンを消去 ]
\r
5611 int laneHH = this.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "HH" );
\r
5612 this.mgr選択モード管理者.tレーン上の全チップを選択する( laneHH, 1 );
\r
5617 //★★★★小節長1.00以外の場合に後で対応のこと。
\r
5618 #region [ BEATレーンから、listBestPositionを生成 ]
\r
5619 int laneBEAT = this.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "BEAT" );
\r
5620 //Debug.WriteLine( "laneBEAT=" + laneBEAT );
\r
5621 List<FDK.CBeatDetect.stBeatPos> listBeatPositions = new List<CBeatDetect.stBeatPos>();
\r
5622 foreach ( KeyValuePair<int, C小節> pair in this.mgr譜面管理者.dic小節 )
\r
5624 C小節 c小節 = pair.Value;
\r
5625 for ( int index = 0; index < c小節.listチップ.Count; index++ )
\r
5627 if ( c小節.listチップ[ index ].nレーン番号0to == laneBEAT &&
\r
5628 !c小節.listチップ[ index ].b裏 )
\r
5630 int n小節番号 = c小節.n小節番号0to3599;
\r
5631 //Debug.WriteLine( "n小節番号=" + c小節.n小節番号0to3599 + ", 小節内Grid=" + c小節.listチップ[ index ].n位置grid + ",lane=" + c小節.listチップ[ index ].nレーン番号0to + ", f値=" + c小節.listチップ[ index ].f値・浮動小数 );
\r
5634 listBeatPositions.Add(
\r
5635 new CBeatDetect.stBeatPos(
\r
5636 c小節.listチップ[ index ].f値_浮動小数,
\r
5638 this.mgr譜面管理者.n譜面先頭からみた小節先頭の位置gridを返す( n小節番号 ) + c小節.listチップ[ index ].n位置grid,
\r
5639 c小節.listチップ[ index ].n位置grid,
\r
5640 c小節.listチップ[ index ].b裏,
\r
5647 //Debug.WriteLine( "N小節番号=" + c小節.n小節番号0to3599 + ", 小節内Grid=" + c小節.listチップ[ index ].n位置grid + ",lane=" + c小節.listチップ[ index ].nレーン番号0to + ", f値=" + c小節.listチップ[ index ].f値・浮動小数 );
\r
5654 #region [ BEATチップの位置に合わせて、BPMを計算し、BPxチップを配置する ]
\r
5656 int n1拍目のBeatPositionIndex = 0;
\r
5658 int lastindex = 0;
\r
5659 for ( int index = n1拍目のBeatPositionIndex; index < listBeatPositions.Count; index++ )
\r
5661 if ( listBeatPositions[ index ].b無効 )
\r
5665 #region [ 次の有効なBeatPointを検出する ]
\r
5666 int nextIndex = -1;
\r
5667 for ( int i = index + 1; i < listBeatPositions.Count; i++ )
\r
5669 if ( listBeatPositions[ i ].bレーン表示する && !listBeatPositions[ i ].b無効 )
\r
5670 //if ( listBeatPositions[ i ].bレーン表示する )
\r
5678 #region [ BPMチップを置く]
\r
5679 //int lastgrid = (int) ( 192 * this.mgr譜面管理者.dic小節[ 0 ].f小節長倍率 ); // 0小節目の倍率
\r
5680 //int lastindex = n1拍目のBeatPositionIndex;
\r
5681 //int last小節番号 = nBGMチップの小節番号;
\r
5683 if ( nextIndex >= 0 )
\r
5685 float deltatime = listBeatPositions[ nextIndex ].fBeatTime - listBeatPositions[ index ].fBeatTime;
\r
5686 //Debug.WriteLine( "deltatime=" + deltatime+ ", nextIndex=" + nextIndex + ", fBeatTime(nextIndex)=" + listBeatPositions[ nextIndex ].fBeatTime+ ", index=" + index + ", fBeatTIme(index) =" + listBeatPositions[ index ].fBeatTime );
\r
5688 //int current小節番号 = listBeatPositionsLight[ index ].n小節番号;
\r
5689 //int next小節番号 = listBeatPositionsLight[ nextIndex ].n小節番号;
\r
5690 int deltagrid = listBeatPositions[ nextIndex ].nGrid - listBeatPositions[ index ].nGrid;
\r
5691 //Debug.WriteLine( "deltagrid=" + deltagrid + ", nextIndex=" + nextIndex + ", nGrid(nextIndex)=" + listBeatPositions[ nextIndex ].nGrid + ", index=" + index + ", nGrid(index) =" + listBeatPositions[ index ].nGrid );
\r
5692 float fBPM = 60.0f / ( deltatime / deltagrid * 48 ); // 四分音符==48grid
\r
5693 //Debug.WriteLine( "fBPM=" + fBPM + ", deltatime=" + deltatime + ", deltagrid=" + deltagrid );
\r
5695 // BPMチップを配置する(裏BEATチップに対しては、配置しない)
\r
5696 if ( nextIndex >= 0 )
\r
5698 this.mgr編集モード管理者.tBPMチップを配置する( listBeatPositions[ index ].nGrid, fBPM );
\r
5699 // Debug.WriteLine( " tBPM: #" + index + "=" + fBPM );
\r
5703 //this.mgr編集モード管理者.tHHチップを配置する( listBeatPositions[ index ].nGrid, 1, listBeatPositions[ index ].b無効 ); // デバッグ用・見やすくするために暫定的に。
\r
5705 // Debug.WriteLine( "(" + index + "->" + nextIndex + "): BPM=" + fBPM + ", nGrid=" + listBeatPositions[ index ].nGrid + ", deltagrid=" + deltagrid +" , deltatime=" + deltatime );
\r
5706 lastindex = index;
\r
5710 #region [ デバッグ用: HHチップを置く ]
\r
5711 for ( int index = n1拍目のBeatPositionIndex; index < listBeatPositions.Count; index++ )
\r
5713 this.mgr編集モード管理者.tHHチップを配置する( listBeatPositions[ index ].nGrid, 1, listBeatPositions[ index ].b無効 ); // デバッグ用・見やすくするために暫定的に。
\r
5717 #region [ listBeatPositionsの開放 ]
\r
5718 listBeatPositions.Clear();
\r
5719 listBeatPositions = null;
\r
5725 private void generateBeatChipsToolStripMenuItem_Click( object sender, EventArgs e )
\r
5727 GenarateBeatChip_Main();
\r
5730 private void generateBPMFromBeatChipsToolStripMenuItem_Click( object sender, EventArgs e )
\r
5732 BPMchipsGeneneration_Main();
\r
5735 private void toolStripComboBox演奏速度_SelectedIndexChanged( object sender, EventArgs e )
\r
5737 this.b再生速度を変更した = true;
\r
5740 public bool DetectDTXManiaProcess()
\r
5742 bool target = false;
\r
5743 //Debug.WriteLine( "process start" );
\r
5744 for ( int i = 0; i < 5; i++ ) // 検索結果のハンドルがZeroになることがあるので、200ms間隔で5回リトライする
\r
5746 #region [ 既に起動中のDTXManiaプロセスを検索する。]
\r
5747 // このやり方だと、ShowInTaskbar=falseでタスクバーに表示されないパターンの時に検索に失敗するようだが
\r
5748 // DTXManiaでそのパターンはない?のでこのままいく。
\r
5749 // FindWindowを使えばこのパターンにも対応できるが、C#でビルドするアプリはウインドウクラス名を自前指定できないので、これは使わない。
\r
5751 //Process current = Process.GetCurrentProcess();
\r
5752 //Process[] running = Process.GetProcessesByName( current.ProcessName );
\r
5753 string appPath = Application.ExecutablePath;
\r
5754 string processname = Path.Combine( Path.GetDirectoryName( appPath ), "DTXManiaGR.exe" );
\r
5755 //Debug.WriteLine( "processname=" + processname );
\r
5756 //Process[] running = Process.GetProcesses(); // .GetProcessesByName( processname );
\r
5758 System.Management.ManagementClass mc =
\r
5759 new System.Management.ManagementClass( "Win32_Process" );
\r
5760 System.Management.ManagementObjectCollection moc = mc.GetInstances();
\r
5762 //IntPtr hWnd = FindWindow( null, "DTXMania .NET style release " + CDTXMania.VERSION );
\r
5764 foreach ( System.Management.ManagementObject mo in moc )
\r
5766 //Debug.WriteLine( "filename=" + mo["ExecutablePath"] );
\r
5767 //Debug.WriteLine( "2" );
\r
5768 if ( (string)mo[ "ExecutablePath" ] == processname )
\r
5770 //Debug.WriteLine( "3" );
\r
5771 //if ( mo["ProcessId"] != 0 )
\r
5773 //Debug.WriteLine( "4" );
\r
5778 //Debug.WriteLine( "5" );
\r
5782 #region [ 起動中のDTXManiaがいれば、そのプロセスを返す ]
\r
5783 if ( target != false )
\r
5790 //Debug.WriteLine( "process end;" );
\r
5794 private void calcDifficultyToolStripMenuItem_Click(object sender, EventArgs e)
\r
5796 DTXCreator.コード._05.譜面.C難易度自動計算マン f = new コード._05.譜面.C難易度自動計算マン(this);
\r
5798 Cメッセージポップアップ pop = new Cメッセージポップアップ(Resources.str難易度計算マン計算中);
\r
5804 hScrollBarDLEVEL.Value = f.DLevel;
\r
5805 hScrollBarGLEVEL.Value = f.GLevel;
\r
5806 hScrollBarBLEVEL.Value = f.BLevel;
\r
5810 //-----------------
\r
5813 //-----------------
\r