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.