На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Как очистить канву картинки? , 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-)
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.0869 ]   [ 16 queries used ]   [ Generated: 13.09.26, 06:03 GMT ]