C# Winform 直线控件LineShape 移动事件问题

问题描述

准备开发一个小程序(类型画图程序的设计器),需要借用直线VS自带的控件Microsoft.VisualBasic.PowerPacksLineShape(重新画就算了,毕竟VS有这个东西了)用户可以用鼠标随意移动控件,就是在VS开发中一样,主要功能就是:鼠标移动控件,拉长、拉短。自己随即就想到使用MouseDownMouseMove事件,于是自己就写了一下,但是写出来后,很是奇怪,鼠标移动是,【??一卡一卡的,有时可以移动,有时不会移动???】有时突然跑了很远的距离,调了多久都没有成功,所有把代码贴出来,请大家给指点一下使用C#开发,引用usingMicrosoft.VisualBasic.PowerPacks;usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingMicrosoft.VisualBasic.PowerPacks;namespaceWinDrawTest{publicpartialclassfrmLineCS:Form{publicLineShapeSelectedControl_line=newLineShape();publicfrmLineCS(){InitializeComponent();}///<summary>///画直线///</summary>privatevoidbtnLine_Click(objectsender,EventArgse){ShapeContainercanvas=newShapeContainer();LineShapectrl=newLineShape();canvas.Parent=this.MYpaint;ctrl.Parent=canvas;ctrl.StartPoint=newSystem.Drawing.Point(22,58);//初始开始坐标ctrl.EndPoint=newSystem.Drawing.Point(80,80);//初始结束坐标ctrl.MouseEnter+=newEventHandler(controlLine_MouseEnter);//运行控件事件:鼠标进入控件可见区域ctrl.MouseLeave+=newEventHandler(controlLine_MouseLeave);//运行控件事件:鼠标离开控件可见区域ctrl.MouseDown+=newMouseEventHandler(controlLine_MouseDown);//运行控件事件:鼠标按下事件ctrl.MouseMove+=newMouseEventHandler(controlLine_MouseMove);//运行控件事件:鼠标移动ctrl.MouseUp+=newMouseEventHandler(controlLine_MouseUp);//运行控件事件:鼠标松开事件MYpaint.Invalidate();SelectedControl_line=ctrl;//记录当前控件properControl.SelectedObject=ctrl;//当前控件属性显示}///<summary>///运行控件事件:鼠标进入控件可见区域///</summary>privatevoidcontrolLine_MouseEnter(objectsender,EventArgse){//鼠标样式Cursor=Cursors.SizeAll;}///<summary>///运行控件事件:鼠标离开控件可见区域///</summary>privatevoidcontrolLine_MouseLeave(objectsender,EventArgse){//鼠标样式Cursor=Cursors.Default;}///<summary>///移动按钮点击直线控件XY坐标自动加1移动///</summary>privatevoidbutton1_Click(objectsender,EventArgse){if(this.SelectedControl_line!=null){LineShapecontrol=(LineShape)SelectedControl_line;control.X1+=1;control.Y1+=1;control.X2+=1;control.Y2+=1;properControl.SelectedObject=control;}}PointLineBegin=newPoint();PointLineEnd=newPoint();PointmPos=newPoint();///<summary>///运行控件事件:鼠标按下事件///</summary>privatevoidcontrolLine_MouseDown(objectsender,MouseEventArgse){if(e.Button==MouseButtons.Left){MYpaint.Invalidate();//unselectothercontrolSelectedControl_line=(LineShape)sender;LineShapecontrol=(LineShape)sender;LineBegin=control.StartPoint;LineEnd=control.EndPoint;mPos=MYpaint.PointToClient(MousePosition);log.Text+="鼠标按下记录X:"+mPos.X+"当前Y:"+mPos.Y+"rn";log.Text+="鼠标按下记录开始坐标X:"+control.StartPoint.X+"Y:"+control.StartPoint.Y+"rn";log.Text+="鼠标按下记录结果坐标X:"+control.EndPoint.X+"Y:"+control.EndPoint.Y+"rn";control.Invalidate();}}///<summary>///运行控件事件:鼠标移动///</summary>privatevoidcontrolLine_MouseMove(objectsender,MouseEventArgse){if(e.Button==MouseButtons.Left){LineShapecontrol=(LineShape)sender;PointmPos1=MYpaint.PointToClient(MousePosition);log.Text+="当前X:"+mPos1.X+"Y:"+mPos1.Y+"rn";mPos1.Offset(-mPos.X,-mPos.Y);log.Text+="偏移X:"+mPos1.X+"Y:"+mPos1.Y+"rn";//控件坐标移动control.X1=LineBegin.X+mPos1.X;control.Y1=LineBegin.Y+mPos1.Y;control.X2=LineEnd.X+mPos1.X;control.Y2=LineEnd.Y+mPos1.Y;//control.X1+=1;//control.Y1+=1;//control.X2+=1;//control.Y2+=1;log.Text+="LineBegin:"+control.StartPoint.X+"LineBegin:"+control.StartPoint.Y+"rn";log.Text+="LineEnd:"+control.EndPoint.X+"LineEnd:"+control.EndPoint.Y+"rn";properControl.SelectedObject=control;Invalidate();return;}}///<summary>///运行控件事件:鼠标松开///</summary>privatevoidcontrolLine_MouseUp(objectsender,MouseEventArgse){if(e.Button==MouseButtons.Left){LineShapecontrol=(LineShape)sender;Cursor.Clip=System.Drawing.Rectangle.Empty;control.Invalidate();}}}}

