/// <summary> /// UpdateKifuWindowDockState()のミニ盤面用。 /// だいたい同じ感じの処理。 /// </summary> private void UpdateMiniShogiBoardDockState(PropertyChangedEventArgs args) { var dockState = (DockState)args.value; var dockManager = TheApp.app.Config.MiniShogiBoardDockManager; dockManager.DockState = dockState; // 次回起動時のためにここに保存しておく。 if (miniShogiBoardDockWindow != null) { miniShogiBoardDockWindow.RemoveControl(); miniShogiBoardDockWindow.Dispose(); miniShogiBoardDockWindow = null; } engineConsiderationMainControl.RemoveMiniShogiBoard(); // dockManager.Visibleは反映させないと駄目。 if (!dockManager.Visible) { // フォーカス移動されてると困るので戻す。 this.Focus(); return; } if (dockState == DockState.InTheMainWindow) { engineConsiderationMainControl.AddMiniShogiBoard(); } else { miniShogiBoardDockWindow = new DockWindow(); miniShogiBoardDockWindow.ViewModel.AddPropertyChangedHandler("MenuUpdated", _ => UpdateMenuItems()); miniShogiBoardDockWindow.Owner = this; miniShogiBoardDockWindow.ViewModel.Caption = "ミニ盤面"; // デフォルト位置とサイズにする。 if (dockManager.Size.IsEmpty) { // デフォルトでは、このウインドウサイズに従う dockManager.Size = new Size(Width / 4, Height / 4); //var pos = miniShogi.CalcKifuWindowLocation(); //// これクライアント座標なので、スクリーン座標にいったん変換する。 //pos = gameScreenControl1.PointToScreen(pos); var pos = new Point(0, 0); dockManager.LocationOnDocked = new Point(pos.X - this.Location.X, pos.Y - this.Location.Y); dockManager.LocationOnFloating = pos; } // Showで表示とサイズが確定してからdockManagerを設定しないと、 // Showのときの位置とサイズがdockManagerに記録されてしまう。 miniShogiBoardDockWindow.Visible = true; miniShogiBoardDockWindow.AddControl(miniShogiBoard, this, dockManager); dockManager.InitDockWindowLocation(this, miniShogiBoardDockWindow); miniShogiBoardDockWindow.Show(); } }
/// <summary> /// 棋譜ウインドウをfloating modeにする/戻す /// </summary> private void UpdateKifuWindowDockState(PropertyChangedEventArgs args) { var dockState = (DockState)args.value; kifuControl.ViewModel.DockState = dockState; var dockManager = TheApp.app.Config.KifuWindowDockManager; dockManager.DockState = dockState; // 次回起動時のためにここに保存しておく。 // 何にせよ、いったん解除する。 if (kifuDockWindow != null) { kifuDockWindow.RemoveControl(); kifuDockWindow.Dispose(); kifuDockWindow = null; } if (gameScreenControl1.Controls.Contains(kifuControl)) { gameScreenControl1.Controls.Remove(kifuControl); } // dockManager.Visibleは反映させないと駄目。 if (!dockManager.Visible) { // フォーカス移動されてると困るので戻す。 this.Focus(); return; } if (dockState == DockState.InTheMainWindow) { gameScreenControl1.Controls.Add(kifuControl); gameScreenControl1.ResizeKifuControl(); // フォームに埋めたあとリサイズする。 // 細長い駒台のときはVisibleにしないのでここで制御しない。 } else { kifuDockWindow = new DockWindow(); kifuDockWindow.ViewModel.AddPropertyChangedHandler("MenuUpdated", _ => UpdateMenuItems()); kifuDockWindow.Owner = this; //kifuDockWindow.TopMost = true; // Ownerを設定してしまうと、main windowを×で閉じたときに先にこのFormClosingが呼び出されてしまう。 // → かと言ってTopMostは、ファイルダイアログを開くときなど常に最前面に出てくるので罪が重い。 // MainWindowのOnMoveなどに対してだけ前面に持ってきてはどうか。 // → resize,move,…、イベントを捕捉するだけでは、漏れがあるようで棋譜ウインドウが前面に来ない瞬間がある。 // 結論的には、OwnerをMainWindowにして、Close()のキャンセル処理はしないようにする。 kifuDockWindow.ViewModel.Caption = "棋譜ウインドウ"; // デフォルト位置とサイズにする。 if (dockManager.Size.IsEmpty) { // メインウインドウに埋め込み時の棋譜ウインドウのサイズをデフォルトとしておいてやる。 dockManager.Size = gameScreenControl1.CalcKifuWindowSize(); var pos = gameScreenControl1.CalcKifuWindowLocation(); // これクライアント座標なので、スクリーン座標にいったん変換する。 pos = gameScreenControl1.PointToScreen(pos); dockManager.LocationOnDocked = new Point(pos.X - this.Location.X, pos.Y - this.Location.Y); dockManager.LocationOnFloating = pos; } // Showで表示とサイズが確定してからdockManagerを設定しないと、 // Showのときの位置とサイズがdockManagerに記録されてしまう。 kifuControl.Visible = true; // 細長い駒台モードのため非表示にしていたかも知れないので。 kifuDockWindow.AddControl(kifuControl, this, dockManager); dockManager.InitDockWindowLocation(this, kifuDockWindow); kifuDockWindow.Show(); } }