CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Zaznaczanie na TImage

Zaznaczanie na TImage

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Zaznaczanie na TImage

Nowy postprzez Frytek18 » czwartek, 17 maja 2012, 19:13

Juz sam nie wiem ale chce zrobic zeby zaznaczenie było i myslałem ze jako kwadrat no ale nie wiem jak to zrobic jakies pomysły?
Avatar użytkownika
Frytek18
Homos antropiczny
Homos antropiczny
 
Posty: 60
Dołączył(a): czwartek, 17 maja 2012, 19:05
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: WIN XP 32 bit
Kompilator: Embarcadero RAD Studio 2010 C++
Gadu Gadu: 5032466
    Windows XPFirefox

Re: Zaznaczanie na TImage

Nowy postprzez Cyfrowy Baron » czwartek, 17 maja 2012, 23:08

Co rozumiesz przez zaznaczenie. TImage to obiekt, który tylko udostępnia powierzchnię TCanvas do rysowania i potrafi jeszcze wyświetlać bitmapy. Co chcesz, żeby robił z tym zaznaczeniem?
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
    Windows XPFirefox

Re: Zaznaczanie na TImage

Nowy postprzez Frytek18 » niedziela, 20 maja 2012, 10:44

Chodzi o to żeby zaznaczyć pewien obszar i go wyciąć albo skopiować
Avatar użytkownika
Frytek18
Homos antropiczny
Homos antropiczny
 
Posty: 60
Dołączył(a): czwartek, 17 maja 2012, 19:05
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: WIN XP 32 bit
Kompilator: Embarcadero RAD Studio 2010 C++
Gadu Gadu: 5032466
    Windows XPFirefox

Re: Zaznaczanie na TImage

Nowy postprzez Cyfrowy Baron » niedziela, 20 maja 2012, 12:10

Image nie przechowuje żadnych informacji o rozmiarach narysowanych obiektów, więc musisz je gdzieś przechowywać podczas rysowania np. w strukturze POINT.

Najpierw przykład rysowania zaznaczenia na Image:

Plik nagłówkowy np. Unit1.h
KOD cpp:     UKRYJ  
private:        // User declarations
        bool FDrawing;
        bool FFirstRect;
        TPoint F1, F2;

        void __fastcall DrawRect();