解决方案

解决方案二:
开双缓冲,换cskin或者dskin,换d2d
解决方案三:
开双缓冲SetStyle(ControlStyles.ResizeRedraw,true);SetStyle(ControlStyles.OptimizedDoubleBuffer,true);SetStyle(ControlStyles.AllPaintingInWmPaint,true);加上没有用啊????

时间: 2024-07-30 16:31:44

C# Winform 直线控件LineShape 移动事件问题的相关文章

C# winform 图像处理 同一个控件多个事件的处理

问题描述 C# winform 图像处理 同一个控件多个事件的处理 大神们,我又来了,就是同一个picturebox上面需要写多个MouthUp事件的话该怎么弄啊,改怎么区分这几个up事件啊? 解决方案 是 Mouse Up 吧? 如果是 Mouse Up 是不可能同时产生的,否则就是多点触控了. 如果是多点触控,则需要专门的消息,而不是响应 Mouse Up 消息. 解决方案二: 你可以设置不同的标志位来判断,比如不同的bool变量来区分

winform分页控件 附源码下载_C#教程

以前都是从事B/S开发,由于公司有个比较大的C/S项目,在使用DATAGRIDVIEW的时候,显示数据量比较大,所以才用分页模式,也不知道这样是否正确.  想找个C/S下面的分页控件,都没有什么好的,就自己跟B/S下的分页控件,修改成WINFORM下面的.  首先创建一个用户控件名称为pager,在控件中拖入bindingNavigator和bindingSource,修改bindingNavigator,加入必要的一些控件.  效果如下: 代码实现如下: namespace WindowsAp

Winform分页控件使用详细介绍

自从上篇随笔<Winform分页控件最新版本发布,并提供基于DotNetBar界面的版本>介绍了最新版本的分页控件,并提供下载使用后,很多人对分页控件非常感兴趣(毕竟Winform数据分页是很常见的),并关注该分页控件应该如何使用,其实分页控件在之前很多篇随笔中断断续续都有介绍,为了使大家对分页控件有个系统的认识,本篇详细介绍分页控件的一些属性设置及相关使用注意事项,使大家对该分页控件有一个更深的了解.跟系统的认识,以便在相关的项目开发中熟练使用.分页控件效果     实现步骤  1.在Vis

Winform分页控件重大更新,并实现普通版、DotNetBar、DevExpress三大版本整合更新(附各种例子源码)

在Winform开发中,一直离不开分页处理,好的分页控件封装,能为开发节省很多时间和繁琐工作,对分页控件一直的改进和完善,也是我的兴趣之一.本次主要实现对分页控件的全面重构,优化功能及界面的处理,并统一完成普通版.基于DotNetbar界面控件版本.DevExpress界面控件版本三大版本的发布,这几个界面版本,除了界面表现效果不一样外,所有的功能展示及使用代码完全一致,保证用户的知识投资及给客户良好的使用操作.本次主要增加的功能有:可通过界面设置列表显示的列,可复制选定的行信息,可设置显示的行

泛型-c# 动态创建控件 及触发事件 即插即用。

问题描述 c# 动态创建控件 及触发事件 即插即用. 各大大好,初来驾到,请大家多多关照,问题是这样的.需求 :需要动态添加控件.然后需要项目做出来后要实现"即插即用"的特点.(即插即用:我们要是更新一个功能,用户只要更新这个控件就可以直接使用,而不用更新整个客服端)问题 :知道要用泛型来写,但是看了一天了,不知道如何下手,现已写了如下代码:using System;using System.Collections.Generic;using System.Linq;using Sys

ASP.NET开发系列之在用户控件中添加事件

asp.net|控件 在<在用户控件中添加属性>这一篇文章中我们演示了如何在用户控件中添加属性,接下来我们演示如何在用户控件中添加事件. 在<在用户控件中添加属性>这一篇文章中我们定义了一个用户登录的用户控件UserLogin.ascx 文件,里面包含了一个LinkButton服务器按钮控件,当用户单击该按钮时服务器端会自动生成一个回发来激发Page.Load事件.除了服务器自动产生回发来激发Page.Load事件外,我们可以给LinkButton添加一个它自己的事件,添加事件其实

为.net中的ListBox控件添加双击事件

控件 我在用dotnet做一个项目的过程中,遇到了一个ListBox的问题:通过在一个ListBox中双击,把选中的项添加到另一个ListBox中,但ListBox控件本身并没有该事件,那么如何实现呢?我就想到了客户端脚本javascrit,通过查阅相关资料,终于把这个问题解决了,现在写出来与大家分享,希望能对大家有所帮助.        这里有三个问题:        第一:双击所要执行的javascript代码是什么?                    注意:javascript代码的语

Android绑定添加了注解的控件,及其事件方法

  Android绑定添加了注解的控件,及其事件方法.根据成员方法的注解进行绑定,根据成员变量的注解进行绑定,设置事件的监听器,对控件赋值,注意:它必须在activity调用了setContentView之后调用.

jQuery的控件及事件(输入控件及回车事件)使用示例

本文为大家介绍下jQuery的输入控件及回车事件的应用,具体示例代码如下,感兴趣的朋友可以参考下哈,希望对大家有所帮助   复制代码 代码如下: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>JavaScript</title> <style type="te