//──────────────────────────────────────── #endregion #region アクション //──────────────────────────────────────── public void OnMouseMove(ref bool isRefreshCoordinate, ref bool isRefresh, ScrollpaneImpl scrollpane, object sender, MouseEventArgs e, UserControl uc) { if (!this.IsHorizontal) { //━━━━━ //垂直スクロールバー //━━━━━ if (uc.Capture) { //System.Console.WriteLine("○ツリーボックスは画面外のマウスをキャプチャーしています。(" + e.Location.X + "、" + e.Location.Y+")"); //━━━━━ //画面外へマウスドラッグしていれば //━━━━━ int pixel = 0; bool isOutScreen = false; if (e.Location.Y < uc.Bounds.Y) { //━━━━━ //画面上の外 //━━━━━ //ystem.Console.WriteLine("○↑ツリーボックスは画面上の外に逃げたマウスをキャプチャーしています。(" + e.Location.X + "、" + e.Location.Y+")"); pixel = (int)((double)scrollpane.ViewBounds.Y - (double)(uc.Bounds.Y - e.Location.Y) / 10.0d); isOutScreen = true; } else if (uc.Bounds.Y + uc.Bounds.Height < e.Location.Y) { //━━━━━ //画面下の外 //━━━━━ //ystem.Console.WriteLine("○↓ツリーボックスは画面下の外に逃げたマウスをキャプチャーしています。(" + e.Location.X + "、" + e.Location.Y + ")"); pixel = scrollpane.ViewBounds.Y + (int)(((double)e.Location.Y - (double)(uc.Bounds.Y + uc.Bounds.Height)) / 10.0d); isOutScreen = true; } else { } if (isOutScreen) { if (pixel < 0) { // 上端制限 pixel = 0; } else if (scrollpane.AppearDataSize.Height < pixel + uc.ClientSize.Height - scrollpane.HScrollbar.Bold) { // 下端制限 pixel = scrollpane.AppearDataSize.Height - uc.ClientSize.Height + scrollpane.HScrollbar.Bold; } if (scrollpane.ViewBounds.Y != pixel) { scrollpane.SetViewY(pixel); isRefreshCoordinate = true; isRefresh = true; } } } if (0 < this.PressedPosInSbox) { //━━━━━ // 垂直スクロールボックスのスライダーボックスを動かしている場合。 //━━━━━ //ystem.Console.WriteLine("スライダーボックスを動かしました。"); // // // VisibleBoundsのY座標を設定してください。 // ────────── // ここでスライダーボックスの位置を設定しても、 // RefreshDataで上書きされます。 // // //スライダーボックスの上端の座標 double boxTop = (double)(e.Location.Y - this.PressedPosInSbox); //スライダーボックスの移動量 double movedHeight = boxTop - (double)this.ToMovableBounds().Y; //スライダーボックスの上端が、何割の位置にあるか。 double boxTopPer = movedHeight / (double)this.ToMovableBounds().Height; // スライダーボックスの上端が、データ上、何ピクセルの位置にあたるか。 int pixel = (int)((double)scrollpane.AppearDataSize.Height * boxTopPer); if (pixel < 0) { // 上端制限 pixel = 0; } else if (scrollpane.AppearDataSize.Height < pixel + uc.ClientSize.Height - scrollpane.HScrollbar.Bold) { // 下端制限 pixel = scrollpane.AppearDataSize.Height - uc.ClientSize.Height + scrollpane.HScrollbar.Bold; } scrollpane.SetViewY(pixel); } } else { //━━━━━ //水平スクロールバー //━━━━━ if (uc.Capture) { //System.Console.WriteLine("○ツリーボックスは画面外のマウスをキャプチャーしています。(" + e.Location.X + "、" + e.Location.Y+")"); //━━━━━ //画面外へマウスドラッグしていれば //━━━━━ int pixel = 0; bool isOutScreen = false; if (e.Location.X < uc.Bounds.X) { //━━━━━ //画面上の外 //━━━━━ //ystem.Console.WriteLine("○↑ツリーボックスは画面上の外に逃げたマウスをキャプチャーしています。(" + e.Location.X + "、" + e.Location.Y+")"); pixel = (int)((double)scrollpane.ViewBounds.X - (double)(uc.Bounds.X - e.Location.X) / 10.0d); isOutScreen = true; } else if (uc.Bounds.X + uc.Bounds.Width < e.Location.X) { //━━━━━ //画面下の外 //━━━━━ //ystem.Console.WriteLine("○↓ツリーボックスは画面下の外に逃げたマウスをキャプチャーしています。(" + e.Location.X + "、" + e.Location.Y + ")"); pixel = scrollpane.ViewBounds.X + (int)(((double)e.Location.X - (double)(uc.Bounds.X + uc.Bounds.Width)) / 10.0d); isOutScreen = true; } else { } if (isOutScreen) { if (pixel < 0) { // 上端制限 pixel = 0; } else if (scrollpane.AppearDataSize.Width < pixel + uc.ClientSize.Width - scrollpane.VScrollbar.Bold) { // 下端制限 pixel = scrollpane.AppearDataSize.Width - uc.ClientSize.Width + scrollpane.VScrollbar.Bold; } if (scrollpane.ViewBounds.X != pixel) { scrollpane.SetViewX(pixel); isRefreshCoordinate = true; isRefresh = true; } } } if (0 < this.PressedPosInSbox) { //━━━━━ // 水平スクロールボックスのスライダーボックスを動かしている場合。 //━━━━━ // // // VisibleBoundsのX座標を設定してください。 // ────────── // ここでスライダーボックスの位置を設定しても、 // RefreshDataで上書きされます。 // // //スライダーボックスの左端の座標 double boxLeft = (double)(e.Location.X - this.PressedPosInSbox); //スライダーボックスの移動量 double movedWidth = boxLeft - (double)this.ToMovableBounds().X; //スライダーボックスの左端が、何割の位置にあるか。 double boxLeftPer = movedWidth / (double)this.ToMovableBounds().Width; // スライダーボックスの左端が、データ上、何ピクセルの位置にあたるか。 int pixel = (int)((double)scrollpane.AppearDataSize.Width * boxLeftPer); if (pixel < 0) { // 左端制限 pixel = 0; } else if (scrollpane.AppearDataSize.Width < pixel + uc.ClientSize.Width - scrollpane.VScrollbar.Bold) { // 右端制限 pixel = scrollpane.AppearDataSize.Width - uc.ClientSize.Width + scrollpane.VScrollbar.Bold; } scrollpane.SetViewX(pixel); } } }
//──────────────────────────────────────── public void OnMouseDown(ref bool isRefreshData, ref bool isRefresh, out bool isHit, ScrollpaneImpl scrollpane, object sender, MouseEventArgs e, UserControl uc) { isHit = false; if (!this.IsHorizontal) { //━━━━━ //垂直スクロールバー //━━━━━ if (this.ToMovableBounds().Contains(e.Location)) { isHit = true; if (this.ToSliderboxBounds().Contains(e.Location)) { //━━━━━ // スライダーボックス //━━━━━ // カメラ・ボックスの中での、押したマウス座標。 // この数字をマウス座標から引くと、カメラ・ボックスの上端位置が分かります。 this.PressedPosInSbox = e.Location.Y - this.SliderboxLocation.Y; //ystem.Console.WriteLine("スライダーボックスを押しました。 this.MouseYInCamera=[" + this.VScrollbar.PressedPosInSbox + "]"); } else { //━━━━━ // スライダーボックスでないところをクリックした場合 //━━━━━ this.PressedPosInSbox = 0; if (e.Location.Y < this.SliderboxLocation.Y) { //ystem.Console.WriteLine("移動可能領域(上)を押しました。1ページ分上にスクロールしたい。 this.MouseYInCamera=[" + this.VScrollbar.PressedPosInSbox + "]"); // // // スライダーボックスの縦幅分、スライダーボックスを上に移動します。 // // スライダーボックスの座標ではなく、setViewY() で確定します。 // // int dstY = this.SliderboxLocation.Y - this.SliderboxLength; if (dstY < this.MoveableY) { dstY = this.MoveableY; } // 移動可能範囲の先端からの移動量。 int movedHeight = dstY - this.MoveableY; // スライダーボックスの上辺が、移動可能範囲全体の何割か。 double boxTopPer = (double)movedHeight / (double)this.MovableLength; // データの高さの内、指定割合は何ピクセルか。 int pixel = (int)((double)scrollpane.AppearDataSize.Height * boxTopPer); if (scrollpane.ViewBounds.Y != pixel) { scrollpane.SetViewY(pixel); isRefreshData = true; isRefresh = true; } } else { //ystem.Console.WriteLine("移動可能領域(下)を押しました。1ページ分下にスクロールしたい。 this.MouseYInCamera=[" + this.VScrollbar.PressedPosInSbox + "]"); // // // スライダーボックスの縦幅分、スライダーボックスを下に移動します。 // // スライダーボックスの座標ではなく、setViewY() で確定します。 // // int dstY = this.SliderboxLocation.Y + this.SliderboxLength; if (this.MoveableY + this.MovableLength < dstY + this.SliderboxLength) { dstY = this.MoveableY + this.MovableLength - this.SliderboxLength; } // 移動可能範囲の先端からの移動量。 int movedHeight = dstY - this.MoveableY; // スライダーボックスの上辺が、移動可能範囲全体の何割か。 double boxTopPer = (double)movedHeight / (double)this.MovableLength; // データの高さの内、指定割合は何ピクセルか。 int pixel = (int)((double)scrollpane.AppearDataSize.Height * boxTopPer); if (scrollpane.ViewBounds.Y != pixel) { scrollpane.SetViewY(pixel); isRefreshData = true; isRefresh = true; } } } } else { this.PressedPosInSbox = 0; } } else { //━━━━━ //水平スクロールバー //━━━━━ if (this.ToMovableBounds().Contains(e.Location)) { isHit = true; if (this.ToSliderboxBounds().Contains(e.Location)) { //━━━━━ // スライダーボックス //━━━━━ // スライダーボックスの中での、押したマウス座標。 // この数字をマウス座標から引くと、スライダーボックスの左端位置が分かります。 this.PressedPosInSbox = e.Location.X - this.SliderboxLocation.X; //ystem.Console.WriteLine("水平スライダーボックスを押しました。 this.HScrollbar.PressedPosInSbox=[" + this.HScrollbar.PressedPosInSbox + "]"); } else { //━━━━━ // スライダーボックスでないところをクリックした場合 //━━━━━ this.PressedPosInSbox = 0; if (e.Location.X < this.SliderboxLocation.X) { //ystem.Console.WriteLine("移動可能領域(左)を押しました。スライダーボックス1個分左にスクロールしたい。 this.HScrollbar.PressedPosInSbox=[" + this.HScrollbar.PressedPosInSbox + "]"); // // // スライダーボックスの縦幅分、スライダーボックスを上に移動します。 // // スライダーボックスの座標ではなく、setViewX() で確定します。 // // int dstX = this.SliderboxLocation.X - this.SliderboxLength; if (dstX < this.MoveableX) { dstX = this.MoveableX; } // 移動可能範囲の左端からの移動量。 int movedWidth = dstX - this.MoveableX; // スライダーボックスの左端が、移動可能範囲全体の何割か。 double boxLeftPer = (double)movedWidth / (double)this.MovableLength; // データの高さの内、指定割合は何ピクセルか。 int pixel = (int)((double)scrollpane.AppearDataSize.Width * boxLeftPer); if (scrollpane.ViewBounds.X != pixel) { scrollpane.SetViewX(pixel); isRefreshData = true; isRefresh = true; } } else { //ystem.Console.WriteLine("移動可能領域(右)を押しました。スライダーボックス1個分右にスクロールしたい。 this.HScrollbar.PressedPosInSbox=[" + this.HScrollbar.PressedPosInSbox + "]"); // // // スライダーボックスの縦幅分、スライダーボックスを下に移動します。 // // スライダーボックスの座標ではなく、setViewY() で確定します。 // // int dstX = this.SliderboxLocation.X + this.SliderboxLength; //ystem.Console.WriteLine("dstX(" + dstX + ")=this.HScrollbar.SliderboxLocation.X(" + this.HScrollbar.SliderboxLocation.X + ")+this.HScrollbar.SliderboxLength(" + this.HScrollbar.SliderboxLength + ")"); //ystem.Console.WriteLine("this.HScrollbar.MoveableX(" + this.HScrollbar.MoveableX + ")+this.HScrollbar.MovableLength(" + this.HScrollbar.MovableLength + ")<dstX(" + dstX + ")"); if (this.MoveableX + this.MovableLength < dstX + this.SliderboxLength) { //ystem.Console.WriteLine("dstX(" + dstX + ")=this.HScrollbar.MoveableX(" + this.HScrollbar.MoveableX + ")+this.HScrollbar.MovableLength(" + this.HScrollbar.MovableLength + ")"); dstX = this.MoveableX + this.MovableLength - this.SliderboxLength; } // 移動可能範囲の先端からの移動量。 int movedWidth = dstX - this.MoveableX; //ystem.Console.WriteLine("movedWidth(" + movedWidth + ")=dstX(" + dstX + ")-this.HScrollbar.MoveableX(" + this.MoveableX + ")"); // スライダーボックスの左辺が、移動可能範囲全体の何割か。 double boxLeftPer = (double)movedWidth / (double)this.MovableLength; //ystem.Console.WriteLine("boxLeftPer(" + boxLeftPer + ")=movedWidth(" + movedWidth + ")/this.HScrollbar.MovableLength(" + this.MovableLength + ")"); // データの高さの内、指定割合は何ピクセルか。 int pixel = (int)((double)scrollpane.AppearDataSize.Width * boxLeftPer); //ystem.Console.WriteLine("pixel(" + pixel + ")=this.AppearDataSize.Width(" + scrollpane.AppearDataSize.Width + ")×boxLeftPer(" + boxLeftPer + ")"); if (scrollpane.ViewBounds.X != pixel) { scrollpane.SetViewX(pixel); isRefreshData = true; isRefresh = true; } } } } else { this.PressedPosInSbox = 0; } } }