На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
  
> Как очистить канву картинки? , Image1->Canvas->Refresh(); не работает
    Здравствуйте!
    Рисую на картинке прямоуголиники пунктирной линией....

    ExpandedWrap disabled
      void __fastcall TMap::Image1MouseDown(TObject *Sender, TMouseButton Button,
            TShiftState Shift, int X, int Y)
      {
         blMouseDown = true;
        //рисование прямоугольника
        Image1->Canvas->Refresh();//делаем рефреш, чтобы не было другого прямоугольника видно
        mx=X; my = Y;//сохраняем координаты начала
      }


    ExpandedWrap disabled
      void __fastcall TMap::Image1MouseUp(TObject *Sender, TMouseButton Button,
            TShiftState Shift, int X, int Y)
      {
        blMouseDown = false;
       
        //рисование прямоугольника
        mx1=X; my1=Y ;//сохраняем координаты конца
       
      }


    ExpandedWrap disabled
      void __fastcall TMap::Image1MouseMove(TObject *Sender, TShiftState Shift,
            int X, int Y)
      {
        //рисование треугольника
         if (blMouseDown)
         {
           Image1->Canvas->Refresh();//Делаем рефреш, чтобы когда мы меняли размеры прямоугольника не было бы шлейфа
           Image1->Canvas->Pen->Style=psDash;//пунктирная линия, можно это писать не тут...
           Image1->Canvas->Rectangle(mx, my, X, Y );//рисуем на форме выделение
         }
      }


    Image1->Canvas->Refresh(); НЕ ХОЧЕТ ОЧИЩАТЬ НАРИСОВАННОЕ....

    Может вопрос примитивен, то зарание извеняюсь....
    Я наверное чего-то не знаю....
    Сообщение отредактировано: Ирбис -
      я точно не знаю(билдера под рукой нету), но может быть есть метод типа Image1->Canvas->Clear()? Просто Refresh() вызывает перерисовку канвы, а не очистку. Видишь между этим разницу?
        Цитата miksayer @
        я точно не знаю(билдера под рукой нету), но может быть есть метод типа Image1->Canvas->Clear()? Просто Refresh() вызывает перерисовку канвы, а не очистку. Видишь между этим разницу?

        Я понял...
        Но к сожелеию такого метода нет в канве. Смотрел справку по TCanvas тоже там не нашел интересного...
          канва не очищается а закрашивается.
            Да, метода очистки нет, надо просто закрашивать, например, белым прямоугольником на весь имейдж
              Цитата mr.Torrens @
              Да, метода очистки нет, надо просто закрашивать, например, белым прямоугольником на весь имейдж

              Хороший вариант если картинка чистая.
              А что мне делать если у меня на картинке рисунок и мне нужно его видеть?
                Цитата
                А что мне делать если у меня на картинке рисунок и мне нужно его видеть?

                Хранить рисунок в битмапе, в момент перерисовки сначала загружать чистый рисунок из битмапа, потом на нем уже рисовать.
                Другой вариант - наложить еще один имедж поверх первого, установить ему прозрачность и рисовать в нем.
                  Тогда просто перезагрузи рисунок :
                  ExpandedWrap disabled
                    Image1->Picture

                  Т.е. просто заново загрузи в TImage рисунок, если всё правильно понял, должно помочь!
                    Всем спасибо за помощь :)

                    Мой код:
                    ExpandedWrap disabled
                      void __fastcall TMap::Image1MouseDown(TObject *Sender, TMouseButton Button,
                            TShiftState Shift, int X, int Y)
                      {
                        Image1->Picture->Bitmap->LoadFromFile("C:/map.bmp");
                        mx=X; my = Y;//сохраняем координаты начала
                      }



                    ExpandedWrap disabled
                      void __fastcall TMap::Image1MouseMove(TObject *Sender, TShiftState Shift,
                            int X, int Y)
                      {
                        if (GetAsyncKeyState(VK_LBUTTON))
                         {
                           Image1->Picture->Bitmap->LoadFromFile("C:/map.bmp");
                           Image1->Canvas->Pen->Style=psDash;
                           Image1->Canvas->Rectangle(mx, my, X, Y );
                         }
                      }
                      Цитата
                      ExpandedWrap disabled
                        Image1->Picture->Bitmap->LoadFromFile("C:/map.bmp");

                      Лучше создать объект TBitmap, единожды загрузить в него рисунок и потом в имейдж просто копировать содержимое битмапа. Постоянная загрузка из файла это лишние временные затраты и плюс может быть мерцание.
                        mr.Torrens
                        Добавлю только что и рисовать нужно тоже в Bitmap-е,а затем просто выводить его на любую канву.
                          Цитата mr.Torrens @
                          Цитата
                          ExpandedWrap disabled
                            Image1->Picture->Bitmap->LoadFromFile("C:/map.bmp");

                          Лучше создать объект TBitmap, единожды загрузить в него рисунок и потом в имейдж просто копировать содержимое битмапа. Постоянная загрузка из файла это лишние временные затраты и плюс может быть мерцание.

                          Примером можно?
                            можно
                            ExpandedWrap disabled
                                  Graphics::TBitmap* pic_bitmap;
                                  pic_bitmap = new Graphics::TBitmap;
                                  // грузим в него картинку
                                  pic_bitmap->LoadFromFile("c:\\map.bmp");
                               
                                  // загружаем в имейдж картинку из битмапа
                                  Image2->Picture->Bitmap = pic_bitmap;
                               
                                  // рисуем; потом, когда надобадет перетереть старый рисунок просто перезагружаем картинку из битмапа
                              Цитата mr.Torrens @
                              можно
                              ExpandedWrap disabled
                                    Graphics::TBitmap* pic_bitmap;
                                    pic_bitmap = new Graphics::TBitmap;
                                    // грузим в него картинку
                                    pic_bitmap->LoadFromFile("c:\\map.bmp");
                                 
                                    // загружаем в имейдж картинку из битмапа
                                    Image2->Picture->Bitmap = pic_bitmap;
                                 
                                    // рисуем; потом, когда надобадет перетереть старый рисунок просто перезагружаем картинку из битмапа

                              О понятно :) Огромное спасибо :D
                                всегда рад 8-)
                                  Привет всем!
                                  Не могу разобраться с очисткой канвы((((
                                  Как сделать так чтобы при нажатии кнопки, на Image оставалось только то, что создается в FormCreate;
                                  А все остальное стиралось????
                                  ExpandedWrap disabled
                                    Graphics::TBitmap*  gBm = new Graphics::TBitmap;
                                    void __fastcall TForm1::FormCreate(TObject *Sender)
                                    {
                                    Image1->Canvas->Rectangle(250,250,200,200);
                                     gBm->Width=Image1->ClientWidth;
                                     gBm->Height=Image1->ClientWidth;
                                     gBm->Canvas->Brush->Style=bsClear;
                                     Image1->Canvas->Pen->Width=1;
                                     Image1->Canvas->Brush->Style=bsClear;
                                    }
                                    void __fastcall TForm1::Image1MouseDown(TObject *Sender,
                                          TMouseButton Button, TShiftState Shift, int X, int Y)
                                    {
                                      t1.x=X;
                                      t1.y=Y;
                                      t2.x=X;
                                      t2.y=Y;
                                      pict=true;
                                    }
                                     
                                    void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button,
                                          TShiftState Shift, int X, int Y)
                                    {
                                     pict=false;
                                     gBm->Canvas->Rectangle(t1.x,t1.y,t2.x,t2.y);
                                    }
                                     
                                     
                                    void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
                                          int X, int Y)
                                    {
                                    if(pict==true)
                                    {
                                     Image1->Canvas->Draw(0,0,gBm);
                                     Image1->Canvas->Pen->Color=clWhite;
                                     Image1->Canvas->Rectangle(t1.x,t1.y,t2.x,t2.y);
                                     t2.x=X;
                                     t2.y=Y;
                                     Image1->Canvas->Pen->Color=clBlack;
                                     Image1->Canvas->Rectangle(t1.x,t1.y,t2.x,t2.y);
                                     }
                                    Вариант 1 - нарисованное в FormCreate сохранить в буферный битмап. По кнопке вывести его на имэдж.
                                    Вариант 2 - вынести рисование из FormCreate вынести в отдельную функцию. Вызывать её в FormCreate и по кнопке.
                                      Спасибо))))
                                      1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                      0 пользователей:


                                      Рейтинг@Mail.ru
                                      [ Script execution time: 0.0913 ]   [ 15 queries used ]   [ Generated: 13.09.26, 05:11 GMT ]