我现在要实现类似Windows中画图板的功能,现在遇到一个问题,就是鼠标按下,选择起点,在鼠标移动的过程中,去除旧框,再画新框,可是用什么绘图模式除去呢?求教啊!

解决方案 »

  1.   

    在mouseup事件下处理先进行定位,再进行重绘.不用除去,因为重绘了.
      

  2.   


    我知道在MouseUp事件里捕捉起点,但是需要的是鼠标移动到哪,图形就绘制到哪,我在MouseOver事件里画图,但是之前鼠标移动过的位置画出的图形都会保留在哪,这是不希望的。
      

  3.   

    不要放到paint事件里,paint只用来初始化图片,图片的处理要用自己定义的paintMethod在需要是绘制。。
    代码稍等
      

  4.   


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Data.Common;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using BPOSuperSQLClass;
    using SystemHotKey;
    using System.Drawing.Drawing2D;
    using System.Threading;
    using BPOSYSTEM.myClass;
    using System.IO;
    using System.Collections;
    using System.Reflection;namespace BPOSYSTEM
    {
        public partial class InputForm : Form
        {
            #region property
            private Bitmap srcImage;
            private Bitmap toDrawBeffor;
            private Graphics gOfToDrawBeffor;
            private Graphics gOfbuff;
            private BufferedGraphicsContext ctx;
            private BufferedGraphics bg;
            //zoom
            private float iZoom = 1f;        //show Pic size
            private float showW;
            private float showH;        private float srcW;
            private float srcH;        //show Pic Left_Up point.
            private int showX, showY;        //Mouse Action Points:
            private int startX, startY, endX, endY;
            bool mouseDown = false;
            bool mouseMoved = false;        private Graphics MyGraphics;
            private int Hotkey_UP;
            private int Hotkey_DOWN;
            private int Hotkey_LEFT;
            private int Hotkey_RIGHT;
            private int Hotkey_ZoomIN; //suo xiao 
            private int Hotkey_ZoomOUT; //fang da
            private int Hotkey_NoZoom;
            private DirectoryInfo srcFolder;
            FileInfo curFile;        private int inputStatus;
            private int inputStep;
            private int inputType;        private MyFolderDAO mfolderDAO = new MyFolderDAO();
            private MyInputDAO minputDAO = new MyInputDAO();
            private MyUserInputDAO uiDAO = new MyUserInputDAO();        private int nextID;
            private InputInfo nextInput;
            private InputInfo input1;
            private bool finish = false;        #endregion
            public InputForm()
            {
                InitializeComponent();
                this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
                this.UpdateStyles();
            }        private void Form1_Load(object sender, EventArgs e)
            {
                try
                {                InitSrcFolder();
                    InitSrcImage();
                    this.Visible = true;
                    InitImgAndGraph();
                    gOfToDrawBeffor.DrawImage(srcImage, 0, 0);
                    MyGraphics = panel1.CreateGraphics();
                    ctx = BufferedGraphicsManager.Current;
                    bg = ctx.Allocate(MyGraphics, new Rectangle(new Point(0, 0), panel1.Size));
                    gOfbuff = bg.Graphics;            }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    Runtime.InputForm.Close();
                }
            }
          
            #region Paint              private void ZoomInOutPic()
            {
                if (srcImage != null)
                {
                    InitImgAndGraph();                this.showW = srcImage.Width * iZoom;
                    this.showH = srcImage.Height * iZoom;
                    gOfToDrawBeffor.DrawImage(srcImage, 0, 0, this.showW, this.showH);
                    //let it dont be out of range;
                    if (-showX > showW)
                    {
                        showX = ((int)showW / 10) * (-10);
                    }
                    if (-showY > showH)
                    {
                        showY = ((int)showH / 10) * (-10);
                    }                gOfbuff.Clear(panel1.BackColor);
                    gOfbuff.DrawImage(toDrawBeffor, showX, showY);                if (mouseDown)
                    {
                        gOfbuff.DrawRectangle(Pens.Red, startX, startY, endX - startX, endY - startY);
                    }
                    bg.Render();
                }
            }
            private void panel1_Paint(object sender, PaintEventArgs e)
            {            if (gOfbuff != null)
                {
                    ZoomInOutPic();
                }
            }        private void panel1_MouseMove(object sender, MouseEventArgs e)
            {
                if (mouseDown)
                {
                    mouseMoved = true;                endX = e.X;
                    endY = e.Y;
                    ZoomInOutPic();            }
            }        private void panel1_MouseDown(object sender, MouseEventArgs e)
            {
                startX = e.X;
                startY = e.Y;
                endX = e.X;
                endY = e.Y;
                mouseDown = true;        }        private void panel1_MouseUp(object sender, MouseEventArgs e)
            {
                mouseDown = false;
                if (mouseMoved)
                {
                    mouseMoved = false;                float i = 1;                if (iZoom < 2)
                    {
                        i = 2 / iZoom;
                        iZoom = 2f;                }
                    float pCenterX = panel1.Width / 2;
                    float pCenterY = panel1.Height / 2;                float mouCenterX = (startX + endX) / 2;
                    float mouCenterY = (startY + endY) / 2;
                    float cmouX = (mouCenterX - showX) * i + showX;
                    float cmouY = (mouCenterY - showY) * i + showY;
                    showX = (int)(pCenterX + showX - cmouX);
                    showY = (int)(pCenterY + showY - cmouY);                ZoomInOutPic();
                }        }        private void InitImgAndGraph()
            {            toDrawBeffor = new Bitmap((int)(srcW * iZoom), (int)(srcW * iZoom));            gOfToDrawBeffor = Graphics.FromImage(toDrawBeffor);
            }
            private void InputForm2_FormClosing(object sender, FormClosingEventArgs e)
            {
                if (!e.Cancel)
                {
                    if (srcImage != null)
                    {
                        srcImage.Dispose();
                        srcImage = null;
                    }
                    Runtime.Main.Show();
                }
            }        #endregion        #region Init        private void InitSrcImage()
            {
                if (srcImage != null)
                {
                    srcImage.Dispose();
                    srcImage = null;
                }
                curFile = new FileInfo(Path.Combine(srcFolder.FullName, minputDAO.getImageName(nextID)));
                srcImage = new Bitmap(curFile.FullName);
                srcW = srcImage.Width;
                srcH = srcImage.Height;
                showW = srcImage.Width;
                showH = srcImage.Height;
                showX = 0;
                showY = 0;
                iZoom = 1f;
            }
      }
    }
    参考一下
      

  5.   

    mousedown 里定义起点,mousemove里绘制线,mouseup里定义终点
    重复绘制的过程中会保留以前绘制的图像,
    如果想每次都绘制新的图像,需要在绘制的时候首先清楚上次绘制的图像。如果用panel的话,可以用pane.CreateGraphics().clear(color);color 为你图像的背景色,用于清除上次图像
      

  6.   

    angel 16709 谢谢你提供的代码,我研究一下。