Plik źródłowy np. Unit1.cpp
KOD cpp:     UKRYJ  
void __fastcall TForm1::DrawRect()
{
 Image->Canvas->Rectangle(F1.x, F1.y, F2.x, F2.y);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ImageMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y)
{
        DrawRect();
        Canvas->Pen->Mode = pmCopy;

        F1.x = X;
    F1.y = Y;
    FFirstRect = true;
        FDrawing = true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ImageMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y)
{
    F2.x = X;
    F2.y = Y;
        FDrawing = false;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ImageMouseMove(TObject *Sender, TShiftState Shift, int X,
          int Y)
{
        if (FDrawing == true)
    {
           Image->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
        }
}


Teraz przykład kopiowania zaznaczonego fragmentu w Image do drugiego Image1:

Plik źródłowy np. Unit1.cpp
KOD cpp:     UKRYJ  
void __fastcall TForm1::Button4Click(TObject *Sender)
{
 int w = F2.x - F1.x - 2; // odejmuję 2 na ramkę zaznaczenia
 int h = F2.y - F1.y - 2;

 Image1->Canvas->CopyRect( Rect(0, 0, w, h), Image->Canvas, Rect(F1.x + 1, F1.y + 1, F2.x - 1, F2.y - 1));
}
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
    Windows XPFirefox

Re: Zaznaczanie na TImage

Nowy postprzez Frytek18 » środa, 23 maja 2012, 18:47

a nie ma czegos takiego jak schowek czy cos zeby wiesz jak w paincie ze zaznaczasz i kopiuj albo wytnij robisz i otwierasz nowy plik i wklejasz
A włascnie mam C++ tego 10 Embarcadero RAD Studio 2010 gdzie tutaj jak wiesz jest edytor zeby robic ikony albo bmp jak było w c++ 6?
Avatar użytkownika
Frytek18
Homos antropiczny
Homos antropiczny
 
Posty: 60
Dołączył(a): czwartek, 17 maja 2012, 19:05
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: WIN XP 32 bit
Kompilator: Embarcadero RAD Studio 2010 C++
Gadu Gadu: 5032466
    Windows XPFirefox

Re: Zaznaczanie na TImage

Nowy postprzez Cyfrowy Baron » środa, 23 maja 2012, 19:01

Frytek18 napisał(a):a nie ma czegos takiego jak schowek czy cos zeby wiesz jak w paincie


Schowek to tylko miejsce w pamięci. Image nie obsługuje schowka chociaż można umieszczać całe obrazy z Image do schowka, lub wybrane fragmenty, ale to wymaga zaimplementowania w Image obsługi schowka, gdyż jak napisałem ten obiekt tego nie obsługuje. Dodanie obsługi schowka do Image niczego nie ułatwi gdyż oprócz całej procedury kopiowania tak jak to podałem w przykładzie trzeba by jeszcze dodać obsługę schowka, czyli nie mniej lecz więcej kodu.

Frytek18 napisał(a):edytor zeby robic ikony albo bmp jak było w c++ 6?


Nie ma go już od dawna. Nie ma również programu do edycji zasobów. Musisz posłużyć się zewnętrznymi programami.
Polecam:

Edytory Ikon i Kursorów
Edytory zasobów
Tworzenie plików pomocy
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
    Windows XPFirefox

Re: Zaznaczanie na TImage

Nowy postprzez Frytek18 » środa, 23 maja 2012, 19:38

E to odpada a jak zrobic zeby na StatusBar wyswietlał ze współrzędne myszko z Image?
Avatar użytkownika
Frytek18
Homos antropiczny
Homos antropiczny
 
Posty: 60
Dołączył(a): czwartek, 17 maja 2012, 19:05
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: WIN XP 32 bit
Kompilator: Embarcadero RAD Studio 2010 C++
Gadu Gadu: 5032466
    Windows XPFirefox

Re: Zaznaczanie na TImage

Nowy postprzez Frytek18 » środa, 23 maja 2012, 19:44

Ostatnia rzecz jaką Ciebie prosze wiem ze jakos sie da zrobic ze jak klikniemy na X zamykający aplikacje to wyskoczy komunikat czy aby napewno chcesz zamknąć program alboc cos w tym stylu jak cos takiego zrobic?
Avatar użytkownika
Frytek18
Homos antropiczny
Homos antropiczny
 
Posty: 60
Dołączył(a): czwartek, 17 maja 2012, 19:05
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: WIN XP 32 bit
Kompilator: Embarcadero RAD Studio 2010 C++
Gadu Gadu: 5032466
    Windows XPFirefox

Re: Zaznaczanie na TImage

Nowy postprzez Cyfrowy Baron » środa, 23 maja 2012, 19:45

KOD cpp:     UKRYJ  
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X,
          int Y)
{
 StatusBar1->Panels->Items[1]->Text = "X - " + (String)X + " | Y - " + (String)Y;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseLeave(TObject *Sender)
{
 StatusBar1->Panels->Items[1]->Text = "Brak";
}
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
    Windows XPFirefox

Re: Zaznaczanie na TImage

Nowy postprzez Cyfrowy Baron » środa, 23 maja 2012, 19:49

Frytek18 napisał(a):jak klikniemy na X zamykający aplikacje to wyskoczy komunikat czy aby napewno chcesz zamknąć program


KOD cpp:     UKRYJ  
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
  CanClose = false; // blokuje możliwość zamknięcia aplikacji

  int idx = Application->MessageBox( L"Czy na pewno chcesz zamknąc aplikację?",
                        Application->Title.c_str(), MB_YESNOCANCEL | MB_ICONQUESTION);

  if(idx == ID_YES) CanClose = true;
  if(idx == ID_NO) return;
  if(idx == ID_CANCEL) return;
}


W BCB 6 będzie tak:

KOD cpp:     UKRYJ  
  int idx = Application->MessageBox( "Czy na pewno chcesz zamknąc aplikację?",
                        Application->Title.c_str(), MB_YESNOCANCEL | MB_ICONQUESTION);
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
    Windows XPFirefox

Re: Zaznaczanie na TImage

Nowy postprzez Frytek18 » środa, 23 maja 2012, 19:59

A własnie bo w tym messagebox pokazuje mi Project1 jak to zmienic? zeby był program Rysunkowy zmienic nazwe pliku exe?
Avatar użytkownika
Frytek18
Homos antropiczny
Homos antropiczny
 
