/// <summary> /// 指定された値にズームする /// </summary> /// <param name="who"></param> public override void Start(NamedId who) { // 選択ペーンの描画領域の中心をズームのセンターの設定 var _posDown = new ScreenPos { X = _tarRps[0].GetPaneRect().LT.X + (_tarRps[0].GetPaneRect().RB.X - _tarRps[0].GetPaneRect().LT.X) / 2, //ペーンのX座標の中心 Y = _tarRps[0].GetPaneRect().LT.Y + (_tarRps[0].GetPaneRect().RB.Y - _tarRps[0].GetPaneRect().LT.Y) / 2 //ペーンのY座標の中心 }; var _scrollDown = (ScreenPos)Pane.Scroll.Clone(); //ズーム前のスクロール値 var _zoomDown = (XyBase)Pane.Zoom.Clone(); //ズーム前のズーム値 // 画面の拡大/縮小 var intZ = (int)(zoom * 100); //ズーム値の取得 Pane.Zoom = XyBase.FromInt(1000, 1000); // ズーム値の初期化 var zoomX = Pane.Zoom.X * intZ / 100; var zoomY = Pane.Zoom.Y * intZ / 100; var zoomNow = XyBase.FromInt(zoomX, zoomY); // ズーム値の算出 Pane.Zoom = zoomNow; // ズーム値の反映 // クリックした位置を基準にしてズームするように画面をスクロールする。 var ZoomRatioX = (double)zoomNow.X / _zoomDown.X; // X方向のズーム率の算出 var ZoomRatioY = (double)zoomNow.Y / _zoomDown.Y; // Y方向のズーム率の算出 var beforeDownPos = _posDown - _scrollDown - _tarRps[0].GetPaneRect().LT; // var afterDownPos = ScreenPos.FromInt((int)(ZoomRatioX * beforeDownPos.X), (int)(ZoomRatioY * beforeDownPos.Y)); Pane.Scroll = _scrollDown - (afterDownPos - beforeDownPos); //スクロール値の反映 Pane.Invalidate(null); }
/// <summary> /// マウスホイールのイベントを転送する /// </summary> /// <param name="e">マウス状態</param> public void OnMouseWheel(MouseState e) { if (e.Attr.Equals(_trigger)) { var p = XyBase.FromInt(e.Delta.Y, e.Delta.X); Pane.Scroll += p / 5; Pane.Invalidate(null); } }
/// <summary> /// マウスWheelイベント /// </summary> /// <param name="e"></param> public void OnMouseWheel(MouseState e) { if (e.Attr.Equals(_trigger)) { // 選択ペーンの描画領域の中心をズームのセンターの設定 var _posDown = new ScreenPos { X = e.Pane.GetPaneRect().LT.X + e.Pos.X - e.Pane.GetPaneRect().LT.X, Y = e.Pane.GetPaneRect().LT.Y + e.Pos.Y - e.Pane.GetPaneRect().LT.Y }; var _scrollDown = (ScreenPos)Pane.Scroll.Clone(); var _zoomDown = (XyBase)Pane.Zoom.Clone(); var vol = (int)(GeoEu.Length(Pane.Zoom.X, Pane.Zoom.Y) / 1000 * e.Delta.Y * 0.1); // 画面の拡大/縮小 XyBase zoomNow; if (_isX && !_isY) { zoomNow = Pane.Zoom + XyBase.FromInt(vol, 0); // ズーム値の算出 } else if (!_isX && _isY) { zoomNow = Pane.Zoom + XyBase.FromInt(0, vol); // ズーム値の算出 } else { zoomNow = Pane.Zoom + vol; // ズーム値の算出 } // ズーム値を規定範囲内に収める if (zoomNow.X > 4000) { zoomNow.X = 4000; } if (zoomNow.Y > 4000) { zoomNow.Y = 4000; } if (zoomNow.X < 5) { zoomNow.X = 5; } if (zoomNow.Y < 5) { zoomNow.Y = 5; } Pane.Zoom = (XyBase)zoomNow.Clone(); // ズーム値の反映 // クリックした位置を基準にしてズームするように画面をスクロールする。 var ZoomRatioX = (double)zoomNow.X / _zoomDown.X; // X方向のズーム率の算出 var ZoomRatioY = (double)zoomNow.Y / _zoomDown.Y; // Y方向のズーム率の算出 var beforeDownPos = _posDown - _scrollDown - e.Pane.GetPaneRect().LT; // var afterDownPos = ScreenPos.FromInt((int)(ZoomRatioX * beforeDownPos.X), (int)(ZoomRatioY * beforeDownPos.Y)); if (_noscrollmove.value == false) { Pane.Scroll = _scrollDown - (afterDownPos - beforeDownPos); } else { _noscrollmove.value = false; } Pane.Invalidate(null); } else { OnMouseUp(e); } }