|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Announcements
Chapters
Services
Feature Zones
|
Note: This is an unedited contribution. If this article is inappropriate,
needs attention or copies someone else's work without reference then please
Report This Article
IntroductionThis is an easy way to change the style of edit controls.You know, we can add message handler WM_CTLCOLOR in it's parent window( a dialog ).Then use switch sentence to determine change which edit control styles.when there many edit box, you find It's unadvisable.So I determined to write my own edit class-named CExEdit, which derived from CEdit. Using the codeThe following member functions provided by the new class-CExEdit. void setTextColor( COLORREF clrText ); // set the text color of edit control void setFontSize( int nSize ); // set size of font void setFontStyle( BOOL bItalic, BOOL bBold, BOOL bUnderLine ); void setBkColor( COLORREF clrBk ); //set the background color of edit control void setFont( CString strFontName, BYTE language ); // set font name, and character set void drawEditFrame(); //draw edit border void setFontHelper(); It's implement is very easy.Like as 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 ); //m_bkBrush.CreateSolidBrush( RGB( 0, 255, 255 ) ); } 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 ); } Add message handlerAdd the following message handler in 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 event to dynamic change style of the edit control . void CExEdit::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default 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 backgroud color, textcolor and others. HBRUSH CExEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{
// TODO: Change any attributes of the DC here
drawEditFrame();
pDC->SetTextColor( m_clrText );
pDC->SetBkColor( m_clrBk );
//pDC->SetBkMode( TRANSPARENT );
// TODO: Return a non-NULL brush if the parent's handler should not be called
return m_bkBrush;
}
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||