[ Pobierz całość w formacie PDF ]
.Tu proszę umieścić rysunek 10.5 z oryginału (str.445), z następującymi zmianami:Text Height -> wysokość tekstuInternal Leading -> interliniaRysunek 10.5 Obliczenie wysokości tekstuOdniesienie poszczególnych elementów wymienionych w tabeli 10.9 do rzeczywistego elementupodlegającego rysowaniu przedstawia rysunek 10.6, na który będziemy często powoływać się wdalszej dyskusji.Tu proszę umieścić rysunek 10.6 z oryginału (str.446), bez zmian.Rysunek 10.6 Znaczenie poszczególnych parametrów metod edytora odpowiedzialnych zaprezentację edytowanej właściwościMetoda ListMeasureWidth()Wejściowa wartość parametru AWidth równa jest szerokości wypisywanego tekstu, równejACanvas >TextWidth(Value).Jeżeli wypisywanemu tekstowi towarzyszyć ma ikona,wartość ta musi zostać zmodyfikowana stosownie do tego faktu: przy założeniu kwadratowegokształtu ikony, dodatkowa szerokość równa będzie wysokości komórki (równej ACanvas>TextHeight("Ag")+2).Na rysunku 10.6 ikona towarzysząca tekstowi jest kwadratem oboku 16 pikseli, więc domyślna, 18 pikselowa wysokość komórki jest dla niej wystarczająca; dlaobrazków o innej szerokości należy oczywiście użyć innej, stosownej wartości.Tekstprzedefiniowanej z uwzględnieniem tego faktu metody ListMeasureWidth() przedstawiawydruk 10.11.Wydruk 10.11 Przedefiniowana metodaListMeasureWidth()void __fastcall TShapeTypePropertyEditor::ListMeasureWidth(const AnsiString Value,Graphics::TCanvas* ACanvas,int& AWidth){AWidth += (ACanvas->TextHeight("Ag")+2);}Metoda ListMeasureHeight()Z wyjątkiem przypadków, gdy towarzyszący tekstowi obrazek przekracza swą wysokościądomyślną wysokość komórki, wejściowa wartość AHeight nie powinna być modyfikowana.Wszczególności nie powinna być ona zmniejszana (a jeżeli już, to nigdy poniżej wartościACanvas >TextHeight("Ag")+2), gdyż grozi to obcięciem wyświetlanego tekstu.Zależnieod okoliczności wyjściowa wartość parametru AHeight może być wynikiem powiększenia jegowartość wejściowej o stałą wartość, bądz też przyrównaniem jej do rzeczywistej wysokościobrazka.Obydwa te podejścia ilustruje przedefiniowana metoda ListMeasureHeight() nawydruku 10.12Wydruk 10.12 Przedefiniowana metodaListMeasureHeight()void __fastcall TShapeTypePropertyEditor::ListMeasureHeight(const AnsiString Value,Graphics::TCanvas* ACanvas,int& AHeight){AHeight += wartość zwiększająca}// albo:void __fastcall TShapeTypePropertyEditor::ListMeasureHeight(const AnsiString Value,Graphics::TCanvas* ACanvas,int& AHeight){if ((ACanvas >TextHeight("Ag")+2) TextRect(// Rect(// vRight,// ARect.Top,// ARect.Right,// ARect.Bottom// ),// vRight+1,// ARect.Top+1,// Value// );}}Rzeczywisty kod czyniący zadość powyższemu schematowi przedstawiamy na wydruku 10.14.Prezentowany tekst odpowiedzialny jest za kompletne narysowanie każdej z pozycji listy tekstowej nazwie kształtu towarzyszy jego graficzny odpowiednik, co widzieliśmy już na rysunku10.4.Wydruk 10.13 Implementacja przedefiniowanejmetody ListDrawValue()void __fastcall TShapeTypePropertyEditor::ListDrawValue(const AnsiString Value,Graphics::TCanvas* ACanvas,const Windows::TRect& ARect,bool ASelected){// Zadeklaruj zmienną vRight typu int wskazującą prawą krawędz obrazkaint vRight = ARect.Bottom - ARect.Top + ARect.Left;try{//Krok 1 Zachowaj wartość tych właściwości płótna, które będą// zmieniane:TColor vOldPenColor = ACanvas->Pen->Color;TColor vOldBrushColor = ACanvas->Brush->Color;//Krok 2 Wyczyść obramowanie obszaru podlegającego modyfikacji.ACanvas->Pen->Color = ACanvas->Brush->Color;ACanvas->Rectangle(ARect.Left, ARect.Top, vRight, ARect
[ Pobierz całość w formacie PDF ]