Introduction
This is an easy way to change the style of an edit control. We can add a message handler for WM_CTLCOLOR
in the parent window (a dialog) and then use a switch sentence to determine a change with the edit control style. When there are many edit boxed, you find this unadvisable. So, I decided to write my own edit class named CExEdit
, which is derived from CEdit
.
Using the code
The following member functions are provided by the new class CExEdit
:
void setTextColor( COLORREF clrText );
void setFontSize( int nSize );
void setFontStyle( BOOL bItalic, BOOL bBold, BOOL bUnderLine );
void setBkColor( COLORREF clrBk );
void setFont( CString strFontName, BYTE language );
void drawEditFrame();
void setFontHelper();
Its implementation is very easy. Like in the following code:
void CExEdit::setTextColor( COLORREF clrText )
{
m_clrText = clrText;
}
void CExEdit::setFontSize( int nSize )
{
m_nFontSize = nSize;
}
void CExEdit::setFontStyle( BOOL bItalic, BOOL bBold, BOOL bUnderLine )
{
m_bItalic = bItalic;
m_bBold = bBold;
m_bUnderLine = bUnderLine;
}
void CExEdit::setBkColor( COLORREF clrBk )
{
m_clrBk = clrBk;
if( m_bkBrush.m_hObject )
m_bkBrush.DeleteObject();
m_bkBrush.CreateSolidBrush( m_clrBk );
}
void CExEdit::setFont( CString strFontName, BYTE language )
{
m_strFontName = strFontName;
m_language = language;
}
void CExEdit::drawEditFrame()
{
CRect rcItem;
CDC* pDC=this->GetDC();
this->GetClientRect(&rcItem);
if( !this->IsWindowEnabled() )
{
rcItem.InflateRect( 1, 1 );
pDC->Draw3dRect( rcItem, RGB( 96, 96, 96),RGB( 96, 96, 96));
rcItem.InflateRect(1,1);
pDC->Draw3dRect( rcItem, RGB( 128, 128, 128),RGB( 128, 128, 128 ) );
ReleaseDC( pDC );
return;
}
if( m_bOver&& m_bFocus )
{
rcItem.InflateRect(1,1);
pDC->Draw3dRect(rcItem,RGB( 255, 102, 51 ),RGB( 255, 102, 51 ) );
rcItem.InflateRect(1,1);
pDC->Draw3dRect(rcItem,RGB( 255, 163, 132 ),RGB( 255, 163, 132 ) );
}
if( m_bOver && !m_bFocus )
{
rcItem.InflateRect( 1, 1 );
pDC->Draw3dRect( rcItem,RGB( 0, 176, 88 ),RGB( 0, 176, 88 ) );
rcItem.InflateRect(1,1);
pDC->Draw3dRect( rcItem,RGB( 122, 189, 32 ),RGB( 122, 189, 32 ) );
}
if( !m_bOver )
{
rcItem.InflateRect( 1, 1 );
pDC->Draw3dRect(rcItem,RGB(102,102,153),RGB(102,102,153));
rcItem.InflateRect( 1, 1);
pDC->Draw3dRect(rcItem,RGB(174,174,202),RGB(174,174,202));
}
ReleaseDC(pDC);
}
void CExEdit::setFontHelper()
{
if( m_pFont->m_hObject )
m_pFont->DeleteObject();
LOGFONT lgFont;
lgFont.lfCharSet = m_language;
lgFont.lfClipPrecision = 0;
lgFont.lfEscapement = 0;
strcpy( lgFont.lfFaceName, m_strFontName );
lgFont.lfHeight = m_nFontSize;
lgFont.lfItalic = m_bItalic;
lgFont.lfOrientation = 0;
lgFont.lfOutPrecision = 0;
lgFont.lfPitchAndFamily = 2;
lgFont.lfQuality = 0;
lgFont.lfStrikeOut = 0;
lgFont.lfUnderline = m_bUnderLine;
lgFont.lfWidth = 0;
if( m_bBold )
lgFont.lfWeight = FW_BOLD;
else
lgFont.lfWeight = FW_NORMAL;
m_pFont->CreatePointFontIndirect( &lgFont );
SetFont( m_pFont );
}
Adding a message handler
Add the following message handler in the CExEdit
class:
afx_msg void OnKillfocus();
afx_msg void OnSetfocus();
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg LRESULT OnMouseHover( WPARAM wParam, LPARAM lParam );
afx_msg LRESULT OnMouseLeave( WPARAM wParam, LPARAM lParam );
afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
First, we must add the following code to track mouse events to the dynamic style changes of the edit control.
void CExEdit::OnMouseMove(UINT nFlags, CPoint point)
{
TRACKMOUSEEVENT mouseEvent;
mouseEvent.cbSize = sizeof( TRACKMOUSEEVENT );
mouseEvent.dwFlags = TME_HOVER | TME_LEAVE;
mouseEvent.dwHoverTime = 0;
mouseEvent.hwndTrack = m_hWnd;
_TrackMouseEvent( &mouseEvent );
CEdit::OnMouseMove(nFlags, point);
}
The following code is very important, in which we can change the background color, the text color, and others.
HBRUSH CExEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{
drawEditFrame();
pDC->SetTextColor( m_clrText );
pDC->SetBkColor( m_clrBk );
return m_bkBrush;
}