Zaznaczenie na Canvasie

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Zaznaczenie na Canvasie

Nowy postprzez radoslawd » poniedziaÅ‚ek, 20 kwietnia 2009, 13:10

Jak zaznaczyć fragment obrazu na Canvasie w TImage, żeby móc go skopiować do schowka, poddać obróbce itp.? Przekopałem trochę wyników w google, ale żadnych konkretów nie udało mi się znaleźć, dlatego proszę o pomoc.

edit:
Oczywiście chciałbym, żeby obszar zaznaczenia był widoczny w postaci przerywanego prostokąta zarówno w trakcie zaznaczania, jak i przy wykonywaniu na nim operacji, ale nie "wżerał" się w tło jak narysowany normalnie prostokąt. :)
Avatar użytkownika
radoslawd
Bladawiec
Bladawiec
 
Posty: 11
Dołączył(a): poniedziałek, 20 kwietnia 2009, 13:08
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Microsoft Windows 7
Kompilator: Borland Developer Studio 2006
Gadu Gadu: 0
    NieznanyNieznana

Re: Zaznaczenie na Canvasie

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 20 kwietnia 2009, 14:00

Płótno Canvas jest jak niezapisana kartka papieru o nieokreślonych rozmiarach. Nie oferuje żadnych funkcji zaznaczania poza funkcjami rysowania.
Prostokąt zaznaczenia musisz narysować na płótnie ręcznie, a do skopiowania użyć którejś z funkcji Copy, np. CopyRect pobierającej współrzędne XY Width Heigth określające obszar do skopiowania. Rysowanie prostokąta określającego obszar kopiowania to tylko wizualizacja i nie ma żadnego wpływu na to co zostanie skopiowane. Poczytaj sobie w serwisie Cyfrowy Baron w dziale grafika trochę o obsłudze Canvas i poćwicz.
Wszystko musisz zrobić na "piechotę"...
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Zaznaczenie na Canvasie

Nowy postprzez radoslawd » poniedziaÅ‚ek, 20 kwietnia 2009, 14:22

Mam coś takiego (znalazłem w wykładzie z ubiegłego roku), ale mi to nie działa. W tej postaci nie rysuje mi wcale prostokąta.

Kod: Zaznacz cały
void __fastcall TFotoEdytor::MainImageMouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
   MainImage->Canvas->Pen->Mode->pmNotXor;
   XPocz = X;
   YPocz = Y;
   Xr = X;
   Yr = Y;
   Zaznacz = true;
}
//---------------------------------------------------------------------------


void __fastcall TFotoEdytor::MainImageMouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
   if (Zaznacz)
   {
      MainImage->Canvas->Pen->Mode = pmNotXor;
      MainImage->Canvas->Pen->Style = psDash;
      MainImage->Canvas->Pen->Color = clBlack;
      MainImage->Canvas->Rectangle(XPocz, YPocz, Xr, Yr);
      MainImage->Canvas->Rectangle(XPocz, YPocz, Xr, Yr);
      Xr = X;
      Yr = Y;
   }
}
//---------------------------------------------------------------------------


Nie wiem też po co jest dwa razy
Kod: Zaznacz cały
MainImage->Canvas->Rectangle(XPocz, YPocz, Xr, Yr);

Jak usunę jedno, to rysuje mi tych prostokątów jakby wiele... no bo to by było w sumie logiczne, bo jest rysowanie na MouseMove.
Nie mam za bardzo pomysłów co z tym zrobić. Poza tym, jak narysuję sobie taki prostokąt, ok mam współrzędne do CopyRect, ale żeby zaznaczenie zniknęło, to chyba muszę wcześniej zrobić kopię tej bitmapy i później odtworzyć, prawda?
Avatar użytkownika
radoslawd
Bladawiec
Bladawiec
 
Posty: 11
Dołączył(a): poniedziałek, 20 kwietnia 2009, 13:08
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Microsoft Windows 7
Kompilator: Borland Developer Studio 2006
Gadu Gadu: 0
    NieznanyNieznana

Re: Zaznaczenie na Canvasie

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 20 kwietnia 2009, 15:31

To jest tak zwana metoda "Rubber-banding" polegająca na rysowaniu prostokąta, który zmienia kształt wraz z ruchem myszki.
Całość powinna wyglądać np. tak:

//W pliku nagłówkowym
Kod: Zaznacz cały
private:
    bool FDrawing;
    bool FFirstRect;
    TPoint F1, F2;
    void DrawRect(void);


// W pliku źródłowym

Kod: Zaznacz cały
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
    FDrawing = false;
}
//-----------------------------------------------
void __fastcall TForm1::FormMouseDown(TObject *Sender,
         TMouseButton Button, TShiftState Shift, int X, int Y)
{
    F1.x = X;
    F1.y = Y;
    FFirstRect = true;
    FDrawing = true;
}

//-----------------------------------------------
void __fastcall TForm1::FormMouseMove(TObject *Sender,
                              TShiftState Shift, int X, int Y)
{
    if (FDrawing == true)
    {
       Canvas->Pen->Mode = pmNotXor;
                    //to klucz do wymazywania
      if (FFirstRect == false) DrawRect();
                    //wymazuje poprzedni prostokÄ…t
       F2.x = X;
       F2.y = Y;
       FFirstRect = false;
       DrawRect(); //rysuje nowy prostokÄ…t
    }
}

//--------------------------------------------
void __fastcall TForm1::FormMouseUp(TObject *Sender,
       TMouseButton Button, TShiftState Shift, int X, int Y)
{
    F2.x = X;
    F2.y = Y;
    FDrawing = false;
    DrawRect();
    Canvas->Pen->Mode = pmCopy; //przywraca styl pióra
}

//------------------------------------------------
// rysuje prostokÄ…t
void TForm1::DrawRect(void)
{
Canvas->Brush->Style = bsClear;
Canvas->Pen->Style = psDash;
Canvas->Rectangle(F1.x, F1.y, F2.x, F2.y);
}


W podanym przykładzie prostokąt jest rysowany na formularzu dopóki wciśnięty jest klawisz myszy. W zdarzeniu OnMOuseUp prostokąt jest wymazywany, dlatego musisz zmodyfikować kod znajdujący się w tym zdarzeniu do własnych potrzeb, tak by prostokąt pozostał, czyli powinno wystarczyć zmienić kod miejscem:

Kod: Zaznacz cały
void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
    F2.x = X;
    F2.y = Y;
    FDrawing = false;
    Canvas->Pen->Mode = pmCopy; //przywraca styl pióra
    DrawRect();
}
//---------------------------------------------------------------------------


Pamiętaj jednak, że cokolwiek narysujesz na płótnie Canvas, np. tak zwane zaznaczenie to tak naprawdę jest to grafika, która modyfikuje grafikę znajdującą się na płótnie, czyli mówiąc prościej rysując zaznaczenie - rysujesz prostokąt.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Zaznaczenie na Canvasie

Nowy postprzez radoslawd » poniedziaÅ‚ek, 20 kwietnia 2009, 19:27

Dzięki wielkie, o to mi właśnie chodziło. :)
Avatar użytkownika
radoslawd
Bladawiec
Bladawiec
 
Posty: 11
Dołączył(a): poniedziałek, 20 kwietnia 2009, 13:08
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Microsoft Windows 7
Kompilator: Borland Developer Studio 2006
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje multimedialne, graficzne

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 3 gości

cron