当前位置: 首页 > news >正文

北京智能模板建站WordPress报价表

北京智能模板建站,WordPress报价表,怎么做二维码转到网站,seo综合查询平台官网这个示例允许用户绘制和移动线段。它允许您根据鼠标下方的内容执行三种不同的操作。 当鼠标位于某个线段上时#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(); }
http://www.w-s-a.com/news/182774/

相关文章:

  • 哈尔滨建站怎么做广西seo快速排名
  • 公司网站建设的不足企业文档管理wordpress
  • .net做的网站代码网站怎么加二级域名
  • 网站建设方案对比分析报告成都短视频代运营
  • 企业所得税税率知多少重庆seo什么意思
  • ftp如何修改网站备案号百度云建站
  • 免费做网站空间dede二手车网站源码
  • 网站服务器需要多大设计网站公司开发
  • asp 网站权限设计做网站业务员
  • 做棋牌网站违法嘛网络服务网络推广
  • 专门做推广的网站吗免费建域名网站
  • 在百度做网站株洲网站平台搭建
  • 用node做的网站南宁网站定制开发
  • 做刷单网站犯法吗wordpress depth
  • 潍坊青州网站建设少儿编程app
  • 表白网站制作源代码自己怎么免费做网站网页
  • 开源网站建设是什么工作个人虚拟网站
  • 网站制作的一般过程优化关键词排名公司
  • 如何使用阿里云建设网站网站两边广告
  • 互联网信息服务小红书seo是什么意思
  • 深圳市南山区建设局网站公司简介网页
  • 免费小程序制作软件爱站网站seo查询工具
  • 承接电商网站建设缔烨建设公司网站
  • 网站运营介绍十大国外室内设计网站
  • 网站建设完毕后怎么加后台电影购买网站怎么设计
  • 空间ip地址访问网站音乐分享 wordpress
  • 做网站一单能挣多少wordpress主题文件夹在哪
  • 视频社区app源码台州优化网站
  • 保定高端网站建设做微商好还是开网站好
  • 有什么方法在淘宝发布网站建设设计wordpress评分