Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > С# аля паинт


Автор: Kero 3.5.2009, 14:06
Здравствуйте!
Хочу сделать рисовалку на сишарпе.
Идея такая: я нажимаю на панели, и с точки нажатия в точку куда я двигаю мышкой рисуеться линия. Я вожу мышку, линия за мышкой ходит.
КОРОЧЕ аналог рисования линии в паинте. Чтоб не делать по дедовски через перерисовку по верху я пробовал делать через буфер.
Вот исходник:
Но зараза мигает при перерисовке(((

pnlDrawPanel это панель хде рисуем
tspImage кнопка типа выбор инструмента линия

Код

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

namespace Рисовалко
{
    public partial class Окно : Form
    {
        private DrawingShape currentShape;
        private BufferedGraphicsContext bgContext;
        private BufferedGraphics gBuffer;
        private BufferedGraphics tgBuffer;
        private Point sp, ep,op;
        private bool draw = false;
        private bool drawl = false;

        public Окно()
        {
            InitializeComponent();
            bgContext = BufferedGraphicsManager.Current;
            bgContext.MaximumBuffer = new Size(pnlDrawPanel.Width+1,pnlDrawPanel.Height+1);
            gBuffer = bgContext.Allocate(pnlDrawPanel.CreateGraphics(),
                                         new Rectangle(0, 0, pnlDrawPanel.Width, pnlDrawPanel.Height));
            tgBuffer = bgContext.Allocate(pnlDrawPanel.CreateGraphics(),
                                         new Rectangle(0, 0, pnlDrawPanel.Width, pnlDrawPanel.Height));
            SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
            DoubleBuffered = true;
            SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
        }


        private void tspImage_Click(object sender, EventArgs e)
        {
        }

        private void pnlDrawPanel_Paint(object sender, PaintEventArgs e)
        {
            gBuffer.Render(e.Graphics);
        }

        private void toolStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {

        }

        private void tspImage_MouseUp(object sender, MouseEventArgs e)
        {
            draw = true;
           
        }

        private void pnlDrawPanel_MouseUp(object sender, MouseEventArgs e)
        {
            if (draw && !drawl)
            {
                currentShape = new Line();
                sp = e.Location;
                ep = sp;
                drawl = true;
                return;
            }
            if (drawl)
            {
                tgBuffer = bgContext.Allocate(gBuffer.Graphics,
                                            new Rectangle(0, 0, pnlDrawPanel.Width, pnlDrawPanel.Height));
                drawl = false;
            }
        }

        private void pnlDrawPanel_MouseMove(object sender, MouseEventArgs e)
        {
            if(drawl)
            {
                gBuffer = bgContext.Allocate(tgBuffer.Graphics,
                                             new Rectangle(0, 0, pnlDrawPanel.Width, pnlDrawPanel.Height));
                // Create a pen that has the same background color as the form
                ep = e.Location;
                // Create a pen that will draw the blue line
                Pen linePen = new Pen(Color.Blue);
                // Store the X coordinate
                gBuffer.Graphics.DrawLine(linePen, sp, ep); 
                tgBuffer = bgContext.Allocate(gBuffer.Graphics,
                                             new Rectangle(0, 0, pnlDrawPanel.Width, pnlDrawPanel.Height));
                pnlDrawPanel.Refresh();

            }
        }
    }
}


Нужна помощь в реализации функционала чтоб:
1. при перерисовке не мигало
2. сделать чтоб линия оставалась на панели при клике и можно было другую рисовать поверху

Автор: diadiavova 3.5.2009, 16:52
Я твой код не изучал, вместо этого набросал рабочий пример. 

Автор: -Mikle- 3.5.2009, 17:12
Вот, посмотри, когда-то давно писал в самообразовательных целях. Можешь просто продолжить его писать. Инструменты рисования реализованы через интерфейс.

Автор: Kero 3.5.2009, 18:02
Спс ребят=) 
Всё суперски подошло!!!

Автор: andreich78 8.8.2011, 10:05
Ай, спасибо!
Всегда бы так везло с примерами - запустил, всё работает, просто и лаконично.

Автор: BamBooCho 24.11.2011, 20:27
diadiavova
воспользовался вашим проектом. 
а подскажите пожалст как сделать у резиновой линии закругленные края?

Автор: BamBooCho 24.11.2011, 22:16
Попробовал вроде эту штуку.. http://msdn.microsoft.com/ru-ru/library/system.drawing.graphics.smoothingmode.aspx
отсюда взял пример. Только концы линии не сглаживаются( как исправить

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)