/// <summary> /// 恾宍偺堏摦 (懭墌) /// </summary> /// <param name="figure">恾宍</param> /// <param name="current">尰嵼偺儅僂僗埵抲</param> /// <param name="info">儃僞儞墴壓帪偺忣曬</param> /// <param name="key">儃僞儞墴壓帪偺僉乕儃乕僪忣曬</param> protected virtual void ModifyFigure(FVIL.GDI.CFviGdiEllipse figure, FVIL.Data.CFviPoint current, MouseInfo info, KeyboardInfo key) { if (info.iGripPosition == 0) { return; } // 恾宍傪堏摦. FVIL.GDI.RectPosition rectpos = (FVIL.GDI.RectPosition)info.iGripPosition; if ((rectpos & FVIL.GDI.RectPosition.ALL) == FVIL.GDI.RectPosition.ALL) { MoveFigure(figure, current, info, key); return; } // 儅僂僗墴壓帪偺忣曬偱嵗昗寁嶼偡傞. FVIL.Data.CFviPoint axis = Math.Add(info.position, info.axis); FVIL.Data.CFviAngle angle = Math.Invert(info.angle); FVIL.Data.CFviPoint pos = FVIL.Math.Rotate(current, axis, angle); // 恾宍偺曄宍. FVIL.Data.CFviRectangle clip = figure.GetClipRect(); if ((rectpos & FVIL.GDI.RectPosition.Left) == FVIL.GDI.RectPosition.Left) { clip.Left = pos.X; } if ((rectpos & FVIL.GDI.RectPosition.Right) == FVIL.GDI.RectPosition.Right) { clip.Right = pos.X; } if ((rectpos & FVIL.GDI.RectPosition.Top) == FVIL.GDI.RectPosition.Top) { clip.Top = pos.Y; } if ((rectpos & FVIL.GDI.RectPosition.Bottom) == FVIL.GDI.RectPosition.Bottom) { clip.Bottom = pos.Y; } double radius_x = clip.Width / 2; double radius_y = clip.Height / 2; figure.X = clip.X + radius_x; figure.Y = clip.Y + radius_y; figure.AxisX = radius_x; figure.AxisY = radius_y; // --- 婡幉偺曗惓. if (angle.Degree != 0.0) { figure.Axis = Math.Sub(axis, figure.Position); } }
/// <summary> /// 儅僂僗墴壓帪偺忣曬傪桳岠壔偡傞 /// </summary> /// <param name="info">儅僂僗墴壓帪偺忣曬</param> /// <returns> /// 曄峏偟偨応崌偼 true 傪曉偟傑偡丅偦傟埲奜偼 false 傪曉偟傑偡丅 /// </returns> /// <remarks> /// 恾宍偺嵗昗偑斀揮偟偰偄偨応崌偵丄奜愙嬮宍忋偺儅僂僗僌儕僢僾埵抲傕斀揮偟傑偡丅 /// 奜愙嬮宍偵傛偭偰曄宍傪峴偆恾宍偑懳徾偱偡丅 /// 偙偺儊僜僢僪偼丄儅僂僗僌儕僢僾帪偵堦搙偩偗屇傃弌偡傛偆偵偟偰偔偩偝偄丅 /// </remarks> protected virtual bool Validate(ref MouseInfo info) { if (ReferenceEquals(info.figure, null)) { return(false); } if (info.iGripPosition == 0) { return(false); } bool bReverseH = false; // 悈暯曽岦斀揮. bool bReverseV = false; // 悅捈曽岦斀揮. // 懳徾偺恾宍. if (info.figure is FVIL.GDI.CFviGdiCircle) { FVIL.GDI.CFviGdiCircle figure = (FVIL.GDI.CFviGdiCircle)info.figure; bReverseH = (figure.Radius < 0); bReverseV = (figure.Radius < 0); } else if (info.figure is FVIL.GDI.CFviGdiEllipse) { FVIL.GDI.CFviGdiEllipse figure = (FVIL.GDI.CFviGdiEllipse)info.figure; bReverseH = (figure.AxisX < 0); bReverseV = (figure.AxisY < 0); } else if (info.figure is FVIL.GDI.CFviGdiRectangle) { FVIL.GDI.CFviGdiRectangle figure = (FVIL.GDI.CFviGdiRectangle)info.figure; bReverseH = (figure.Width < 0); bReverseV = (figure.Height < 0); } else { return(false); } // 奜愙嬮宍忋偺埵抲. FVIL.GDI.RectPosition rectpos = (FVIL.GDI.RectPosition)info.iGripPosition; bool L = ((rectpos & FVIL.GDI.RectPosition.Left) == FVIL.GDI.RectPosition.Left); bool R = ((rectpos & FVIL.GDI.RectPosition.Right) == FVIL.GDI.RectPosition.Right); bool T = ((rectpos & FVIL.GDI.RectPosition.Top) == FVIL.GDI.RectPosition.Top); bool B = ((rectpos & FVIL.GDI.RectPosition.Bottom) == FVIL.GDI.RectPosition.Bottom); // 悈暯曽岦斀揮. if (bReverseH) { if (L && !R) // 尰嵼丄嵍偑 ON 偺帪丄嵍傪 OFF 偟偰塃傪 ON 偡傞. { rectpos &= ~FVIL.GDI.RectPosition.Left; rectpos |= FVIL.GDI.RectPosition.Right; } if (R && !L) // 尰嵼丄塃偑 ON 偺帪丄塃傪 OFF 偟偰嵍傪 ON 偡傞. { rectpos &= ~FVIL.GDI.RectPosition.Right; rectpos |= FVIL.GDI.RectPosition.Left; } } // 悅捈曽岦斀揮. if (bReverseV) { if (T && !B) // 尰嵼丄忋偑 ON 偺帪丄忋傪 OFF 偟偰壓傪 ON 偡傞. { rectpos &= ~FVIL.GDI.RectPosition.Top; rectpos |= FVIL.GDI.RectPosition.Bottom; } if (B && !T) // 尰嵼丄壓偑 ON 偺帪丄壓傪 OFF 偟偰忋傪 ON 偡傞. { rectpos &= ~FVIL.GDI.RectPosition.Bottom; rectpos |= FVIL.GDI.RectPosition.Top; } } // 斀塮. info.iGripPosition = (int)rectpos; return(bReverseH || bReverseV); }
/// <summary> /// 恾宍偺堏摦 (恀墌) /// </summary> /// <param name="figure">恾宍</param> /// <param name="current">尰嵼偺儅僂僗埵抲</param> /// <param name="info">儃僞儞墴壓帪偺忣曬</param> /// <param name="key">儃僞儞墴壓帪偺僉乕儃乕僪忣曬</param> protected virtual void ModifyFigure(FVIL.GDI.CFviGdiCircle figure, FVIL.Data.CFviPoint current, MouseInfo info, KeyboardInfo key) { if (info.iGripPosition == 0) { return; } // 恾宍傪堏摦. FVIL.GDI.RectPosition rectpos = (FVIL.GDI.RectPosition)info.iGripPosition; if ((rectpos & FVIL.GDI.RectPosition.ALL) == FVIL.GDI.RectPosition.ALL) { MoveFigure(figure, current, info, key); return; } // 儅僂僗墴壓帪偺忣曬偱嵗昗寁嶼偡傞. FVIL.Data.CFviPoint axis = Math.Add(info.position, info.axis); FVIL.Data.CFviAngle angle = Math.Invert(info.angle); FVIL.Data.CFviPoint mouse = FVIL.Math.Rotate(info.mouse, axis, angle); FVIL.Data.CFviPoint pos = FVIL.Math.Rotate(current, axis, angle); FVIL.Data.CFviPoint move = Math.Sub(pos, mouse); // 恾宍偺曄宍. bool L = ((rectpos & FVIL.GDI.RectPosition.Left) == FVIL.GDI.RectPosition.Left); bool R = ((rectpos & FVIL.GDI.RectPosition.Right) == FVIL.GDI.RectPosition.Right); bool T = ((rectpos & FVIL.GDI.RectPosition.Top) == FVIL.GDI.RectPosition.Top); bool B = ((rectpos & FVIL.GDI.RectPosition.Bottom) == FVIL.GDI.RectPosition.Bottom); FVIL.Data.CFviRectangle clip = figure.GetClipRect(); if (L && T) { clip.Left = (mouse.X + move.X); clip.Top = (mouse.Y + move.X); } else if (L && B) { clip.Left = (mouse.X + move.X); clip.Bottom = (mouse.Y - move.X); } else if (R && T) { clip.Right = (mouse.X + move.X); clip.Top = (mouse.Y - move.X); } else if (R && B) { clip.Right = (mouse.X + move.X); clip.Bottom = (mouse.Y + move.X); } else if (L) { clip.Left = (mouse.X + move.X); clip.Top += move.X / 2; clip.Bottom -= move.X / 2; } else if (R) { clip.Right = (mouse.X + move.X); clip.Top -= move.X / 2; clip.Bottom += move.X / 2; } else if (T) { clip.Top = (mouse.Y + move.Y); clip.Left += move.Y / 2; clip.Right -= move.Y / 2; } else if (B) { clip.Bottom = (mouse.Y + move.Y); clip.Left -= move.Y / 2; clip.Right += move.Y / 2; } double radius_x = clip.Width / 2; double radius_y = clip.Height / 2; figure.X = clip.X + radius_x; figure.Y = clip.Y + radius_y; if (L || R) { figure.Radius = clip.Width / 2; } else { figure.Radius = clip.Height / 2; } // --- 婡幉偺曗惓. if (angle.Degree != 0.0) { figure.Axis = Math.Sub(axis, figure.Position); } }