| 
| 
 | Вопрос # 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;
|  |   Вопрос задал: winner13 (статус: 1-ый класс)Вопрос отправлен: 26 июля 2011, 12:40
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 32; последнее сообщение — 28 июля 2011, 15:10; участников в обсуждении: 4. Страницы: [1] [2] [Следующая »]  
|   | Gooddy (статус: 3-ий класс), 26 июля 2011, 13:07 [#1]:Попробуй не BrushCopy а CopyRect. Чисти код! Чисти код! Чисти код! |  
|   | Gooddy (статус: 3-ий класс), 26 июля 2011, 13:14 [#2]: checkbox1.Checked=true   Чисти код! Чисти код! Чисти код! |  
|   | min@y™ (статус: Доктор наук), 26 июля 2011, 13:19 [#3]: Цитата (winner13): Выполненные работы(исходный код с коментариями): Ой, кросаффчег! Весь мой код 2002 года скопипастил! Программист от БОГА, честное пионерское! Даже вместе с комментариями! УМНИЦА, ТАК ДЕРЖАТЬ! Станешь великим программистом, палюбому! УВАЖУХА И РЕСПЕКТ! Да из таких, как ты, только гвозди делать, вся страна на таких держится! Молодчина!
 
 
 // ------------ Обработчик нажатия кнопки мыши на рисунке ----------------------
procedure TMainForm.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; // Инициализируем глобальную переменную, показывающую
               // нажата ли левая кнопка мыши над рисунком (кнопка нажата, True).
end;Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Gooddy (статус: 3-ий класс), 26 июля 2011, 13:28 [#4]: case Button of // В зависимости от кнопки инициализируем глобальную переменную,
  mbLeft:RightButton:=False; // чтобы использовать её потом в других обработчиках,
  mbRight:RightButton:=True; // т.е. чертить примитивы цветом (FG) или фоном (BG).
 end; //case ЩИТО?
 
 
 // Карандаш
  doPen ЩИТО?
 Чисти код! Чисти код! Чисти код! |  
|   | Gooddy (статус: 3-ий класс), 26 июля 2011, 13:30 [#5]:Ну ты минай перлов то наплодил! Жаль я свои старые исходники не нашёл. Там вообще жестянка небось. Чисти код! Чисти код! Чисти код! |  
|   | min@y™ (статус: Доктор наук), 26 июля 2011, 13:35 [#6]: Цитата (Gooddy): Ну ты минай перлов то наплодил! Жаль я свои старые исходники не нашёл. Там вообще жестянка небось.  Это был курсач на заказ для подруги моей жены. Она попросила, чтобы исходник выглядел по-дилетантски. Вот я и поизвращался немножко.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Gooddy (статус: 3-ий класс), 26 июля 2011, 13:40 [#7]:Я думал что и ты простой смертный. Жаль что человек так бессовестно содрал и назвал 90% чужого кода (и не самого свежего (говнокод)) выполненной работой. Чисти код! Чисти код! Чисти код! |  
|   | min@y™ (статус: Доктор наук), 26 июля 2011, 13:43 [#8]: Цитата (Gooddy): Я думал что и ты простой смертный. А что, есть другие варианты?
 
 Цитата (Gooddy): Жаль что человек так бессовесно содрал и назвал 90% чужого кода  Мне тоже безмерно жаль!
 
 Цитата (Gooddy): и не самого свежего (говнокод) Это даже не говнокод, это "кагбысдать и забыть".
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Gooddy (статус: 3-ий класс), 26 июля 2011, 13:46 [#9]:Качественный говнокод. Порадовала конструкция case Button of
  mbLeft:RightButton:=False; 
  mbRight:RightButton:=True; 
 end; Чисти код! Чисти код! Чисти код! |  
|   | Gooddy (статус: 3-ий класс), 26 июля 2011, 13:50 [#10]:Кстати, МинайТМ, можно получить полный код? Чисти код! Чисти код! Чисти код! |  
|   | winner13 (статус: 1-ый класс), 26 июля 2011, 13:54 [#11]:ребята , ребята, стопулики немного. Во первых Я копирайт указал, так что minay(tm) , может быть спокоен, в случае чего с ним свяжутся. =) 
 А ан счёт говно кода, я начинающий программист, нужно же мне чему-то учится, вот на примерах что мне сам минай(тм) и дал, я стараюсь что то сделать, не всем же дано от бога прям за месяц стать кодером высшей марки.(Я всего месяц как на делфе гоняю).Мне и на этом говно коде есть чему поучится.
 
 П.С. Кстати выдрал из твоего редактора мета файлов general.pas со всем содержимым не изменял, и вот этот обработчик TMainForm.ImageMouseDown.
 Не решимых проблем нет, есть неприятные для нас решения. |  
|   | min@y™ (статус: Доктор наук), 26 июля 2011, 14:04 [#12]: Цитата (Gooddy): Кстати, МинайТМ, можно получить полный код?  На кой хрен он тебе сдался-то?
 
 Цитата (winner13): не всем же дано от бога прям за месяц стать кодером высшей марки НИКОМУ не дано!
 
 Цитата (winner13): Кстати выдрал из твоего редактора мета файлов general.pas со всем содержимым не изменял, и вот этот обработчик TMainForm.ImageMouseDown.  Да я уже выше писал, что ты молодец, гений и т.д. Не парься, всё правильно делаешь. Нахрена мне конкуренты?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Gooddy (статус: 3-ий класс), 26 июля 2011, 14:07 [#13]:min@y™: хочу захватить мир. Чисти код! Чисти код! Чисти код! |  
|   | min@y™ (статус: Доктор наук), 26 июля 2011, 14:12 [#14]: Цитата (winner13): Я копирайт указал ГДЕ?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | winner13 (статус: 1-ый класс), 26 июля 2011, 14:13 [#15]:min@y™: Ё маё , да не обижайся ты, я просил помощи ты её оказал помнишь тогда в ирке???(звучи двусмысленно ну да ладно, кто как поймёт так поймёт). 
 Просто мне делат нечего не остаётся, на написания своего говнокода у меня уйдёт больше времяни и релаьно он ещё хуже чем твой в разы получится, считай я сейчас учусь на основе твоих исходников.
 
 П.С. Я выбрал самый наихудший вариант своих действий из всего более херового что у меня имелось. По этому спасибо, и я бы был очень благодарен если бы ты мне помог разобраться, комментарии это одно, а сам автор это другое.
 Не решимых проблем нет, есть неприятные для нас решения. |  
|   | min@y™ (статус: Доктор наук), 26 июля 2011, 14:13 [#16]: Цитата (Gooddy): хочу захватить мир.  Спроси у аффтара, он тебе скинет.
 Как захватишь мир - сообщи. Устроюсь к тебе начальником.
   Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | winner13 (статус: 1-ый класс), 26 июля 2011, 14:16 [#17]:Копирайт в програмулине, я честнее чем ты думаешь. В списке авторов стоит пометка ников кто мне тут помогал и линк на ресурс. Не решимых проблем нет, есть неприятные для нас решения. |  
|   | Gooddy (статус: 3-ий класс), 26 июля 2011, 14:17 [#18]:Программа как распространяться будет? Чисти код! Чисти код! Чисти код! |  
|   | min@y™ (статус: Доктор наук), 26 июля 2011, 14:18 [#19]: Цитата (winner13): Ё маё , да не обижайся ты, я просил помощи ты её оказал Да я не обижаюсь. Я уссываюсь!
 
 Цитата (winner13): Просто мне делат нечего не остаётся, на написания своего говнокода у меня уйдёт больше времяни и релаьно он ещё хуже чем твой в разы получится, считай я сейчас учусь на основе твоих исходников.  Вариант "мозги в положении ВКЛ" не катит? Странно, у меня всегда прокатывал. Что-то тут не то...
 
 Цитата (winner13): я бы был очень благодарен если бы ты мне помог разобраться, комментарии это одно, а сам автор это другое.  Ога, а наглость - второе счастье! У тебя готовая прога, разбирайся сам, там комментарии в каждой строке. А у меня работы дохрена + ещё 3 вагона. И ваще, я в отпуск хочу. Уже билет купил.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | min@y™ (статус: Доктор наук), 26 июля 2011, 14:19 [#20]: Цитата (Gooddy): Программа как распространяться будет?  $100500, не меньше.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  Страницы: [1] [2] [Следующая »]  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |