/// <summary> /// BMPキャッシュ機能を追加したレイヤー描画 /// </summary> /// <param name="pane"></param> /// <param name="layerid"></param> /// <param name="pts"></param> protected override void drawLayer(IRichPane pane, int layerid, IEnumerable <PartsBase> pts) { if (_enabledLayers.ContainsKey(layerid)) { if (bmps.ContainKeys(pane, layerid) == false) { var pr = MotherPane.GetPaneRect(); bmps[pane, layerid] = new Bitmap(pr.Width, pr.Height); } var bmp = bmps[pane, layerid]; if (EnableShot == false) { var rp = RichPaneCustomGraphicsBinder.CreateCopy(MotherPane, Graphics.FromImage(bmp)); rp.SetParent(MotherPane); rp.Graphics.Clear(Color.Transparent); base.drawLayer(rp, layerid, pts); var sr = pane.GetPaneRect(); MotherPane.Graphics.DrawImageUnscaledAndClipped(bmp, sr); panebak[pane, layerid] = rp; } else { var sr = pane.GetPaneRect(); var rpbak = panebak[pane, layerid]; // pane.Graphics.SetClip(sr); sr += ScreenPos.FromInt(pane.Scroll.X - rpbak.Scroll.X, pane.Scroll.Y - rpbak.Scroll.Y); MotherPane.Graphics.DrawImageUnscaledAndClipped(bmp, sr); } } else { base.drawLayer(pane, layerid, pts); } }
public void OnMouseMove(MouseState e) { _bar.MouseNow = e; // バーの位置だけ再描画 var br = _tarPane.GetPaneRect(); br.LT.X = br.RB.X - PartsScrollbarV.Width; Pane.Invalidate(br); if (_bar.IsOn) { var k = _speed * _bar.Acc; var ly = (_downPos.Y - e.Pos.Y) * k; ly = Math.Pow(Math.Abs(ly), 1.25) * (ly > 0 ? 1 : -1); // たくさん移動したら、加速度的に移動する Pane.Scroll = ScreenPos.FromInt(Pane.Scroll.X, _downScroll.Y + (int)ly); _bar.SetHighlight(false); Pane.Invalidate(null); } else { _bar.SetHighlight(true); } }
public void OnMouseMove(MouseState e) { _bar.MouseNow = e; // バーの位置だけ再描画 var br = _tarPane.GetPaneRect(); br.LT.Y = br.RB.Y - PartsScrollbarH.Height; Pane.Invalidate(br); if (_bar.IsOn) { var k = Pane.Zoom.X > 84 ? Pane.Zoom.X / 84 : 1.0; k *= _speed * _bar.Acc; var lx = (_downPos.X - e.Pos.X) * k; lx = Math.Pow(Math.Abs(lx), 1.25) * (lx > 0 ? 1 : -1); // たくさん移動したら、加速度的に移動する Pane.Scroll = ScreenPos.FromInt(_downScroll.X + (int)lx, Pane.Scroll.Y); _bar.SetHighlight(false); Pane.Invalidate(null); } else { _bar.SetHighlight(true); } }
/// <summary> /// 指定量のズームを行う /// </summary> /// <param name="value"></param> private void zoom(int x, int y) { // 選択ペーンの描画領域の中心をズームのセンターの設定 var _posDown = new ScreenPos { X = _tarPane.GetPaneRect().LT.X + _tarPane.GetPaneRect().Width / 2 - _tarPane.GetPaneRect().LT.X, Y = _tarPane.GetPaneRect().LT.Y + _tarPane.GetPaneRect().Height / 2 - _tarPane.GetPaneRect().LT.Y }; var _scrollDown = (ScreenPos)Pane.Scroll.Clone(); var _zoomDown = (XyBase)Pane.Zoom.Clone(); // 画面の拡大/縮小 XyBase zoomNow; if (_isX && !_isY) { zoomNow = Pane.Zoom + XyBase.FromInt(x, 0); // ズーム値の算出 } else if (!_isX && _isY) { zoomNow = Pane.Zoom + XyBase.FromInt(0, y); // ズーム値の算出 } else { zoomNow = Pane.Zoom + x; // ズーム値の算出 } // ズーム値を規定範囲内に収める 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 - _tarPane.GetPaneRect().LT; // var afterDownPos = ScreenPos.FromInt((int)(ZoomRatioX * beforeDownPos.X), (int)(ZoomRatioY * beforeDownPos.Y)); Pane.Scroll = _scrollDown - (afterDownPos - beforeDownPos); Pane.Invalidate(null); }
/// <summary> /// オートスクロールする /// </summary> public void autoScroll() { try { var e = MouseState.Now; _timer = null; var pp = 0; if (e.Attr.IsButton) { var pr = _tarPane.GetPaneRect(); e.Pos = ThreadSafe.PointToClient(_tarPane.Control, e.Pos); if (e.Pos.Y > -24 && e.Pos.Y < pr.Height + 24) { if (e.Pos.X < 16) { pp = 20; } if (e.Pos.X > pr.Width - 32) { pp = -20; } } } if (pp != 0) { Pane.Scroll = ScreenPos.FromInt(Pane.Scroll.X + pp, Pane.Scroll.Y); Pane.Invalidate(null); _timer = Timer.AddTrigger(100, new GuiTimer.Proc0(autoScroll)); } else { _timer = null; } } catch (Exception) { } }
/// <summary> /// マウスMoveイベント /// </summary> /// <param name="e"></param> public virtual void OnMouseMove(MouseState e) { if (_posDown == null || _zoomDown == null || _scrollDown == null || e.Pane == null) { return; } if (e.Attr.Equals(_trigger)) { // 画面の拡大/縮小 ScreenPos movePos = e.Pos - _posDown; // カーソルの移動量の計算 ScreenPos pdBak = (ScreenPos)_posDown.Clone(); if (_isCenterLock) { _posDown.X = e.Pane.GetPaneRect().LT.X + (e.Pane.GetPaneRect().RB.X - e.Pane.GetPaneRect().LT.X) / 2; _posDown.Y = e.Pane.GetPaneRect().LT.Y + (e.Pane.GetPaneRect().RB.Y - e.Pane.GetPaneRect().LT.Y) / 2; } XyBase zoomNow = _zoomDown + movePos * 3; // ズーム値の算出 速度変更(高解像度に伴い) 2016.11.15 Tono 2→3 // ズーム値を規定範囲内に収める 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; } if (_isSameXY) { zoomNow.Y = zoomNow.X; } Pane.Zoom = (XyBase)zoomNow.Clone(); // ズーム値の反映 // クリックした位置を基準にしてズームするように画面をスクロールする。 double ZoomRatioX = (double)zoomNow.X / _zoomDown.X; // X方向のズーム率の算出 double ZoomRatioY = (double)zoomNow.Y / _zoomDown.Y; // Y方向のズーム率の算出 ScreenPos beforeDownPos = _posDown - _scrollDown - e.Pane.GetPaneRect().LT; // ScreenPos 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); _posDown = pdBak; } else { OnMouseUp(e); } }