Posty: 60
Dołączył(a): czwartek, 17 maja 2012, 19:05
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: WIN XP 32 bit
Kompilator: Embarcadero RAD Studio 2010 C++
Gadu Gadu: 5032466
    Windows XPFirefox

Re: Zaznaczanie na TImage

Nowy postprzez Frytek18 » środa, 23 maja 2012, 20:08

A jak bys mogł jeszcze o krok dalej pojsc i zorbic cos takiego:
1. zamykasz program i jeżeli nie został zapisany obrazek to zapytac sie czy zapisac
2. jezeli został zapisany wczesniej to wykonac to co mi wrzuciłes z zamknięciem aplikacji
Avatar użytkownika
Frytek18
Homos antropiczny
Homos antropiczny
 
Posty: 60
Dołączył(a): czwartek, 17 maja 2012, 19:05
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: WIN XP 32 bit
Kompilator: Embarcadero RAD Studio 2010 C++
Gadu Gadu: 5032466
    Windows XPFirefox

Re: Zaznaczanie na TImage

Nowy postprzez Frytek18 » środa, 23 maja 2012, 21:52

Juz zrobiłem to sam wiesz jak zrobic linie krzywą albo wielokąt?
Avatar użytkownika
Frytek18
Homos antropiczny
Homos antropiczny
 
Posty: 60
Dołączył(a): czwartek, 17 maja 2012, 19:05
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: WIN XP 32 bit
Kompilator: Embarcadero RAD Studio 2010 C++
Gadu Gadu: 5032466
    Windows XPFirefox

Re: Zaznaczanie na TImage

Nowy postprzez Cyfrowy Baron » czwartek, 24 maja 2012, 16:50

Frytek18 napisał(a):A własnie bo w tym messagebox pokazuje mi Project1 jak to zmienic? zeby był program Rysunkowy zmienic nazwe pliku exe?


Nie no! :shock: Zastanawiam się, czy sobie ze mnie nie żartujesz. Nie znasz podstaw czy co?!

KOD cpp:     UKRYJ  
Application->MessageBox(  L"Treść komunikatu", L "Tytuł okna", FLAGI)


Patrz tutaj Cyfrowy Baron



Frytek18 napisał(a):1. zamykasz program i jeżeli nie został zapisany obrazek to zapytac sie czy zapisac


To złożony proces. Image nie przechowuje informacji o modyfikacjach, więc utwórz zmienną prywatną typu BOOL i przy modyfikacji image ustaw jej wartość na true co będzie oznaczać, że w Image zaszły zmiany, po zapisaniu ustaw wartość zmiennej na false, co będzie oznaczać, że zmian nie ma lub zostały zapisane. Przed zamknięciem sprawdzaj stan te zmiennej.

KOD cpp:     UKRYJ  
BOOL bTestSave; /* zadeklarować w pliku nagłówkowym w sekcji private */

void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
 if( bTest == false ) return;

  CanClose = false;

  int idx = Application->MessageBox( L"Czy chcesz zapisać zmiany?",
                        Application->Title.c_str(), MB_YESNOCANCEL | MB_ICONQUESTION);

  if(idx == ID_YES) // tutaj dajesz wywołanie funkcji zapisującej zmiany w aplikacji
  if(idx == ID_NO) CanClose = false; // tutaj zezwalasz na zamknięcie aplikacji bez zapisywania
  if(idx == ID_CANCEL) return; // tutaj anulujesz zamknięcie aplikacji.
}




Frytek18 napisał(a):jak zrobić linie krzywą albo wielokąt?


Polygon, Polyline - obydwu funkcji używa się tak samo do kreślenia nieregularnych kształtów i linii, różnica między nimi polega na tym, że Polygon kreśli obszar o zadanym kształcie i wypełnia go kolorem, a ostatnia linia jest automatycznie prowadzona od punktu końcowego do punktu początkowego, natomiast Polyline kreśli tylko linie o zadanym kształcie nie wypełnia obszaru kolorem i nie prowadzi linii od punktu końcowego do początkowego.
Przykład użycia:
KOD cpp:     UKRYJ  
Canvas->Polyline(OPENARRAY (TPoint, (
Point(150, 20),
Point(260, 100),
Point(220, 220),
Point(80, 220),
Point(40, 100))));
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
    Windows XPFirefox


  • 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 2 gości