[ Pobierz całość w formacie PDF ] .45.Plik ExampleButton.cpp// ExampleButton.cpp// By: Sean Rock, rev.by A.Grażyński 42//---------------------------------------------------------------------------#include#pragma hdrstop#include "ExampleButton.h"#pragma package(smart_init)//---------------------------------------------------------------------------// ValidCtrCheck is used to assure that the components created do not have// any pure virtual functions.//static inline void ValidCtrCheck(TExampleButton *){new TExampleButton(NULL);}//---------------------------------------------------------------------------__fastcall TExampleButton::TExampleButton(TComponent* Owner): TGraphicControl(Owner){SetBounds(0,0,50,50);ControlStyle = ControlStyle Brush->Color = clBtnFace;Canvas->FillRect(ClientRect);cRect = ClientRect;Graphics::TBitmap *bit = new Graphics::TBitmap;bit->Width = ClientWidth;bit->Height = ClientHeight;bit->Canvas->Brush->Color = clBtnFace;bit->Canvas->FillRect(cRect);if(FGlyph)if(!FGlyph->Empty){CalcGlyphLayout(gRect);bit->Canvas->BrushCopy(gRect, FGlyph,Rect(0,0,FGlyph->Width,FGlyph->Height), FGlyph->TransparentColor);}if(!FCaption.IsEmpty()){CalcTextLayout(tRect);bit->Canvas->TextRect(tRect, tRect.Left,tRect.Top, FCaption);}if(FState == esUp || FState == esDown){SwapColors(TopColor, BottomColor);Frame3D(bit->Canvas, cRect, TopColor, BottomColor, 1);}BitBlt(Canvas->Handle, 0, 0, ClientWidth, ClientHeight,bit->Canvas->Handle, 0, 0, SRCCOPY);delete bit;}// ---------------------------------------------------------------------------void __fastcall TExampleButton::CalcGlyphLayout(TRect &r){int TotalHeight=0;int TextHeight=0;if(!FCaption.IsEmpty())TextHeight = Canvas->TextHeight(FCaption);// poniższa wielkość marginesu, ustalona arbitralnie na 5 pikseli,// powinna być przedmiotem odrębnej właściwościTotalHeight = FGlyph->Height + TextHeight + 5; 45r = Rect((ClientWidth/2)-(FGlyph->Width/2),((ClientHeight/2)-(TotalHeight/2)), FGlyph->Width +(ClientWidth/2)-(FGlyph->Width/2), FGlyph->Height +((ClientHeight/2)-(TotalHeight/2)));}// ---------------------------------------------------------------------------void __fastcall TExampleButton::CalcTextLayout(TRect &r){int TotalHeight=0;int TextHeight=0;int TextWidth=0;TRect temp;if(FGlyph)TotalHeight = FGlyph->Height;TextHeight = Canvas->TextHeight(FCaption);TextWidth = Canvas->TextWidth(FCaption);TotalHeight += TextHeight + 5;temp.Left = 0;temp.Top = (ClientHeight/2)-(TotalHeight/2);temp.Bottom = temp.Top + TotalHeight;temp.Right = ClientWidth;r = Rect(((ClientWidth/2) - (TextWidth/2)), temp.Bottom-TextHeight,((ClientWidth/2)-(TextWidth/2))+TextWidth, temp.Bottom);}Wśród opublikowanych zdarzeń znajduje się tu jedynie OnClick, chociaż w rzeczywistymkomponencie listę tę należałoby raczej poszerzyć o zdarzenia OnMouseUp, OnMouseDown iOnMouseMove.Podobnie ma się sprawa z innymi właściwościami do opublikowanychCaption i Glyph prawdopodobnie powinna dołączyć także właściwość Font, reprezentującaczcionkę, którą wypisany zostanie tytuł przycisku.Użyteczne może się również okazaćprzechwycenie komunikatu CM_FONTCHANGED w celu dostosowania wzajemnego położeniatytułu i obrazka określonego przez właściwość Glyph.Obecnie przyjęto sztywną,pięciopikselową odległość pomiędzy nimi tę sztywną wartość bardziej elegancko będzie jednakpowierzyć odrębnej właściwości.Zwróćmy także uwagę na metodę SetGlyph(), będącą metodą dostępową właściwości Glyph.Aatwo zauważyć, iż metoda ta nieczuła jest na przekazanie wartości NULL, co powoduje, iż razprzypisanego komponentowi obrazka nie sposób już (na etapie projektowania) zlikwidować można to zrobić jedynie poprzez usunięcie komponentu z formularza i zastąpienie go nowym,pobranym z palety.USTERKA (1)Opisywany komponent (TExampleButton) ma pewną usterkę, przejawiającą się również i wniektórych innych komponentach przypisanie właściwości Glyph jakiejś bitmapy (a więc 46zmiana jej domyślnej wartości NULL) powoduje przy uruchomieniu aplikacji generowaniewyjątku związanego z niemożnością odczytu tej właściwości ze strumienia.Ostatnim elementem wartym krótkiego komentarza jest boolowska zmiennaFMouseInControl.Zmienna ta używana jest do określenia, czy kursor myszy znajduje sięaktualnie nad kontrolką; za utrzymywanie jej zgodności ze stanem faktycznym odpowiedzialne sąmetody CMMouseEnter() i CMMouseLeave().Znajomość położenia kursora jest o tyleistotna, iż w pewnych sytuacjach kontrolka może wciąż reagować na zdarzenia myszy, mimo iżkursor znajduje się już poza nią będzie tak np
[ Pobierz całość w formacie PDF ]
zanotowane.pldoc.pisz.plpdf.pisz.plhanula1950.keep.pl
|