// Matt Streeter
// 2/27/00
// ESBUTTON.CPP
// Implementation of class TESButton; custom implementation of TButton control
// Copyright Matt Streeter, 2000. All rights reserved
#include "esbutton.h"
#include "eswindow.h"
#include <owl\dc.h>
// Static colors
TESButtonNode *TESButton::mpESButtonList=0;
TColor TESButton::mFrameHighlightColor(196,196,255);
TColor TESButton::mFrameLowlightColor(128,128,255);
// FRAME_WIDTH specifies the width, in pixels, of the frame drawn around a
// TESButton when the mouse moves over it.
#define FRAME_WIDTH 2
// The following three #defines specify the face, height, and weight,
// respectively, of the font used for the button label of a TESButton.
#define LABEL_FONT_FACE "MS Sans Serif"
#define LABEL_FONT_HEIGHT 18
#define LABEL_FONT_WEIGHT FW_BOLD
// The following two #defines determine the amount of vertical and horizontal
// padding, in pixels, between the button text and the edge of the window.
#define BUTTON_VPADDING 5
#define BUTTON_HPADDING 5
#if(!USE_PRETTY_BUTTONS)
TESButton::TESButton(TWindow* parent,int Id,const char far* text,int X,int Y,
int W,int H,bool isDefault,TModule* module)
:TButton(parent,Id,text,X,Y,W,H,isDefault,module)
{
}
#else
DEFINE_RESPONSE_TABLE1(TESButton,TButton)
EV_WM_MOUSEMOVE,
END_RESPONSE_TABLE;
// Public member functions
TESButton::TESButton(TESWindow* parent,int Id,const char far* text,
int X,int Y,int W,int H,bool isDefault,TModule* module)
:TButton((TWindow*)parent,Id,text,X,Y,W,H,isDefault,module)
{
AddToButtonList(this);
Attr.Style|=BS_OWNERDRAW;
mbMouseIn=0;
mpESParent=parent;
}
TESButton::TESButton(TESWindow *parent,int Id,const char far* text,
int X,int Y,bool isDefault,TModule* module)
:TButton((TWindow*)parent,Id,text,X,Y,GetMinWidth(parent,(char*)text),
GetMinHeight(parent,(char*)text),isDefault,module)
{
AddToButtonList(this);
Attr.Style|=BS_OWNERDRAW;
mbMouseIn=0;
mpESParent=parent;
}
TESButton::~TESButton()
{
RemoveFromButtonList(this);
}
int TESButton::IsESButton(TWindow *pWindow)
{
TESButtonNode *pCurrent=mpESButtonList;
while(pCurrent)
{
if((TWindow*)(pCurrent->pButton)==pWindow)
return(1);
pCurrent=pCurrent->pNext;
}
return(0);
}
void TESButton::EvMouseMove(uint modKeys, TPoint& point)
{
if(!mbMouseIn)
{
MouseEnter();
mbMouseIn=1;
}
ClientToScreen(point);
mpESParent->EvChildMouseMove(modKeys,point);
}
void TESButton::EvParentMouseMove(uint /*modKeys*/, TPoint& point)
{
TRect WRect;
GetWindowRect(WRect);
if(WRect.Contains(point))
{
if(!mbMouseIn)
{
MouseEnter();
mbMouseIn=1;
}
}
else if(mbMouseIn)
{
MouseLeave();
mbMouseIn=0;
}
}
// Protected member functions
void TESButton::MouseEnter()
{
TBrush HiBrush(mFrameHighlightColor);
TBrush LoBrush(mFrameLowlightColor);
TClientDC dc(*this);
TRect ClientRect;
GetClientRect(ClientRect);
// draw top bar
dc.FillRect(ClientRect.left,ClientRect.top,ClientRect.right+1,
ClientRect.top+FRAME_WIDTH,HiBrush);
// draw bottom bar
dc.FillRect(ClientRect.left,ClientRect.bottom-FRAME_WIDTH+1,
ClientRect.right+1,ClientRect.bottom+1,LoBrush);
// draw left bar
dc.FillRect(ClientRect.left,ClientRect.top,
ClientRect.left+FRAME_WIDTH,ClientRect.bottom+1,HiBrush);
// draw right bar
dc.FillRect(ClientRect.right-FRAME_WIDTH+1,ClientRect.top,
ClientRect.right+1,ClientRect.bottom+1,LoBrush);
}
void TESButton::MouseLeave()
{
Draw();
}
void TESButton::GetWindowClass(WNDCLASS& WndClass)
{
TWindow::GetWindowClass(WndClass);
WndClass.hbrBackground=(HBRUSH)(TESWindow::mBackgroundFillBrush);
}
void TESButton::ODADrawEntire(DRAWITEMSTRUCT far&)
{
Draw();
}
void TESButton::Draw()
{
TClientDC dc(*this);
TRect ClientRect;
GetClientRect(ClientRect);
dc.FillRect(ClientRect.left,ClientRect.top,ClientRect.right+1,
ClientRect.bottom+1,TESWindow::mBackgroundFillBrush);
// Draw button label
dc.SetBkColor(TESWindow::mBackgroundColor);
dc.SetTextColor(TESWindow::mTextColor);
TFont LabelFont(LABEL_FONT_FACE,LABEL_FONT_HEIGHT,0,0,0,LABEL_FONT_WEIGHT,
DEFAULT_PITCH|FF_DONTCARE,false,false,false,1,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,PROOF_QUALITY);
dc.SelectObject(LabelFont);
TSize Size=dc.GetTextExtent(Title,strlen(Title));
TPoint TextPos(ClientRect.left+(ClientRect.Width()+1-Size.cx)/2,
ClientRect.top+(ClientRect.Height()+1-Size.cy)/2);
dc.TextOut(TextPos,Title,strlen(Title));
}
int TESButton::GetMinHeight(TWindow *pParent,char *pText)
{
TClientDC dc(*pParent);
TFont LabelFont(LABEL_FONT_FACE,LABEL_FONT_HEIGHT,0,0,0,LABEL_FONT_WEIGHT,
DEFAULT_PITCH|FF_DONTCARE,false,false,false,1,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,PROOF_QUALITY);
dc.SelectObject(LabelFont);
TSize Size=dc.GetTextExtent(pText,strlen(pText));
return(Size.cy+BUTTON_VPADDING*2);
}
int TESButton::GetMinWidth(TWindow *pParent,char *pText)
{
TClientDC dc(*pParent);
TFont LabelFont(LABEL_FONT_FACE,LABEL_FONT_HEIGHT,0,0,0,LABEL_FONT_WEIGHT,
DEFAULT_PITCH|FF_DONTCARE,false,false,false,1,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,PROOF_QUALITY);
dc.SelectObject(LabelFont);
TSize Size=dc.GetTextExtent(pText,strlen(pText));
return(Size.cx+BUTTON_HPADDING*2);
}
// Private member functions
int TESButton::AddToButtonList(TESButton *pButton)
{
if(!mpESButtonList)
{
mpESButtonList=new TESButtonNode;
if(!mpESButtonList)
return(-1);
mpESButtonList->pButton=pButton;
mpESButtonList->pNext=0;
return(0);
}
TESButtonNode *pLast=mpESButtonList;
while(pLast->pNext)
pLast=pLast->pNext;
pLast->pNext=new TESButtonNode;
if(!pLast->pNext)
return(-1);
pLast->pNext->pButton=pButton;
pLast->pNext->pNext=0;
return(0);
}
int TESButton::RemoveFromButtonList(TESButton *pButton)
{
TESButtonNode *pLast=0,*pCurrent=mpESButtonList;
while(pCurrent)
{
if(pCurrent->pButton==pButton)
{
if(!pLast)
mpESButtonList=0;
else
pLast->pNext=pCurrent->pNext;
delete(pCurrent);
return(0);
}
pLast=pCurrent;
pCurrent=pCurrent->pNext;
}
return(-1);
}
#endif