网站几个模板最好做网站建设一般多少钱
- 作者: 五速梦信息网
- 时间: 2026年04月20日 07:55
当前位置: 首页 > news >正文
网站几个模板最好,做网站建设一般多少钱,安阳网站建设推广优化,杭州专业网站优化公司这个示例允许用户绘制和移动线段。它允许您根据鼠标下方的内容执行三种不同的操作。 当鼠标位于某个线段上时#xff0c;光标会变成手的形状。然后您可以单击并拖动来移动该线段。当鼠标位于线段的终点上时#xff0c;光标会变成箭头。然后您可以单击并拖动以移动终点。当鼠…这个示例允许用户绘制和移动线段。它允许您根据鼠标下方的内容执行三种不同的操作。 当鼠标位于某个线段上时光标会变成手的形状。然后您可以单击并拖动来移动该线段。当鼠标位于线段的终点上时光标会变成箭头。然后您可以单击并拖动以移动终点。当鼠标悬停在空白处时您可以单击并拖动来绘制新的线段。 程序使用MouseDown、MouseMove和MouseUp事件处理所有这些情况但在一组事件处理程序中处理所有可能的组合会造成混乱。为了便于管理程序使用单独的MouseMove和MouseUp事件处理程序来执行不同的任务。 这篇文章分为以下几个部分与程序的基本状态相对应。 绘画什么都没动绘制新线段移动端点移动线段下一步是什么 绘画 程序将线段端点的坐标存储在列表Pt1和Pt2中。 // The points that make up the line segments. private List Pt1 new ListPoint(); private List Pt2 new ListPoint(); 绘制新线段时变量IsDrawing为真程序将新线段的端点存储在变量NewPt1和NewPt2中。 // Points for the new line. private bool IsDrawing false; private Point NewPt1, NewPt2; Paint事件处理 程序只是循环遍历Pt1和Pt2列表绘制线段及其端点。然后绘制新线如果您正在绘制一条线。 // Draw the lines. private void picCanvas_Paint(object sender, PaintEventArgs e) {// Draw the segments.for (int i 0; i Pt1.Count; i){// Draw the segment.e.Graphics.DrawLine(Pens.Blue, Pt1[i], Pt2[i]);}// Draw the end points.foreach (Point pt in Pt1){Rectangle rect new Rectangle(pt.X - object_radius, pt.Y - object_radius,2 * object_radius 1, 2 * object_radius 1);e.Graphics.FillEllipse(Brushes.White, rect);e.Graphics.DrawEllipse(Pens.Black, rect);}foreach (Point pt in Pt2){Rectangle rect new Rectangle(pt.X - object_radius, pt.Y - object_radius,2 * object_radius 1, 2 * object_radius 1);e.Graphics.FillEllipse(Brushes.White, rect);e.Graphics.DrawEllipse(Pens.Black, rect);}// If theres a new segment under constructions, draw it.if (IsDrawing){e.Graphics.DrawLine(Pens.Red, NewPt1, NewPt2);} } 什么都没动 如果鼠标移动而您没有移动线段或终点则会执行以下事件处理程序。 // The mouse is up. See whether were over an end point or segment. private void picCanvas_MouseMove_NotDown(object sender,MouseEventArgs e) {Cursor new_cursor Cursors.Cross;// See what were over.Point hit_point;int segment_number;if (MouseIsOverEndpoint(e.Location, out segment_number,out hit_point))new_cursor Cursors.Arrow;else if (MouseIsOverSegment(e.Location, out segment_number))new_cursor Cursors.Hand;// Set the new cursor.if (picCanvas.Cursor ! new_cursor)picCanvas.Cursor new_cursor; } 此代码调用后面描述的MouseIsOverEndPoint和MouseIsOverSegment方法来查看鼠标是否位于任何有趣的东西上。然后它显示相应的光标。如果位于端点上则显示箭头如果位于线段上则显示移交如果位于空处则显示交叉。 如果您没有移动任何内容并按下鼠标则会执行以下事件处理程序。 // See what were over and start doing whatever is appropriate. private void picCanvas_MouseDown(object sender, MouseEventArgs e) {// See what were over.Point hit_point;int segment_number;if (MouseIsOverEndpoint(e.Location, out segment_number,out hit_point)){// Start moving this end point.picCanvas.MouseMove - picCanvas_MouseMove_NotDown;picCanvas.MouseMove picCanvas_MouseMove_MovingEndPoint;picCanvas.MouseUp picCanvas_MouseUp_MovingEndPoint;// Remember the segment number.MovingSegment segment_number;// See if were moving the start end point.MovingStartEndPoint (Pt1[segment_number].Equals(hit_point));// Remember the offset from the mouse to the point.OffsetX hit_point.X - e.X;OffsetY hit_point.Y - e.Y;}else if (MouseIsOverSegment(e.Location, out segment_number)){// Start moving this segment.picCanvas.MouseMove - picCanvas_MouseMove_NotDown;picCanvas.MouseMove picCanvas_MouseMove_MovingSegment;picCanvas.MouseUp picCanvas_MouseUp_MovingSegment;// Remember the segment number.MovingSegment segment_number;// Remember the offset from the mouse// to the segments first point.OffsetX Pt1[segment_number].X - e.X;OffsetY Pt1[segment_number].Y - e.Y;}else{// Start drawing a new segment.picCanvas.MouseMove - picCanvas_MouseMove_NotDown;picCanvas.MouseMove picCanvas_MouseMove_Drawing;picCanvas.MouseUp picCanvas_MouseUp_Drawing;IsDrawing true;NewPt1 new Point(e.X, e.Y);NewPt2 new Point(e.X, e.Y);} } 此方法使用MouseIsOverEndPoint和MouseIsOverSegment方法来查看鼠标是否位于任何有趣的对象上。如果鼠标位于端点或线段上则代码开始移动该对象。 注意代码如何卸载picCanvas_MouseMove_NotDown事件处理程序并为其启动的操作 安装新的MouseMove和MouseUp事件处理程序。 以下代码显示MouseIsOverEndPoint和MouseIsOverSegment方法。 // See if the mouse is over an end point. private bool MouseIsOverEndpoint(Point mouse_pt,out int segment_number, out Point hit_pt) {for (int i 0; i Pt1.Count; i ){// Check the starting point.if (FindDistanceToPointSquared(mouse_pt, Pt1[i]) over_dist_squared){// Were over this point.segment_number i;hit_pt Pt1[i];return true;}// Check the end point.if (FindDistanceToPointSquared(mouse_pt, Pt2[i]) over_dist_squared){// Were over this point.segment_number i;hit_pt Pt2[i];return true;}}segment_number -1;hit_pt new Point(-1, -1);return false; }// See if the mouse is over a line segment. private bool MouseIsOverSegment(Point mouse_pt,out int segment_number) {for (int i 0; i Pt1.Count; i){// See if were over the segment.PointF closest;if (FindDistanceToSegmentSquared(mouse_pt, Pt1[i], Pt2[i], out closest) over_dist_squared){// Were over this segment.segment_number i;return true;}}segment_number -1;return false; } 这些方法只是调用FindDistanceToPointSquared和FindDistanceToSegmentSquared方法。FindDistanceToPointSquared很简单。有关FindDistanceToSegmentSquared工作原理的说明请参阅文章“在 C# 中查找点和线段之间的最短距离”。 该程序测试距离的平方因此不需要计算平方根因为平方根相对较慢。请注意当且仅当 x 2 y 2时x y 才成立因此此测试仍可确定对象是否在鼠标所需的距离内。 绘制新线段 以下代码显示了绘制新线段时处于活动状态的 MouseMove和MouseUp事件处理程序。 // Were drawing a new segment. private void picCanvas_MouseMove_Drawing(object sender,MouseEventArgs e) {// Save the new point.NewPt2 new Point(e.X, e.Y);// Redraw.picCanvas.Invalidate(); }// Stop drawing. private void picCanvas_MouseUp_Drawing(object sender,MouseEventArgs e) {IsDrawing false;// Reset the event handlers.picCanvas.MouseMove - picCanvas_MouseMove_Drawing;picCanvas.MouseMove picCanvas_MouseMove_NotDown;picCanvas.MouseUp - picCanvas_MouseUp_Drawing;// Create the new segment.Pt1.Add(NewPt1);Pt2.Add(NewPt2);// Redraw.picCanvas.Invalidate(); } 当鼠标移动时MouseMove事件处理程序会更新NewPt2的值以保存鼠标的当前位置。然后它使程序的PictureBox无效以便其Paint事件处理程序绘制当前段和正在进行的新段。 当释放鼠标时MouseUp事件处理程序将恢复“不移动任何内容”事件处理程序将新段的点添加到Pt1和Pt2列表中并使PictureBox无效以重新绘制。 移动端点 以下代码显示了移动端点时处于活动状态的 MouseMove和MouseUp事件处理程序 3 当鼠标移动时MouseMove事件处理程序会更新移动点的位置然后使PictureBox无效并使其重新绘制。MouseUp事件处理程序只是恢复“不移动任何内容”事件处理程序并重新绘制。 移动线段 以下代码显示了移动端点时处于活动状态的 MouseMove和MouseUp事件处理程序。 3 当鼠标移动时MouseMove事件处理程序会更新线段端点的位置并重绘以显示新位置。MouseUp事件处理程序只是恢复“不移动任何内容”事件处理程序并重绘。 另允许您将线段和端点捕捉到网格。 当绘图PictureBox调整大小或者选中或取消选中“对齐网格”复选框时程序将调用以下代码所示的 MakeBackgroundGrid方法。 如果未选中复选框则此方法将picCanvas控件的背景设置为 null。否则它将制作一个适合PictureBox 的位图在其上绘制点以显示网格并将PictureBox的BackgroundImage属性设置为位图。 程序的另一个变化是它处理新点的方式。每当程序要对某个点执行某些操作时它都会调用以下SnapToGrid方法将该点的坐标捕捉到网格如果合适。 该方法将其x和y参数四舍五入为网格大小的最接近倍数。 以下代码显示了程序如何使用SnapToGrid方法的示例。当用户移动线段的终点时将执行此事件处理程序。 private void MakeBackgroundGrid() {if (!chkSnapToGrid.Checked){picCanvas.BackgroundImage null;}else{Bitmap bm new Bitmap(picCanvas.ClientSize.Width, picCanvas.ClientSize.Height);for (int x 0; x picCanvas.ClientSize.Width;x grid_gap){for (int y 0; y picCanvas.ClientSize.Height;y grid_gap){bm.SetPixel(x, y, Color.Black);}}picCanvas.BackgroundImage bm;} } // Snap to the nearest grid point. private void SnapToGrid(ref int x, ref int y) {if (!chkSnapToGrid.Checked) return;x grid_gap * (int)Math.Round((double)x / grid_gap);y grid_gap * (int)Math.Round((double)y / grid_gap); } // Were moving an end point. private void picCanvas_MouseMove_MovingEndPoint(object sender, MouseEventArgs e) {// Move the point to its new location.int x e.X OffsetX;int y e.Y OffsetY;SnapToGrid(ref x, ref y);if (MovingStartEndPoint)Pt1[MovingSegment] new Point(x, y);elsePt2[MovingSegment] new Point(x, y);// Redraw.picCanvas.Invalidate(); }
- 上一篇: 网站集约建设后网站域名规范人人建站
- 下一篇: 网站计数器代码js公司网站怎么做简介
相关文章
-
网站集约建设后网站域名规范人人建站
网站集约建设后网站域名规范人人建站
- 技术栈
- 2026年04月20日
-
网站集约建设后网站域名规范wordpress默认分类链接
网站集约建设后网站域名规范wordpress默认分类链接
- 技术栈
- 2026年04月20日
-
网站集约化建设项目内容嘉兴网站关键词推广
网站集约化建设项目内容嘉兴网站关键词推广
- 技术栈
- 2026年04月20日
-
网站计数器代码js公司网站怎么做简介
网站计数器代码js公司网站怎么做简介
- 技术栈
- 2026年04月20日
-
网站计算机培训机构哪个最好高密建设局网站
网站计算机培训机构哪个最好高密建设局网站
- 技术栈
- 2026年04月20日
-
网站计算器代码坪山网站建设渠道
网站计算器代码坪山网站建设渠道
- 技术栈
- 2026年04月20日
