Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Рисование линий, прямоугольников...

21K
10 ноября 2006 года
s((r1pt
5 / / 10.11.2006
Приветствую!
Вот взялся писать графический векторные редактор. Все вроде бы ничего, только появилась одна назойливая проблема. Когда пользователь рисеут какую-либо фигуру(линию, прямоугольник, окружность), фигура "ползет" за мышкой, т.е. расширяется. Проблема состоит в том, что мне пришлось перерисовывать окно каждый раз, когда пользователь двинет мышью в режиме рисования. А, глядя, на другие приложения, подобные моему, мне становится обидно, что у меня так долго рисуется изображене, т.е. если подергать мышью получится такой эффект - изображение ползет, перерисовываясь...
Может быть есть какие-то сопособы опитимизировать это дело?:confused:
10K
10 ноября 2006 года
АлРАД
58 / / 30.08.2006
Вообще рекомендуют пользоваться ф-ей bitblt(см. АПИ).

А остальное зависит от среды: если Visual Basic, то там как ни странно с этим проблем не возникает.
А если С++ - советую написать или написать свой собственый компонен для аботы с графикой, или - пользоваться вышеприведенной функцией

Я тоже увлекаюсь написанием графическихх приложений, у тебя что за среда?
21K
11 ноября 2006 года
s((r1pt
5 / / 10.11.2006
вообще говоря, я несколько неправильно написал вопрос)
Про существование bitblt я знаю, т.к. её использую... Вернее не её, а аналог Graphics.DrawImage(bmp, pictureBox1.ClientRectangle), т.к. пишу на C#(Среда Microsoft Visual Studio 2005)

Есть у меня некоторое изображение, созданное по некоторым правилам. Оно хранится в pictureBox. Ну, или, говоря простым языком в bmp-шке.
В случае события OnPaint, относящегося к нашему pictureBox происхоит копирование образа нашей бмпешки на экран. Здесь все ясно.

Мне нужно сделать так, чтобы пользователь мог рисовать линии(прямоугольники, окружности, ...). Поясню как это реализуется у меня: отслеживаются все события MouseMove в области pictureBox(в области... относящиеся к pictureBox); если нажата левая кнопка мыши, линия, рисующаяся от относительного центра, показывается пользователю. Получается эффект перетаскивания "конца" линии. Когда пользователь отпускает кнопку мыши, линия рисуется и больше не бегает за мышькой.

Вопрос: как это сделать без лишних накладных расходов?

Моя задумка состоит в следующем. Как только приходит MouseMove и кнопка нажата мы загружаем образ из памяти и отрисовываем линию на pictureBox. При этом не портится образ. Понятно почему). ... И так далее до тех пор пока пользователь не отпустит кнопку мыши. При постулении сообщения DownMouse(вроде такое) фиксируем линию в образе после чего показываем получившийся образ.

Вроде бы ничего... С первого взгляда. Но у меня почему-то все это делается медленно. В случае с окружностью при быстром перемещении курсора возникает жуткий эффект концентрических окружностей)))

:confused:
10K
12 ноября 2006 года
АлРАД
58 / / 30.08.2006
Чтобы меньше всего ресурсов требовалось, я очень советую разработать свой компонент, я только так и работаю.
23K
19 ноября 2006 года
Petya!
5 / / 19.11.2006
А ты попробуй рисовать методом XOR линии - должно получиться и не тормозить...
9
19 ноября 2006 года
Lerkin
3.0K / / 25.03.2003
Двойная буферизация. Рисуешь в бэк-буфере, переключаешь (визуализируешь), обнуляешь старый буфер и по-новой.
302
21 ноября 2006 года
Sagittarius
648 / / 12.04.2003
Я так понял, автор использует Delphi или Builder.

Цитата: Lerkin
Двойная буферизация. Рисуешь в бэк-буфере, переключаешь (визуализируешь), обнуляешь старый буфер и по-новой.


Достаточно для компонента, на котором лежить PaintBox, установить свойство DoubleBuffering в True, и компонент сам будет заниматься переключением буферов. Если под PaintBox только форма, кинь его на TPanel.

P.S. Свойство DoubleBuffering можно выставить только в коде, например, при создании окна.

21K
02 декабря 2006 года
s((r1pt
5 / / 10.11.2006
Цитата: Petya!
А ты попробуй рисовать методом XOR линии - должно получиться и не тормозить...



Не получится. В шарпе нет такой возможности(если б была, не спрашивал бы :) )

Цитата: Sagittarius
Я так понял, автор использует Delphi или Builder.



неа, не дельфи и не булдер :)

Цитата: s((r1pt
... т.к. пишу на C#(Среда Microsoft Visual Studio 2005) ...



:D

16K
26 декабря 2006 года
anpol
3 / / 05.04.2006
Если рисуешь на панельке (среда Studio 2003 C#), то создай собственный класс (например MyPanel) и отнаследуй его от System.Windows.Forms.Panel. Затем в конструкторе панельки задай ей стиль ДВУМЯ строками: this.SetStyle(ControlStyles.DoubleBuffer, true); и this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);

Пример:

using System;
using System.Windows.Forms;

namespace WindowsApplication1
{
/// <summary>
/// Summary description for MyPanel.
/// </summary>
public class MyPanel:System.Windows.Forms.Panel
{
public MyPanel()
{
this.SetStyle(ControlStyles.DoubleBuffer,true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);
}
}
}
63
26 декабря 2006 года
Zorkus
2.6K / / 04.11.2006
Вряд ли стоит писать в шарпе вещь, критичную к скорости.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог