Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 527

/ вопрос открыт /

Огромнейшее здравствуйте, эксперты!

Нужна серьёзная на мой взгляд помощь.

Проблема:
При программирования небольшого графического редактора, столкнулся с проблему добовления новых элементов уже имеющиеся примеры. В сути проблемы лежит следующее, мне нужно что бы в image при обрисовке добавлялось в нужной точке рисунок из image1, как бы получается такой эффект рисования кистью.Реализую следующим кодом,

 if checkbox1.Checked=true then
    begin
    if Button = mbLeft then
    Image.Canvas.BrushCopy(Rect(x-(Image1.Width div 2),
    y-(Image1.Height div 2), x+(Image1.Width div 2), y+(Image1.Height div 2)),
    Image.Picture.Bitmap, Rect(0, 0, Image1.Width, Image1.Height), 0);
    end;

После компиляции результат не совсем соответствует ожидаемому, вместо рисунка просто вставляется пустое пространство равное image1.

Как на ваш взгляд можно решить проблему???

Выполненные работы(исходный код с коментариями):
// ------------ Обработчик нажатия кнопки мыши на рисунке ----------------------
procedure TResForm.ImageMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 case Button of // В зависимости от кнопки инициализируем глобальную переменную,
  mbLeft:RightButton:=False; // чтобы использовать её потом в других обработчиках,
  mbRight:RightButton:=True; // т.е. чертить примитивы цветом (FG) или фоном (BG).
 end; //case
 BeginPoint:=Point(x,y);     // Запоминаем начальную точку рисования
 case DrawOperation of       // В зависимости от выбранного инструмента:
  // Карандаш
  doPen:LastEndPoint:=Point(x,y);        // Запоминаем промежуточные точки для рисования карандашом
  // Заливка
  doFill:DrawFill(Image.Canvas,x,y);     // Делаем заливку с этой точки
  // Стёрка
  doEraser:Image.Canvas.Pen.Mode:=pmCopy;// Маска пера - сплошная
  // Кисть
  doBrush:begin
           LastEndPoint:=Point(x,y);     // Запоминаем промежуточные точки для рисования кистью
           Image.Canvas.Pen.Mode:=pmCopy;// Маска пера - сплошная
          end;
  // Всё остальное
  else begin
        LastEndPoint:=Point(-1,-1);  // Это нужно для немедленного выхода из процедур
                                     // DrawLine, DrawThickLine, DrawRectangle, DrawSelectRect,
                                     // DrawFillRectangle, DrawEllipse
        Image.Canvas.Pen.Mode:=pmNotXor; // Маска пера - xor-инверсная
        {Здесь - ключевой момент всей программы. Допустим мы хотим нарисовать точку на канве.
        Пусть, к примеру, цвет этой точки изначально равен $44B7C0, а цвет пера, допустим,
        равен $8AF607. Если маска пера (режим, Mode) равен pmCopy, то какой бы цвет
        изначально ни имела точка канвы, после рисования пером по ней она приобретёт
        цвет пера, т.е. $8AF607, а предыдущий цвет будет безвозвратно утерян. Так вот,
        маска (режим) пера pmNotXor применяется для восстановления исходного цвета точек
        после рисования по ним. Тут играет роль известное равенство:
        (A xor not B) xor not B = A. Т.е. если при режиме пера pmNotXor и цвете пера, равном
        $8AF607 = B нарисовать на точке цветом $44B7C0 = A, получим другой цвет: $31BE38.
        Теперь, чтобы восстановить первоначальный цвет точки, нарисуем на ней тем же цветом
        и режимом пера. Получим цвет $44B7C0, т.е. первоначальный цвет точки!
        В этой программе такие действия применяются, например, при рисовании отрезков,
        т.е. пользователь нажимает кнопку мыши, перемещает указатель. При каждом перемещении
        старая линия стирается и рисуется новая.}
       end;
 end; //case
 // Следующая ситуация возникает, когда пользователь выделил прямоугольный участок изображения,
 // потом (возможно) перетащил его в другое место и после этого нажал клавишу мыши
 // вне области выделения.
 if SelImage.Visible // Если сделано выделение (изображение выделения видимо)
  then with SelImage do
        begin
         PushUndo(Image.Picture); // Запоминаем откат
         // Копируем то, что выделено, на канву рисунка
         Image.Canvas.CopyRect(Rect(Left+1,Top+1,Left+Width-1,Top+Height-1),Canvas,Rect(1,1,Width-1,Height-1));
         Visible:=False; // Прячем выделение
        end;
 if DrawOperation<>doSelect // Если пользователь сделал что-то, кроме выделения,
  then PushUndo(Image.Picture); // запоминаем откат
 Drawed:=True; // Инициализируем глобальную переменную, показывающую
 
 if checkbox1.Checked=true then
    begin
    if Button = mbLeft then
    Image.Canvas.BrushCopy(Rect(x-(Image1.Width div 2),
    y-(Image1.Height div 2), x+(Image1.Width div 2), y+(Image1.Height div 2)),
    Image.Picture.Bitmap, Rect(0, 0, Image1.Width, Image1.Height), 0);
    end;
 
end;

Приложение:
  1.  


winner13 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: winner13 (статус: 1-ый класс)
Вопрос отправлен: 26 июля 2011, 12:40
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 32; последнее сообщение — 28 июля 2011, 15:10; участников в обсуждении: 4.

Страницы: [« Предыдущая] [1] [2]

winner13

winner13 (статус: 1-ый класс), 26 июля 2011, 14:24 [#21]:

ГУИ, условно бесплатная. ММОРПГ клиент, а его сорци(тобишь миная(тм)) как бы это квест, нужно в редакторе стилизованном под игру прорисовать руну , дальше если похоже вышло по памяти, идёшь дальше, если не похоже то возвращаться к месту с руной и запоминаешь её лучше=). В общем при прохождении два варианта, с бонусом и без. С бонусом когда тырисуешь руну сам от руки и у тебя получается что то похожее при сравнении, то бонусы твои, есть вариант полегче без бонсоу когда прорисовываешь из уже готовых частей, как штампы ставишь в нужных местах части рисунка руны. В общем ещё кабздец будет когда я редактор закончу, и буду делать нейросетку для сравнения рисунков, так как у меня уже получилось что на 900 нейронов для сравнения 12000 шагов нужно, блин, а росинок сам клиент 1024х1280, это будет медный таз ...
Не решимых проблем нет, есть неприятные для нас решения.
bugmenot

bugmenot (статус: 3-ий класс), 26 июля 2011, 14:27 [#22]:

Да, наложите, пожалуйста, в pastebin или на rghost!

Цитата (min@y™):

попросила, чтобы исходник выглядел по-дилетантски

А мы не взаправду смеёмся :­-­P

Цитата (Gooddy):

Программа как распространяться будет?

Уже на 5 МРОТ набралось.
виконання програми розпочинається з того самого мiсця, де призупинилося.

Gooddy

Gooddy (статус: 3-ий класс), 26 июля 2011, 14:37 [#23]:

winner13: а нельзя сделать выбор из 9-12 рандомных рун? Проще не будет не?
Чисти код! Чисти код! Чисти код!
winner13

winner13 (статус: 1-ый класс), 26 июля 2011, 14:45 [#24]:

Gooddy:
 Gooddy (статус: 3-ий класс), сегодня, 14:37 [#23]:
winner13: а нельзя сделать выбор из 9-12 рандомных рун? Проще не будет не?

У меня и так самый сложный квест, стёб тут не уместен+) это вам не эльфов с драконом мачить +)Тут память напрягать нужно,и умение владеть ком.графикой)

Что то всё равно не выходить, не пойму куда вставить лучше, всё время пустое изображение... Минай(тм) помоги куда вставить можно для отображения чтобы не конфликтовало с general.pas? Мне кажется откуда то оттуда идёт даный баг.
Не решимых проблем нет, есть неприятные для нас решения.
Gooddy

Gooddy (статус: 3-ий класс), 26 июля 2011, 14:49 [#25]:

bugmenot: http://govnokod.ru/user/1632 :D а вы таки ценитель :D.

winner13: всё сложно...
Чисти код! Чисти код! Чисти код!
winner13

winner13 (статус: 1-ый класс), 26 июля 2011, 14:58 [#26]:

bugmenot: Gooddy: А в чём отличие говно кода, от нормально??? ИМХО производительность сейчас не ценится особо всем до фени как раньше побитово отлаживали, размер тоже, вроде чем больше софина тем круче+). Вот бессмысленность некоторых операций. Но помойму у миная нормально всё.По крайне мере на своём опыте сколько я исходников видел это самое нормальное.


П.С. Как бы тут не месили, проблему чет решить не получается...
Не решимых проблем нет, есть неприятные для нас решения.
min@y™

min@y™ (статус: Доктор наук), 26 июля 2011, 15:08 [#27]:

Про говнокод - классный сайт, я прям зачитался! Вот от этого вообще упал пацтол: http://govnokod.ru/7125
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Gooddy

Gooddy (статус: 3-ий класс), 26 июля 2011, 15:17 [#28]:

if 1>2=false then //Настоящее меньше или равно.
...
Чисти код! Чисти код! Чисти код!
Gooddy

Gooddy (статус: 3-ий класс), 26 июля 2011, 15:20 [#29]:

Цитата:

А в чём отличие говно кода, от нормально???

В том что нормальный приятно читать, в нём сразу всё понятно, нет лишнего кода и всё сделано как надотм.

Цитата:

ИМХО производительность сейчас не ценится особо всем до фени как раньше побитово отлаживали, размер тоже, вроде чем больше софина тем круче+)

Тех кто фапает на производительность никто не любит. Там где нужна производительность делают ассемблерные вставки, а там где не нужна - пишут хороший код.
Чисти код! Чисти код! Чисти код!
winner13

winner13 (статус: 1-ый класс), 26 июля 2011, 15:48 [#30]:

Согласен помогите тогда мне переварить данную бадягу, а то у меня прям не мозг сейчас, а коктейль Молотова.Как мне сделать нормульную вставку своего кода в обработчик , и этот обработчик засунуть к себе , или же просто этот обработчик втереть в свой код...
Не решимых проблем нет, есть неприятные для нас решения.
bugmenot

bugmenot (статус: 3-ий класс), 26 июля 2011, 18:36 [#31]:

Цитата (Gooddy):

а вы таки ценитель

трансцендентная сущность же, хотя отсюда и я пощу (постчу? постю?)

Цитата (winner13):

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

Чепуха, школокод как не ценился, так и не ценится и будет тормозить и глючить даже петабайтном мейнфрейме.
виконання програми розпочинається з того самого мiсця, де призупинилося.

winner13

winner13 (статус: 1-ый класс), 28 июля 2011, 15:10 [#32]:

Я так до сих пор и не сообразил как вставить не работает зараза ...
Не решимых проблем нет, есть неприятные для нас решения.

Страницы: [« Предыдущая] [1] [2]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 25 апреля 2026, 22:05
Выполнено за 0.03 сек.