| 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 и найти там описание того, как окна создаются  | 
 
  | 
 
  |