Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> С# аля паинт, Красиво нарисовать линию 
V
    Опции темы
Kero
  Дата 3.5.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 10.5.2006
Где: Винница,Украина | | Реал

Репутация: нет
Всего: 1



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

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. сделать чтоб линия оставалась на панели при клике и можно было другую рисовать поверху

Это сообщение отредактировал(а) Kero - 3.5.2009, 14:07
PM MAIL ICQ MSN   Вверх
diadiavova
Дата 3.5.2009, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



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

Присоединённый файл ( Кол-во скачиваний: 239 )
Присоединённый файл  Painter.rar 81,23 Kb


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
-Mikle-
Дата 3.5.2009, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 8
Всего: 59



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

Присоединённый файл ( Кол-во скачиваний: 222 )
Присоединённый файл  PaintBrush.rar 28,43 Kb


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
Kero
  Дата 3.5.2009, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 10.5.2006
Где: Винница,Украина | | Реал

Репутация: нет
Всего: 1



Спс ребят=) 
Всё суперски подошло!!!
PM MAIL ICQ MSN   Вверх
andreich78
Дата 8.8.2011, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 8.8.2011

Репутация: нет
Всего: нет



Ай, спасибо!
Всегда бы так везло с примерами - запустил, всё работает, просто и лаконично.
PM MAIL   Вверх
BamBooCho
Дата 24.11.2011, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 24.11.2011

Репутация: нет
Всего: нет



diadiavova
воспользовался вашим проектом. 
а подскажите пожалст как сделать у резиновой линии закругленные края?
PM MAIL   Вверх
BamBooCho
Дата 24.11.2011, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 24.11.2011

Репутация: нет
Всего: нет



Попробовал вроде эту штуку.. http://msdn.microsoft.com/ru-ru/library/sy...othingmode.aspx
отсюда взял пример. Только концы линии не сглаживаются( как исправить
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0996 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.