winform 根據鼠標移動畫線,這一個問題想了3年了還不太會


怎么做在窗體或者什么控件上畫線,就像寫字一樣,畫出的線后可以保存成圖片,誰會的,這一個問題想了3年了還不太會

21 个解决方案

#1


繼續回去想去呵呵,不行就百度,谷歌。

#2


太執着了

#3


真雷人吶,看個例子吧
http://download.csdn.net/source/2199536
塗鴉

#4


處理幾個鼠標事件即可,上面的例子也有保存

#5


牛人一個,無語

#6


不是我要的呀,浪費我一個資源分
引用 3 樓 lovelan1748 的回復:
真雷人吶,看個例子吧
http://download.csdn.net/source/2199536
塗鴉

#7



我這里有個在窗體上可以寫字的例子,不能保存

namespace WriteWords
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //MyPoint1, MyPoint2表示鼠標按下和彈起時鼠標的坐標位置
        public Point MyPoint1, MyPoint2;
        public int MyFlag = 0;

        private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            //當鼠標彈起時,設置MyFlag = 0,表示不能畫線
            this.MyFlag = 0;
        }

        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            this.Text = "X=" + e.X.ToString() + ",Y=" + e.Y.ToString();
            Graphics g = this.CreateGraphics();
            Pen MyPen = new Pen(Color.Black);

            //MyFlag=0表示鼠標彈起,不能進行畫線
            //當鼠標按下時,設置MyFlag=1表示可以畫線
            if (this.MyFlag == 0)
                return;

            //鼠標移動,每次變換時,MyPoint2都記錄下鼠標的位置,以便進行鼠標移動畫線
            this.MyPoint2.X = e.X;
            this.MyPoint2.Y = e.Y;
            g.DrawLine(MyPen, MyPoint1.X, MyPoint1.Y, MyPoint2.X, MyPoint2.Y);

            //當畫完一條線后(很短的,可以當做一個小點看待),將MyPoint1的坐標重置為此時鼠標的位置
            MyPoint1.X = e.X;
            MyPoint1.Y = e.Y;
        }

        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            //鼠標第一次按下時,設置鼠標坐標為第一個點的坐標
            this.MyFlag = 1;
            this.MyPoint1.X = e.X;
            this.MyPoint1.Y = e.Y;
        }

    }
}

#8


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace HandDrawing
{
    public partial class HandDrawing : Form
    {
        public HandDrawing()
        {
            InitializeComponent();
            m_lines = new List<List<Point>>();
        }

        private List<List<Point>> m_lines;
        private List<Point> m_newLine;

        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            m_newLine = new List<Point>();
        }

        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            m_addPoint(e.X, e.Y);
        }

        private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            m_addPoint(e.X, e.Y);
            m_lines.Add(m_newLine);
        }

        private void m_addPoint(int x, int y)
        {
            m_newLine.Add(new Point(x, y));
            int points = m_newLine.Count;
            if (points > 1)
            {
                Graphics g = this.CreateGraphics();
                Pen p = new Pen(Color.Black);
                g.DrawLine(p, m_newLine[points - 2].X, m_newLine[points - 2].Y, m_newLine[points - 1].X, m_newLine[points - 1].Y);
                p.Dispose();
                g.Dispose();
            }
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            DrawAllLines(e.Graphics);
        }

        private void DrawAllLines(Graphics g)
        {
            Pen p = new Pen(Color.Black);
            int TotalLines = m_lines.Count;
            for (int i = 0; i < TotalLines; i++)
            {
                g.DrawLines(p, m_lines[i].ToArray());
            }
            p.Dispose();
            g.Dispose();
        }

        private void miClear_Click(object sender, EventArgs e)
        {
            //foreach (List<Point> l in m_lines)
            //    l.Clear();
            m_lines.Clear();
            this.Invalidate();
        }

        private void miSave_Click(object sender, EventArgs e)
        {
            if (saveFileDialog1.ShowDialog() != DialogResult.OK)
                return;
            Bitmap bmp = null;
            Graphics g = null;
            Brush b = null;
            try
            {
                bmp = new Bitmap(this.ClientSize.Width, this.ClientSize.Height);
                g = Graphics.FromImage(bmp);
                b = new SolidBrush(Color.White);
                g.FillRectangle(b, this.ClientRectangle);
                DrawAllLines(g);
                bmp.Save(saveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Bmp);
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("Cannot save picture,error message:{0}", ex.Message), "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);
            }
            finally
            {
                if (bmp != null)
                    bmp.Dispose();
                if (g != null)
                    g.Dispose();
                if (b != null)
                    b.Dispose();
            }
        }

        private void miExit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
    }
}

#9


暈,沒刷新不知道這么多人回復了~~~

#10


引用 6 樓 csdsuper 的回復:
不是我要的呀,浪費我一個資源分

我汗,你把我塗鴉換成繪制不就是你要的了,兄弟放棄這行吧,娃娃生出來三年也會打醬油了

#11


你的代碼好像運行出錯
引用 8 樓 roc196 的回復:
C# code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace HandDra……

#12


這個還不錯,但還有不少的bug和錯誤的
引用 8 樓 roc196 的回復:
C# code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace HandDra……

#13



        private void DrawAllLines(Graphics g)
        {
            Pen p = new Pen(Color.Black);
            int TotalLines = m_lines.Count;
            for (int i = 0; i < TotalLines; i++)
            {
                g.DrawLines(p, m_lines[i].ToArray());
            }
            p.Dispose();
            g.Dispose();
        }
這里怎么會經常出現參數無效的呢,有時又不有

#14


三年,一天寫一行代碼也給搞出來了。

#15


http://blog.csdn.net/jianuMan/archive/2010/06/18/5677839.aspx
保存圖片的吧  你google一下  窗體截屏函數

#16


引用 14 樓 robin521 的回復:
三年,一天寫一行代碼也給搞出來了。


呵呵呵,電腦畫線沒寫過,到時以前鼓搗windows mobile 的時候寫個手寫記事本,就是保存成圖片

#17


這不就和C#畫圖差不多嗎?感覺還要簡單,為什么要想三年呢?樓主精神值得學習!!

#18


精神可嘉,不過還是建議多查查資料

#19


加我QQ 381914029 
我有一個vs 2005的畫圖小程序

#20


拜樓主高人

#21


效率確實是個大問題。看mfc上的做法。用記憶重畫為背景效率會高很多。不會都個刷新重繪。




注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com