////////////////////////////////////////////////////////////////// // StringEffect - 字符串效果 // // Author: 木头云 // Blog: http://blog.csdn.net/markl22222 // E-Mail: [email protected] // Version: 1.0.1002.1308 ////////////////////////////////////////////////////////////////// #if !defined(__STRING_EFFECT_H__) #define __STRING_EFFECT_H__ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "MemDC.h" ////////////////////////////////////////////////////////////////// class CStringEffect { public: // 将字符串转换为 Color static COLORREF StringToColor(CString strColor) { if( strColor.IsEmpty() ) return RGB(0, 0, 0); COLORREF clr = RGB(0, 0, 0); if( strColor[0] == _T('#') && strColor.GetLength() >= 7 ) { strColor.Delete(0); TCHAR str_rgb[7] = {0}; TCHAR a_str_rgb[3][3] = {0}; _tcscpy(str_rgb, strColor.GetBuffer(0)); strColor.ReleaseBuffer(); _tcscpy(a_str_rgb[0], str_rgb + 0); a_str_rgb[0][2] = _T('/0'); _tcscpy(a_str_rgb[1], str_rgb + 2); a_str_rgb[1][2] = _T('/0'); _tcscpy(a_str_rgb[2], str_rgb + 4); a_str_rgb[2][2] = _T('/0'); UINT rgb[3] = {0}; rgb[0] = _tcstol(a_str_rgb[0], NULL, 16); rgb[1] = _tcstol(a_str_rgb[1], NULL, 16); rgb[2] = _tcstol(a_str_rgb[2], NULL, 16); clr = RGB(rgb[0], rgb[1], rgb[2]); } else if( strColor.GetLength() >= 9 ) { TCHAR str_rgb[10] = {0}; TCHAR a_str_rgb[3][4] = {0}; _tcscpy(str_rgb, strColor.GetBuffer(0)); strColor.ReleaseBuffer(); _tcscpy(a_str_rgb[0], str_rgb + 0); a_str_rgb[0][3] = _T('/0'); _tcscpy(a_str_rgb[1], str_rgb + 3); a_str_rgb[1][3] = _T('/0'); _tcscpy(a_str_rgb[2], str_rgb + 6); a_str_rgb[2][3] = _T('/0'); UINT rgb[3] = {0}; rgb[0] = _tcstol(a_str_rgb[0], NULL, 10); rgb[1] = _tcstol(a_str_rgb[1], NULL, 10); rgb[2] = _tcstol(a_str_rgb[2], NULL, 10); clr = RGB(rgb[0], rgb[1], rgb[2]); } return clr; } // 将字符串转换为 Rect static CRect StringToRect(CString strRect) { if( strRect.IsEmpty() ) return CRect(0, 0, 0, 0); CRect rc(0, 0, 0, 0); strRect.Remove(_T(' ')); CStringArray sa; StringToArray(strRect, sa, _T(",")); if( sa.GetSize() >= 4 ) { rc.SetRect( _tcstol(sa[0], NULL, 10), _tcstol(sa[1], NULL, 10), _tcstol(sa[2], NULL, 10), _tcstol(sa[3], NULL, 10) ); } return rc; } // 将字符串转换为 Size static CSize CSkinManager::StringToSize(CString strSize) { if( strSize.IsEmpty() ) return CSize(0, 0); CSize sz(0, 0); strSize.Remove(_T(' ')); CStringArray sa; StringToArray(strSize, sa, _T(",")); if( sa.GetCount() >= 2 ) { sz.SetSize( _tcstol(sa[0], NULL, 10), _tcstol(sa[1], NULL, 10) ); } return sz; } // 将字符串转换为 Array static int StringToArray(const CString& s, CStringArray& sa, LPCTSTR spl) { int nLen = s.GetLength(), nLastPos, nPos; bool bContinue; sa.RemoveAll(); nLastPos = 0; CString sspl(spl); do { bContinue = false; nPos = s.Find(spl, nLastPos); if( -1 != nPos ) { sa.Add(s.Mid(nLastPos, nPos - nLastPos)); nLastPos = nPos + sspl.GetLength(); if(nLastPos != nLen) bContinue=true; } }while( bContinue ); if( nLastPos != nLen ) sa.Add(s.Mid(nLastPos, nLen - nLastPos)); return (int)sa.GetSize(); } ///////////////////////////////// // 按区域截断字符串 static CString TruncateString(const CString& strTru, CRect rcTru, CDC* pDC/* = NULL*/) { if( strTru.IsEmpty() ) return strTru; CString str = strTru; const CString STR_ELLIPSIS = _T("..."); const CString STR_NULL = _T(""); BOOL bIsGetDC = FALSE; if( !pDC || !pDC->m_hDC ) { pDC = CWnd::GetDesktopWindow()->GetDC(); bIsGetDC = TRUE; } CSize size = pDC->GetTextExtent(str); if( size.cx <= rcTru.Width() ) return str; size = pDC->GetTextExtent(STR_ELLIPSIS); if( size.cx > rcTru.Width() ) return STR_NULL; int nStringLen = str.GetLength(); for(int i = nStringLen - 1; i >= 0; i--) { str.Delete(i); if( (pDC->GetTextExtent(str).cx + size.cx) <= rcTru.Width() ) break; } if( bIsGetDC ) CWnd::GetDesktopWindow()->ReleaseDC(pDC); str += STR_ELLIPSIS; return str; } ///////////////////////////////// // 反色字 static void DrawInvertString(const CString str, CDC& dc, CRect& rc, UINT nFormat) { if( str.IsEmpty() ) return ; // 创建临时DC CBufDC dc_buf( &dc, &rc ); dc_buf.FillSolidRect( &rc, RGB(0, 0, 0) ); // 绘制文字 dc_buf.SetBkMode(TRANSPARENT); dc_buf.SetTextColor(RGB(255, 255, 255)); CFont* fnt = dc_buf.SelectObject(dc.GetCurrentFont()); dc_buf.DrawText(str, &rc, nFormat); dc.BitBlt(rc.left, rc.top, rc.Width(), rc.Height(), &dc_buf, rc.left, rc.top, SRCINVERT); // 清理内存 if( fnt ) dc_buf.SelectObject(fnt); } // 镂空字 static void DrawEmptyString(const CString str, CDC& dc, CRect& rc, UINT nFormat) { if( str.IsEmpty() ) return ; // 绘制边框 COLORREF clr = dc.GetTextColor(); dc.SetTextColor(clr ^ RGB(255, 255, 255)); CRect rc_tmp(rc); rc_tmp.OffsetRect(1, 0); dc.DrawText(str, &rc_tmp, nFormat); rc_tmp = rc; rc_tmp.OffsetRect(-1, 0); dc.DrawText(str, &rc_tmp, nFormat); rc_tmp = rc; rc_tmp.OffsetRect(0, 1); dc.DrawText(str, &rc_tmp, nFormat); rc_tmp = rc; rc_tmp.OffsetRect(0, -1); dc.DrawText(str, &rc_tmp, nFormat); // 绘制文字 dc.SetTextColor(clr); dc.DrawText(str, &rc, nFormat); } // 阴影字 static void DrawShadowString(const CString str, CDC& dc, CRect& rc, UINT nFormat) { if( str.IsEmpty() ) return ; // 创建临时DC CRect rc_sha( rc ); rc_sha.right += 3; rc_sha.bottom += 3; CBufDC dc_tmp( &dc, &rc_sha ); CBufDC dc_buf( &dc, &rc_sha ); dc_buf.BitBlt(rc_sha.left, rc_sha.top, rc_sha.Width(), rc_sha.Height(), &dc, rc_sha.left, rc_sha.top, SRCCOPY); // 绘制阴影 dc_tmp.SetBkMode(TRANSPARENT); dc_tmp.SetTextColor(RGB(0, 0, 0)); CFont* fnt = dc_tmp.SelectObject(dc.GetCurrentFont()); CRect rc_tmp( rc ); BLENDFUNCTION blend; blend.BlendOp = AC_SRC_OVER; blend.BlendFlags = 0; blend.AlphaFormat = 0; ////////////////////////////////// rc_tmp.OffsetRect(1, 1); dc_tmp.BitBlt(rc_sha.left, rc_sha.top, rc_sha.Width(), rc_sha.Height(), &dc, rc_sha.left, rc_sha.top, SRCCOPY); dc_tmp.DrawText(str, &rc_tmp, nFormat); blend.SourceConstantAlpha = 158; ::AlphaBlend(dc_buf.GetSafeHdc(), rc_sha.left, rc_sha.top, rc_sha.Width(), rc_sha.Height(), dc_tmp.GetSafeHdc(), rc_sha.left, rc_sha.top, rc_sha.Width(), rc_sha.Height(), blend); ////////////////////////////////// rc_tmp.OffsetRect(1, 1); dc_tmp.BitBlt(rc_sha.left, rc_sha.top, rc_sha.Width(), rc_sha.Height(), &dc, rc_sha.left, rc_sha.top, SRCCOPY); dc_tmp.DrawText(str, &rc_tmp, nFormat); blend.SourceConstantAlpha = 37; ::AlphaBlend(dc_buf.GetSafeHdc(), rc_sha.left, rc_sha.top, rc_sha.Width(), rc_sha.Height(), dc_tmp.GetSafeHdc(), rc_sha.left, rc_sha.top, rc_sha.Width(), rc_sha.Height(), blend); ////////////////////////////////// rc_tmp.OffsetRect(0, 1); dc_tmp.BitBlt(rc_sha.left, rc_sha.top, rc_sha.Width(), rc_sha.Height(), &dc, rc_sha.left, rc_sha.top, SRCCOPY); dc_tmp.DrawText(str, &rc_tmp, nFormat); blend.SourceConstantAlpha = 14; ::AlphaBlend(dc_buf.GetSafeHdc(), rc_sha.left, rc_sha.top, rc_sha.Width(), rc_sha.Height(), dc_tmp.GetSafeHdc(), rc_sha.left, rc_sha.top, rc_sha.Width(), rc_sha.Height(), blend); ////////////////////////////////// dc.BitBlt(rc_sha.left, rc_sha.top, rc_sha.Width(), rc_sha.Height(), &dc_buf, rc_sha.left, rc_sha.top, SRCCOPY); // 绘制文字 dc.DrawText(str, &rc, nFormat); } }; ////////////////////////////////////////////////////////////////// #endif // !defined(__STRING_EFFECT_H__)
其中的CBufDC为专门用于缓存的DC类,继承自CMemDC.