C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Люди, человеки…, Требуется помощь в наследовании.
kosf1
  Отправлено: 22.06.2003, 09:14


Не зарегистрирован







В ниже приведённом листинге реализовано следование кнопки, если кто знает, почему вместо кнопки получается ерунда какая-то, прошу подсказать.

--------------------------H-------------------------------------------------------
class PACKAGE AnButtonLite : public TButtonControl
{
private:
Graphics::TCanvas* FCanvas;
bool IsFocused;
bool IsMouseOver;
TColor FNormalColor;
TColor FHighlightedColor;
MESSAGE void __fastcall CNMeasureItem(TWMMeasureItem &Msg);
MESSAGE void __fastcall CNDrawItem(TWMDrawItem &Msg);
HIDESBASE MESSAGE void __fastcall CMFontChanged(TMessage &Message);
HIDESBASE MESSAGE void __fastcall CMEnabledChanged(TMessage &Message);
//HIDESBASE MESSAGE void __fastcall WMLButtonDblClk(Messages::TWMMouse &Message);
HIDESBASE MESSAGE void __fastcall CMMouseEnter(TMessage &Message);
HIDESBASE MESSAGE void __fastcall CMMouseLeave(TMessage &Message);
void __fastcall DrawItem(const TDrawItemStruct &DrawItemStruct);
void __fastcall SetNormalColor(TColor value);
void __fastcall SetHighlightedColor(TColor value);
//void __fastcall CNMeasureItem(TWMMeasureItem &Msg);
protected:
virtual void __fastcall CreateParams(TCreateParams &Params);
virtual void __fastcall SetButtonStyle(bool ADefault);
public:
__fastcall AnButtonLite(TComponent* Owner);
__published:

__property TColor NormalColor = {read=FNormalColor, write=SetNormalColor, nodefault};
__property TColor HighlightedColor = {read=FHighlightedColor, write=SetHighlightedColor, nodefault};
};

-------------------------СPP-----------------------------------------------------
__fastcall AnButtonLite::AnButtonLite(TComponent* Owner)
: TButtonControl(Owner)
{
TButton::TButton(Owner);

FCanvas = new TCanvas;

IsMouseOver = false;
FHighlightedColor = (TColor)0x004D4D4D;
FNormalColor = (TColor)0x00A3A3A3;
Font->Color = clWhite;
Font->Size = 10;
Font->Style << fsBold;

//Set width and height of button
Width = 97;
Height = 50;
}
void __fastcall AnButtonLite::CNMeasureItem(Messages::TWMMeasureItem &Msg)
{
Msg.MeasureItemStruct->itemWidth = Width;
Msg.MeasureItemStruct->itemHeight = Height;
Msg.Result = 1;
}
//---------------------------------------------------------------------------
void __fastcall AnButtonLite::CNDrawItem(Messages::TWMDrawItem &Msg)
{
DrawItem(*Msg.DrawItemStruct);
Msg.Result = 1;
}
//---------------------------------------------------------------------------
void __fastcall AnButtonLite::CMFontChanged(Messages::TMessage &Message)
{
Invalidate();
}
//---------------------------------------------------------------------------
void __fastcall AnButtonLite::CMEnabledChanged(Messages::TMessage &Message)
{
Invalidate();
}
//---------------------------------------------------------------------------
/*void __fastcall AnButtonLite::WMLButtonDblClk(Messages::TWMMouse &Message)
{
Perform(WM_LBUTTONDOWN, Message.Keys, (int)Message.Pos.x);
}*/
//---------------------------------------------------------------------------
void __fastcall AnButtonLite::CMMouseEnter(Messages::TMessage &Message)
{
if (!IsMouseOver) Invalidate();
}
//---------------------------------------------------------------------------
void __fastcall AnButtonLite::CMMouseLeave(Messages::TMessage &Message)
{
if (IsMouseOver) Invalidate();
}
//---------------------------------------------------------------------------
void __fastcall AnButtonLite::DrawItem(const TDrawItemStruct &DrawItemStruct)
{
bool IsDown, IsDefault;
TRect *R;
TPoint *CursorPos;
TRect BtnRect;
// tsSize : TSize;
// cx, cy : longint;
FCanvas->Handle = DrawItemStruct.hDC;
try
{
*R = ClientRect;

IsDown = !(DrawItemStruct.itemState && ODS_SELECTED);
IsDefault = !(DrawItemStruct.itemState && ODS_FOCUS);

GetCursorPos(CursorPos);

BtnRect.Left = Left;
BtnRect.Top = Top;
BtnRect.Right = Left + Width;
BtnRect.Bottom = Top + Height;
// Rect(Parent->ClientToScreen(Point(Left, Top)), Parent->ClientToScreen(Point(Left + Width,Top + Height)));
Rect(20,20,60,60);
// IsMouseOver = PtInRect(BtnRect, *CursorPos);

// Draws Outline
FCanvas->Pen->Width = 3;

if (IsMouseOver) {
if (IsDown)
FCanvas->Pen->Color = clBlack;
else
FCanvas->Pen->Color = clGray;
}
else
FCanvas->Pen->Color = clSilver;

FCanvas->MoveTo(0, R->Bottom-1);
FCanvas->LineTo(0, 0);
FCanvas->LineTo(R->Right-1, 0);

if (IsDown)
FCanvas->Pen->Color = clBlack;
else if (IsMouseOver || IsFocused || IsDefault)
FCanvas->Pen->Color = clBlack;
else
FCanvas->Pen->Color = clBlack;

FCanvas->LineTo(R->Right-10, R->Bottom-1);
FCanvas->LineTo(0, R->Bottom-1);

// fills canvas
if (IsMouseOver)
FCanvas->Brush->Color = FHighlightedColor;
else
FCanvas->Brush->Color = FNormalColor;

FCanvas->FillRect(Rect(2, 2, R->Right-2, R->Bottom-2));

// draws caption
if (Caption != "") {
FCanvas->Font = Font;

R->Top +=2;

if (IsDown) {
R->Top +=2;
R->Left +=2;
}
DrawText(FCanvas->Handle, Caption.c_str(), Caption.Length(), R, DT_CENTER || DT_VCENTER);
}
}

__finally
{
FCanvas->Handle = 0;
}
}
//---------------------------------------------------------------------------
void __fastcall AnButtonLite::SetNormalColor(Graphics::TColor value)
{
FNormalColor = value;
Invalidate();
}
//---------------------------------------------------------------------------
void __fastcall AnButtonLite::SetHighlightedColor(Graphics::TColor value)
{
FHighlightedColor = value;
Invalidate();
}
//---------------------------------------------------------------------------
void __fastcall AnButtonLite::CreateParams(Controls::TCreateParams &Params)
{
TButtonControl::CreateParams(Params);
Params.Style &=~ Params.Style || BS_PUSHLIKE ;
}
//---------------------------------------------------------------------------
void __fastcall AnButtonLite::SetButtonStyle(bool ADefault)
{
if (ADefault != IsFocused) {
IsFocused = ADefault;
Refresh();
}
}
//----------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
ABL=new AnButtonLite(this);
ABL->Parent=this;
}
//---------------------------------------------------------------------------
Георгий
Отправлено: 25.06.2003, 18:19


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



Вы создаёте наследника абстрактного класса — надо в методе CreateParams — полностью заполнить структуру  — сравните, с тем, что возвращает TButton::CreateParams(Params); — если твой класс обьявлен наследником не TButtonControl, а TButton. советую взять справочник по WinAPI и найти там описание того, как окна создаются

Вернуться в Вопросы программирования в C++Builder