jak odczytac wartosc slupka narysowanego w TPaintBox ?

dział ogólny

jak odczytac wartosc slupka narysowanego w TPaintBox ?

Nowy postprzez jabu74 - ekspert » niedziela, 10 sierpnia 2008, 19:56

czy mozna odczytac i wyswietlic w dymku wartosc poszczegolnych slupkow (te zielone) albo raczej ich rzeczywistych wartosci w buforze np. po najechaniu kursorem ?

slupki narysowane sa funkcja Rectangle() i przesuwaja sie od prawej do lewej strony.

ponizej link do screenshota mojego miniprogramu

http://easyshare.yoyo.pl/image.php?id=adbee1.jpg

prosze o porady i propozycje

pozdrawiam :D
Avatar użytkownika
jabu74 - ekspert
 
    NieznanyNieznana

Re: jak odczytac wartosc slupka narysowanego w TPaintBox ?

Nowy postprzez Cyfrowy Baron » niedziela, 10 sierpnia 2008, 22:43

Obiekt TPaintBox oferuje tylko płótno Canvas, nie ma tam żadnych funkcji umożliwiających pobieranie takich wartości. Kod który rysuje na PainBox musi również sam przechowywać wszystkie potrzebne wartości. PaintBox można porównać do czystej nie zapisanej kartki papieru, od TImage różni się tym, że posiada własną kontrolkę, Image wykorzystuje powierzchnie innych obiektów i ma wbudowaną klasę TBitmap. TPaintBox to taki Canvas z własną kontrolką (powierzchnią).
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: jak odczytac wartosc slupka narysowanego w TPaintBox ?

Nowy postprzez jabu74 - ekspert » niedziela, 10 sierpnia 2008, 23:15

nie kapuje ale dzieki ! :mrgreen:
Avatar użytkownika
jabu74 - ekspert
 
    NieznanyNieznana

Re: jak odczytac wartosc slupka narysowanego w TPaintBox ?

Nowy postprzez Cyfrowy Baron » poniedziałek, 11 sierpnia 2008, 10:44

Wyjaśnię prościej. W celu odczytania wartości (jakiejkolwiek) słupka znajdującego się na PainBox, taki słupek musiałby być obiektem przechowującym te wartości, ale nie jest obiektem, lecz zwykłym zbiorem punktów, rysunkiem, nie przechowuje żadnych wartości. Obiekt PaintBox co prawda przechowuje wartości tych punktów, czyli ich położenie, ale nie posiada żadnych funkcji, które by zwracały te wartości. Gdy wskażesz myszką punkt na PaintBox to zwróci on położenie tego punktu w zdarzeniu OnMouseMove:

Kod: Zaznacz cały
void __fastcall TForm1::PaintBox1MouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
Label1->Caption = "Wspołrzędne XY: X = " + (String)X + "; Y = " + (String)Y;    
}


Jednak nie zwróci informacji o tym co się w pod tymi współrzędnymi znajduje, to musisz ty sprawdzać. Jeżeli coś rysujesz na PaintBox to wyznaczasz jakieś koordynaty tego rysunku, np. Rectangle musi zawierać wszystkie cztery punkty. Chcąc sprawdzić czy mysz wskazuje na prostokąt musisz sprawdzić czy koordynaty myszy zwracane w zdarzeniu OnMouseMove pokrywają się z koordynatami prostokąta. PainBox nie poda informacji o położeniu prostokąta, gdyż nie wie co to jest prostokąt, dla niego to po prostu grafika. Możesz oczywiście sprawdzać kolor pod wskazaniem myszy i tak ewentualnie sprawdzać czy to jest prostokąt.

Kod: Zaznacz cały
//---------------------------------------------------------------------------
void __fastcall TForm1::PaintBox1Paint(TObject *Sender)
{
PaintBox1->Canvas->Brush->Color = clYellow;
PaintBox1->Canvas->Rectangle(50, 50, 150, 100);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PaintBox1MouseMove(TObject *Sender,
     TShiftState Shift, int X, int Y)
{
if(PaintBox1->Canvas->Pixels[X][Y] == clYellow)
  Label1->Caption = "Wskazuje na prostokąt";
else
  Label1->Caption = "Wskazuje na pusty obszar";
}
//---------------------------------------------------------------------------


Nie można jednak odczytać z PaintBox wymiarów słupków, gdyż PainBox takich informacji nie posiada, ale program gdzieś musi przechowywać te informacje, skoro rysuje je na PaintBox i to właśnie z tamtąd należy pobrać te informacje. W przykładzie określiłem jawienie wymiary i położenie prostokąta, więc wskazując na prostokąt mogę również jawnie podać jego wymiary:

Kod: Zaznacz cały
//---------------------------------------------------------------------------
void __fastcall TForm1::PaintBox1Paint(TObject *Sender)
{
PaintBox1->Canvas->Brush->Color = clYellow;
PaintBox1->Canvas->Rectangle(50, 50, 150, 100);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PaintBox1MouseMove(TObject *Sender,
     TShiftState Shift, int X, int Y)
{
if(PaintBox1->Canvas->Pixels[X][Y] == clYellow)
  Label1->Caption = "Wymiary prostokąta: długość - 100, wysokość - 50; "
               "Położenie: X - 50, Y - 50";
else
  Label1->Caption = "";
}
//---------------------------------------------------------------------------


Jeżeli wymiary prostokąta są przechowywane w jakichś zmiennych to po wskazaniu tego prostokąta (rozróżnianie np. po kolorze) należy pobrać te wymiary z tych zmiennych, a nie z PaintBox, gdyż PaintBox nie zwraca takich danych, tylko je pobiera.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: jak odczytac wartosc slupka narysowanego w TPaintBox ?

Nowy postprzez Ho88it » poniedziałek, 11 sierpnia 2008, 13:04

A nie dało by rady w TCanvas wpakować zwykłego TProgressBar? Tak jak to się robi w pasku statusu? Mniej zaśmiecony kod, a TProgressBar obsługuje zdarzenia myszki i w ogóle go można potem czymś ładniejszym zastąpić. :roll:
Internet Explorer to program, który służy do przeglądania internetu z twojego komputera i na odwrót.
Avatar użytkownika
Ho88it
Homos antropiczny
Homos antropiczny
 
Posty: 63
Dołączył(a): niedziela, 10 sierpnia 2008, 20:53
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: Visual Studio 2008
Visual Studio 2010
Gadu Gadu: 0
    NieznanyNieznana

Re: jak odczytac wartosc slupka narysowanego w TPaintBox ?

Nowy postprzez Cyfrowy Baron » poniedziałek, 11 sierpnia 2008, 20:24

TCanvas nie posiada własnej kontrolki, to klasa abstrakcyjna, istnieje tylko jako przypisana do innej klasy, nigdy samodzielnie. TCanvas nie obsługuje klasy TControl, więc nie może kontrolować żadnego obiektu, nie może stać się "rodzicem" żadnego obiektu. w odróżnieniu np. od TStatusBar, który obsługuje klasę TControl.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

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

cron