未完成的控件
using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;namespace ImageControls
{/// <summary>/// 控件/// </summary> public class ShapeEx : Control{#region 字段private Color _BackColor; //背景顏色/// <summary>/// 必需的設(shè)計(jì)器變量。/// </summary>private Color _BorderColor; //邊框顏色private Point _MouseLocation;private bool _ReSizeble; //是否可調(diào)整大小private int _SelectSelctedIndex; //0-8,0:SizeAllprivate int _SelfHeight;private Point _SelfLocation;private int _SelfWidth;private Rectangle _rectBottomSelector;private Rectangle _rectLeftBottomSelector;private Rectangle _rectLeftSelector;private Rectangle _rectLeftTopSelector;private Rectangle _rectRightBottomSelector;private Rectangle _rectRightSelector;private Rectangle _rectRightTopSelector;private Rectangle _rectTopSelector;private Container components;#region modify by anbyprivate float _ShapeExAngle; //控件的旋轉(zhuǎn)角度private int _ShapeExIsFocus; //0表示沒有獲取焦點(diǎn),1表示獲取焦點(diǎn)#endregion#endregion#region 構(gòu)造函數(shù)public ShapeEx(){// 該調(diào)用是 Windows.Forms 窗體設(shè)計(jì)器所必需的。
InitializeComponent();}#endregion#region 屬性[DefaultValue("Black"), Description("邊框顏色"), Category("Appearance")]public Color BorderColor{get{// Insert code here.return _BorderColor;}set{_BorderColor = value;Invalidate();}}[Description("控件ID號(hào),自增長"), Category("Appearance")]public int ShapeExControlID { get; set; }[Description("用于連接外部控件ID"), Category("Appearance")]public int ShapeExJoinID { get; set; }[DefaultValue("Control"), Description("背景顏色"), Category("Appearance")]public override Color BackColor{get{// Insert code here.return _BackColor;}set{_BackColor = value;Invalidate();}}[DefaultValue(false), Description("運(yùn)行中控件大小是否可拖拽編輯"), Category("Behavior")]public bool ReSizeble{get{// Insert code here.return _ReSizeble;}set{_ReSizeble = value;Invalidate();}}[Description("控件選擇區(qū)域"), Category("Behavior")]public Rectangle SelectRectangle{get{var selectRectangler = new Rectangle();selectRectangler.X = Location.X + 7;selectRectangler.Y = Location.Y + 7;selectRectangler.Height = Height - 15;selectRectangler.Width = Width - 15;return selectRectangler;}}/// <summary>/// 是否被獲取焦點(diǎn)/// </summary>[Description("控件是否獲取焦點(diǎn)"), Category("Focus")]public int ShapeExIsFocus{get { return _ShapeExIsFocus; }set { _ShapeExIsFocus = value; }}[Description("控件旋轉(zhuǎn)角度"), Category("Angle")]public float ShapeExAngle{get { return _ShapeExAngle; }set{_ShapeExAngle = value;this.Invalidate();this.Visible = false;this.Visible = true;}}//CreateParamsprotected override CreateParams CreateParams{get{CreateParams cp = base.CreateParams;cp.ExStyle |= 0x00000020;return cp;}}#endregion#region 私有方法private void DrawSelector(Graphics graphics,Rectangle rect,Point[] Points) {//graphics.TranslateTransform(Pcenter.X, Pcenter.Y);//graphics.RotateTransform(_ShapeExAngle);////恢復(fù)繪圖平面在水平和垂直方向的平移 rPoints[0]//graphics.TranslateTransform(-Pcenter.X, -Pcenter.Y);var SelectorPen = new SolidBrush(Color.White);var borderPen = new Pen(_BorderColor, 1);try{//實(shí)心Point[] LeftPoints = RPoints(getPoint(rect.X - 7, Height / 2 - 3, 6, 6));graphics.FillClosedCurve(SelectorPen, LeftPoints);Point[] TopPoints = RPoints(getPoint(Width / 2 - 3, rect.Y - 7, 6, 6));graphics.FillClosedCurve(SelectorPen, TopPoints);Point[] RightPoints = RPoints(getPoint(rect.X + rect.Width, Height / 2 - 3, 6, 6));graphics.FillClosedCurve(SelectorPen, RightPoints);Point[] BottomPoints = RPoints(getPoint(Width / 2 - 3, rect.Y + rect.Height, 6, 6));graphics.FillClosedCurve(SelectorPen, BottomPoints);Point[] LeftTopPoints = RPoints(getPoint(rect.X - 7, rect.Y - 7, 6, 6));graphics.FillClosedCurve(SelectorPen, LeftTopPoints);Point[] RightTopPoints =RPoints(getPoint(rect.X + rect.Width, rect.Y - 7, 6, 6));graphics.FillClosedCurve(SelectorPen, RightTopPoints);Point[] RightBottomPoints = RPoints(getPoint(rect.X + rect.Width, rect.Y + rect.Height, 6, 6));graphics.FillClosedCurve(SelectorPen, RightBottomPoints);Point[] LeftBottomPoints = RPoints(getPoint(rect.X - 7, rect.Y + rect.Height, 6, 6));graphics.FillClosedCurve(SelectorPen, LeftBottomPoints);//邊框_rectLeftSelector.X = rect.X-7;_rectLeftSelector.Y =Height/2-3;_rectLeftSelector.Height = 6;_rectLeftSelector.Width = 6;var leftRpoints = RPoints(getPoint(_rectLeftSelector.X, _rectLeftSelector.Y, 6, 6));graphics.DrawPolygon(borderPen, leftRpoints);_rectLeftSelector.X = leftRpoints[0].X;_rectLeftSelector.Y = leftRpoints[0].Y;//graphics.DrawRectangle(borderPen, _rectLeftSelector);
_rectTopSelector.X = Width/2 - 3;_rectTopSelector.Y =rect.Y-7;_rectTopSelector.Height = 6;_rectTopSelector.Width = 6;var topRpoints = RPoints(getPoint(_rectTopSelector.X, _rectTopSelector.Y, 6, 6));graphics.DrawPolygon(borderPen, topRpoints);_rectTopSelector.X = topRpoints[0].X;_rectTopSelector.Y = topRpoints[0].Y;//graphics.DrawRectangle(borderPen, _rectTopSelector);
_rectRightSelector.X = rect.X+rect.Width;_rectRightSelector.Y = Height/2-3;_rectRightSelector.Height = 6;_rectRightSelector.Width = 6;var rightRpoints = RPoints(getPoint(_rectRightSelector.X, _rectRightSelector.Y, 6, 6));graphics.DrawPolygon(borderPen, rightRpoints);_rectRightSelector.X = rightRpoints[0].X;_rectRightSelector.Y = rightRpoints[0].Y;//graphics.DrawRectangle(borderPen, _rectRightSelector);
_rectBottomSelector.X = Width/2-3;_rectBottomSelector.Y = rect.Y+rect.Height;_rectBottomSelector.Height = 6;_rectBottomSelector.Width = 6;var bottomRpoints = RPoints(getPoint(_rectBottomSelector.X, _rectBottomSelector.Y, 6, 6));graphics.DrawPolygon(borderPen, bottomRpoints);_rectBottomSelector.X = bottomRpoints[0].X;_rectBottomSelector.Y = bottomRpoints[0].Y;////graphics.DrawRectangle(borderPen, _rectBottomSelector);
_rectLeftTopSelector.X = rect.X-7;_rectLeftTopSelector.Y = rect.Y-7;_rectLeftTopSelector.Width = 6;_rectLeftTopSelector.Height = 6;var lefttopRpoints = RPoints(getPoint(_rectLeftTopSelector.X, _rectLeftTopSelector.Y, 6, 6));graphics.DrawPolygon(borderPen, lefttopRpoints);_rectLeftTopSelector.X = lefttopRpoints[0].X;_rectLeftTopSelector.Y = lefttopRpoints[0].Y;//graphics.DrawRectangle(borderPen, _rectLeftTopSelector);
_rectRightTopSelector.X = rect.X+rect.Width;_rectRightTopSelector.Y = rect.Y-7;_rectRightTopSelector.Width = 6;_rectRightTopSelector.Height = 6;var righttopRpoints= RPoints(getPoint(_rectRightTopSelector.X, _rectRightTopSelector.Y, 6, 6));graphics.DrawPolygon(borderPen, righttopRpoints);_rectRightTopSelector.X = righttopRpoints[0].X;_rectRightTopSelector.Y = righttopRpoints[0].Y;//graphics.DrawRectangle(borderPen, _rectRightTopSelector);
_rectRightBottomSelector.X = rect.X + rect.Width;_rectRightBottomSelector.Y = rect.Y+rect.Height;_rectRightBottomSelector.Width = 6;_rectRightBottomSelector.Height = 6;var rightbottomRpoints = RPoints(getPoint(_rectRightBottomSelector.X, _rectRightBottomSelector.Y, 6, 6));graphics.DrawPolygon(borderPen, rightbottomRpoints);_rectRightBottomSelector.X = rightbottomRpoints[0].X;_rectRightBottomSelector.Y = rightbottomRpoints[0].Y;//graphics.DrawRectangle(borderPen, _rectRightBottomSelector);
_rectLeftBottomSelector.X = rect.X-7;_rectLeftBottomSelector.Y = rect.Y + rect.Height;_rectLeftBottomSelector.Width = 6;_rectLeftBottomSelector.Height = 6;var leftbottompointRPoints = RPoints(getPoint(_rectLeftBottomSelector.X, _rectLeftBottomSelector.Y, 6, 6));graphics.DrawPolygon(borderPen,leftbottompointRPoints);_rectLeftBottomSelector.X = leftbottompointRPoints[0].X;_rectLeftBottomSelector.Y = leftbottompointRPoints[0].Y;//graphics.DrawRectangle(borderPen, _rectLeftBottomSelector);
}catch (Exception E){throw E;}finally{SelectorPen.Dispose();borderPen.Dispose();}}public PointF Pcenter = new PointF();public Point[] rPoints = null;private PointF center = new PointF();private void ReDrawControl(Graphics graphics){try{var borderPen = new Pen(_BorderColor, 1);//繪制邊框 var rectBorder = new Rectangle();rectBorder.X = 7;rectBorder.Y = 7;rectBorder.Height = Height - 15;rectBorder.Width = Width - 15;center = new PointF(this.Width/2, this.Height/2);//算出要平移的坐標(biāo)Point RationPoint = new Point((int)(center.X - rectBorder.Width / 2), (int)(center.Y - rectBorder.Height / 2));//要繪制的矩形var picRect = new RectangleF(RationPoint.X, RationPoint.Y, (float)rectBorder.Width, (float)rectBorder.Height);//圓心坐標(biāo)Pcenter = new PointF(picRect.X + picRect.Width/2, picRect.Y + picRect.Height/2);#region 最后修改PointF leftToppoint = new PointF(picRect.X,picRect.Y);PointF leftBottompoint = new PointF(picRect.X, (picRect.Y + picRect.Height));PointF rightToppoint = new PointF((picRect.X + picRect.Width), picRect.Y);PointF rightBottompoint = new PointF((picRect.X + picRect.Width), (picRect.Y + picRect.Height));rPoints = RPoints(Point.Ceiling(leftToppoint),Point.Ceiling(rightToppoint), Point.Ceiling(rightBottompoint), Point.Ceiling(leftBottompoint));RectangleF controlRect = new RectangleF(this.Location.X, this.Location.Y, this.Width, this.Height);getNewRectangle(rPoints);graphics.DrawPolygon(borderPen, rPoints);#endregion#region 旋轉(zhuǎn)內(nèi),但是無法獲取旋轉(zhuǎn)后的坐標(biāo),程序失控// //繪圖平面以圖片的中心點(diǎn)旋轉(zhuǎn)//graphics.TranslateTransform(Pcenter.X, Pcenter.Y);//graphics.RotateTransform(_ShapeExAngle);////恢復(fù)繪圖平面在水平和垂直方向的平移//graphics.TranslateTransform(-Pcenter.X, -Pcenter.Y);//繪制圖片//graphics.DrawRectangle(borderPen, Rectangle.Ceiling(picRect));//重置繪圖平面的所有變換//graphics.ResetTransform();#endregion#region 圖片旋轉(zhuǎn) 圖片超出邊界////圓心坐標(biāo)//var center = new PointF(rectBorder.Width/2, rectBorder.Height/2);////矩形左上坐標(biāo)//float offsetX = 0;//float offsetY = 0;//offsetX = center.X - rectBorder.Width/2;//offsetY = center.Y - rectBorder.Height/2;////要畫的圖//var picRect = new RectangleF(offsetX, offsetY, rectBorder.Width, rectBorder.Height);//var Pcenter = new PointF(picRect.X + picRect.Width/2, picRect.Y + picRect.Height/2);////讓圖片繞中心旋轉(zhuǎn)一周////for (int i = 0; i < 361; i += 10)
////{//var changeRect = new Rectangle((int) picRect.X, (int) picRect.Y, (int) picRect.Width,// (int) picRect.Height);////繪圖平面以圖片的中心點(diǎn)旋轉(zhuǎn)//graphics.TranslateTransform(Pcenter.X, Pcenter.Y);//graphics.RotateTransform(_ShapeExAngle);////恢復(fù)繪圖平面在水平和垂直方向的平移//graphics.TranslateTransform(-Pcenter.X, -Pcenter.Y);////繪制圖片并延時(shí)//graphics.DrawRectangle(borderPen, changeRect);////重置繪圖平面的所有變換//graphics.ResetTransform();////}#endregion//繪制編輯框if (_ReSizeble){DrawSelector(graphics,Rectangle.Ceiling(picRect),rPoints);}}catch (Exception E){throw E;}finally{graphics.Dispose();}}/// <summary>/// 根據(jù)數(shù)組坐標(biāo)獲取新的矩形/// </summary>/// <param name="rPoints"></param>private void getNewRectangle(Point[] rPoints){try{int maxCoorX = getPointCoorX(rPoints, true);int minCoorX = getPointCoorX(rPoints, false);int maxCoorY = getPointCoorY(rPoints, true);int minCoorY = getPointCoorY(rPoints, false);//獲得width和heightdouble width = Math.Sqrt(maxCoorX*maxCoorX + minCoorX*minCoorX);double height = Math.Sqrt(maxCoorY*maxCoorY + minCoorY*minCoorY);_SelfWidth = (int) width;_SelfHeight = (int) height;}catch (Exception){}}private PointF[] getPointF(int x, int y, int Width, int Height){var point1 = new PointF(x, y);var point2 = new PointF(x + Width, y);var point3 = new PointF(x + Width, y + Height);var point4 = new PointF(x, y + Height);PointF[] points = {point1, point2, point3, point4};return points;}private Point[] getPoint(int x, int y, int Width, int Height){ var point1 = new Point(x, y);var point2 = new Point(x + Width, y);var point3 = new Point(x + Width, y + Height);var point4 = new Point(x, y + Height);Point[] points = { point1, point2, point3, point4 };return points;}protected override void Dispose(bool disposing){if (disposing){if (components != null)components.Dispose();}base.Dispose(disposing);}#endregion#region 組件設(shè)計(jì)器生成的代碼private void InitializeComponent(){components = new Container();Resize += ShapeEx_Resize;MouseDown += ShapeEx_MouseDown;MouseMove += ShapeEx_MouseMove;MouseLeave += ShapeEx_MouseLeave;MouseUp += ShapeEx_MouseUp;//this.GotFocus += new EventHandler(ShapeEx_GotFocus);//this.LostFocus += new EventHandler(ShapeEx_LostFocus);
_ShapeExAngle = 30;_BorderColor = Color.Black;_BackColor = Color.FromName("Control");_ReSizeble = false;_SelectSelctedIndex = -1;SetStyle(ControlStyles.SupportsTransparentBackColor| ControlStyles.UserPaint| ControlStyles.AllPaintingInWmPaint| ControlStyles.Opaque, true);BackColor = Color.Transparent;}#endregion#region 事件protected override void OnPaint(PaintEventArgs pe){base.OnPaint(pe);ReDrawControl(pe.Graphics);}private void ShapeEx_Resize(object sender, EventArgs e){if (Width < 16 || Height < 16){Width = 16;Height = 16;}Invalidate();}private void ShapeEx_MouseDown(object sender, MouseEventArgs e){_ShapeExIsFocus = 1;if (_ReSizeble){if (_rectLeftSelector.Contains(e.X, e.Y) ||_rectRightSelector.Contains(e.X, e.Y) ||_rectTopSelector.Contains(e.X, e.Y) ||_rectBottomSelector.Contains(e.X, e.Y) ||_rectLeftTopSelector.Contains(e.X, e.Y) ||_rectRightTopSelector.Contains(e.X, e.Y) ||_rectRightBottomSelector.Contains(e.X, e.Y) ||_rectLeftBottomSelector.Contains(e.X, e.Y)){if (_rectLeftTopSelector.Contains(e.X, e.Y)){Cursor = Cursors.SizeNWSE;_SelectSelctedIndex = 1;}if (_rectTopSelector.Contains(e.X, e.Y)){Cursor = Cursors.SizeNS;_SelectSelctedIndex = 2;}if (_rectRightTopSelector.Contains(e.X, e.Y)){Cursor = Cursors.SizeNESW;_SelectSelctedIndex = 3;}if (_rectRightSelector.Contains(e.X, e.Y)){Cursor = Cursors.SizeWE;_SelectSelctedIndex = 4;}if (_rectRightBottomSelector.Contains(e.X, e.Y)){Cursor = Cursors.SizeNWSE;_SelectSelctedIndex = 5;}if (_rectBottomSelector.Contains(e.X, e.Y)){Cursor = Cursors.SizeNS;_SelectSelctedIndex = 6;}if (_rectLeftBottomSelector.Contains(e.X, e.Y)){Cursor = Cursors.SizeNESW;_SelectSelctedIndex = 7;}if (_rectLeftSelector.Contains(e.X, e.Y)){Cursor = Cursors.SizeWE;_SelectSelctedIndex = 8;}}else{Cursor = Cursors.SizeAll;_SelectSelctedIndex = 0;}_SelfLocation.X = Location.X;_SelfLocation.Y = Location.Y;_MouseLocation.X = Cursor.Position.X;_MouseLocation.Y = Cursor.Position.Y;_SelfWidth = Width;_SelfHeight = Height;}}private void ShapeEx_MouseMove(object sender, MouseEventArgs e){//move and resizeswitch (_SelectSelctedIndex){case 0:Location = new Point(Cursor.Position.X - (_MouseLocation.X - _SelfLocation.X),Cursor.Position.Y - (_MouseLocation.Y - _SelfLocation.Y));break;case 1:Height = _SelfHeight - (Cursor.Position.Y - _MouseLocation.Y);Width = _SelfWidth - (Cursor.Position.X - _MouseLocation.X);Location = new Point(Cursor.Position.X - _MouseLocation.X + _SelfLocation.X,Cursor.Position.Y - _MouseLocation.Y + _SelfLocation.Y);break;case 2:Height = _SelfHeight - (Cursor.Position.Y - _MouseLocation.Y);Location = new Point(_SelfLocation.X, Cursor.Position.Y - _MouseLocation.Y + _SelfLocation.Y);break;case 3:Height = _SelfHeight - (Cursor.Position.Y - _MouseLocation.Y);Width = _SelfWidth + (Cursor.Position.X - _MouseLocation.X);Location = new Point(_SelfLocation.X, Cursor.Position.Y - (_MouseLocation.Y - _SelfLocation.Y));break;case 4:Width = _SelfWidth + (Cursor.Position.X - _MouseLocation.X);break;case 5:Height = _SelfHeight + (Cursor.Position.Y - _MouseLocation.Y);Width = _SelfWidth + (Cursor.Position.X - _MouseLocation.X);break;case 6:Height = _SelfHeight + (Cursor.Position.Y - _MouseLocation.Y);break;case 7:Height = _SelfHeight + (Cursor.Position.Y - _MouseLocation.Y);Width = _SelfWidth - (Cursor.Position.X - _MouseLocation.X);Location = new Point(Cursor.Position.X - _MouseLocation.X + _SelfLocation.X, _SelfLocation.Y);break;case 8:Width = _SelfWidth - (Cursor.Position.X - _MouseLocation.X);Location = new Point(Cursor.Position.X - _MouseLocation.X + _SelfLocation.X, _SelfLocation.Y);break;}Invalidate();}private void ShapeEx_MouseLeave(object sender, EventArgs e){Cursor = Cursors.Default;_SelectSelctedIndex = -1;}private void ShapeEx_MouseUp(object sender, MouseEventArgs e){_ShapeExIsFocus = 0;Cursor = Cursors.Default;_SelectSelctedIndex = -1;}/// <summary>/// 用于減少畫面閃爍效果及刷新控件/// </summary>/// <param name="e"></param>protected override void OnLocationChanged(EventArgs e){Visible = false;Visible = true;}#endregion/// <summary> /// 對(duì)一個(gè)坐標(biāo)點(diǎn)按照一個(gè)中心進(jìn)行旋轉(zhuǎn) /// </summary> /// <param name="center">中心點(diǎn)</param> /// <param name="p1">要旋轉(zhuǎn)的點(diǎn)</param> /// <param name="angle">旋轉(zhuǎn)角度,笛卡爾直角坐標(biāo)</param> /// <returns></returns> private Point PointRotate(Point center, Point p1, double angle){Point tmp = new Point();double angleHude = angle * Math.PI / 180;/*角度變成弧度*/double x1 = (p1.X - center.X) * Math.Cos(angleHude) + (p1.Y - center.Y) * Math.Sin(angleHude) + center.X;double y1 = -(p1.X - center.X) * Math.Sin(angleHude) + (p1.Y - center.Y) * Math.Cos(angleHude) + center.Y;tmp.X = (int)x1;tmp.Y = (int)y1;return tmp;}/// <summary>/// 根據(jù)rectangle的4個(gè)頂點(diǎn)獲取旋轉(zhuǎn)后的坐標(biāo)/// </summary>/// <param name="leftToppoint">左上角坐標(biāo)</param>/// <param name="leftBottompoint">左下腳坐標(biāo)</param>/// <param name="rightToppoint">右上角坐標(biāo)</param>/// <param name="rightBottompoint">右下角坐標(biāo)</param>/// <returns>旋轉(zhuǎn)后的4點(diǎn)坐標(biāo)</returns>private Point[] RPoints(Point leftToppoint, Point rightToppoint, Point rightBottompoint, Point leftBottompoint){//旋轉(zhuǎn)后的點(diǎn)Point rationleftToppoint = PointRotate(Point.Ceiling(Pcenter), leftToppoint, _ShapeExAngle);Point rationleftBottompoint = PointRotate(Point.Ceiling(Pcenter), leftBottompoint, _ShapeExAngle);Point rationrightToppoint = PointRotate(Point.Ceiling(Pcenter), rightToppoint, _ShapeExAngle);Point rationrightBottompoint = PointRotate(Point.Ceiling(Pcenter), rightBottompoint, _ShapeExAngle);Point[] rPoints ={rationleftToppoint, rationrightToppoint, rationrightBottompoint, rationleftBottompoint};return rPoints;}/// <summary>/// 根據(jù)rectangle的4個(gè)頂點(diǎn)獲取旋轉(zhuǎn)后的坐標(biāo)/// </summary>/// <param name="points">左上角坐標(biāo),左下腳坐標(biāo),右上角坐標(biāo),右下角坐標(biāo) </param>/// <returns>旋轉(zhuǎn)后的4點(diǎn)坐標(biāo)</returns>private Point[] RPoints(Point[] points){//旋轉(zhuǎn)后的點(diǎn) Point rationleftToppoint = PointRotate(Point.Ceiling(Pcenter), points[0], _ShapeExAngle);Point rationrightToppoint = PointRotate(Point.Ceiling(Pcenter), points[1], _ShapeExAngle);Point rationrightBottompoint = PointRotate(Point.Ceiling(Pcenter), points[2], _ShapeExAngle);Point rationleftBottompoint = PointRotate(Point.Ceiling(Pcenter), points[3], _ShapeExAngle);Point[] rPoints ={rationleftToppoint, rationrightToppoint, rationrightBottompoint, rationleftBottompoint};return rPoints;}private int getPointCoorX (Point[] arr,bool isMax){if (arr == null){throw new Exception();}int max = 0;int[] myarr = new int[5];for (int i = 0; i < arr.Length - 1; i++){myarr[i] = arr[i].X;}Array.Sort(myarr);if (isMax){return myarr[myarr.Length - 1];}else{return myarr[0];}}private int getPointCoorY(Point[] arr,bool isMax){if (arr == null){throw new Exception();}int max = 0;int[] myarr = new int[5];for (int i = 0; i < arr.Length - 1; i++){myarr[i] = arr[i].Y;}Array.Sort(myarr);if (isMax){return myarr[myarr.Length - 1];}else{return myarr[0];}}}} View Code
?
轉(zhuǎn)載于:https://www.cnblogs.com/anbylau2130/p/3174034.html
總結(jié)
- 上一篇: 压力测试工具介绍
- 下一篇: 存储过程里调用另一个存储过程的值