// EditEx.cpp : implementation file
//
#include "stdafx.h"
#include "IconEdit.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define H_GAP (6)
#define V_GAP (4)
/////////////////////////////////////////////////////////////////////////////
// CEditEx
CIconEdit::CIconEdit()
: m_clrBack { 0xFDFDFD, 0xFEFEFE, 0xFFFFFF, 0xF0F0F0 }
, m_clrBorder{ 0xC8C8C8, 0xC8C8C8, 0xF08C3A, 0xC8C8C8 }
, m_clrText { 0x000000, 0x000000, 0x000000, 0xBEBEBE }
, m_clrDefaultText(0xC8C8C8)
{
}
CIconEdit::~CIconEdit()
{
}
BOOL CIconEdit::SetIcon(LPCTSTR szFileName)
{
BOOL bRet = FALSE;
m_Icon.Destroy(); //先释放以前资源
bRet = (m_Icon.Load(szFileName) == S_OK); //加载新资源
if (bRet)
{
GetClientRect(&m_rcIcon);
m_rcText = m_rcIcon;
m_rcIcon.right = H_GAP*2 + m_Icon.GetWidth();
m_rcText.left = m_rcIcon.right;
m_rcText.DeflateRect(0, V_GAP);
}
if (m_hWnd)
Invalidate(FALSE);
return bRet;
}
BOOL CIconEdit::SetDefaultText(LPCTSTR szDefault)
{
m_strDefault = szDefault;
if (m_hWnd)
Invalidate(FALSE);
return TRUE;
}
BEGIN_MESSAGE_MAP(CIconEdit, CEdit)
//{{AFX_MSG_MAP(CEditEx)
ON_WM_NCPAINT()
ON_WM_ERASEBKGND()
ON_WM_PAINT()
ON_WM_MOUSEMOVE()
ON_WM_SETFOCUS()
ON_WM_KILLFOCUS()
ON_MESSAGE(WM_MOUSEHOVER, OnMouseHOver)
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
ON_WM_ENABLE()
ON_WM_CTLCOLOR_REFLECT()
ON_CONTROL_REFLECT(EN_CHANGE, OnChange)
ON_WM_KEYDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CEditEx message handlers
void CIconEdit::OnNcPaint()
{
// TODO: Add your message handler code here
Default();
CDC* lpDC = GetWindowDC();
CRect rect;
GetWindowRect(rect);
CRect rectClient;
GetClientRect(rectClient);
ClientToScreen(rectClient);
rectClient -= rect.TopLeft();
rect -= rect.TopLeft();
lpDC->ExcludeClipRect(rectClient);
CPen pen;
pen.CreatePen(PS_SOLID, 1, m_clrBorder[m_status]);
CPen* lpOldPen = lpDC->SelectObject(&pen);
HBRUSH brushold = HBRUSH(lpDC->SelectObject(GetStockObject(NULL_BRUSH)));
lpDC->RoundRect(&rect, CPoint(2, 2));
lpDC->SelectObject(brushold);
lpDC->SelectObject(lpOldPen);
ReleaseDC(lpDC);
// Do not call CEdit::OnNcPaint() for painting messages
}
BOOL CIconEdit::OnEraseBkgnd(CDC* pDC)
{
if (!pDC)
return FALSE;
CRect rcClient;
GetClientRect(&rcClient);
//双缓冲绘图
{
CMemDC memDC(*pDC, rcClient);
CDC *pDC = &memDC.GetDC();
//填充背景色
pDC->BitBlt(0, 0, rcClient.Width(), rcClient.Height(), pDC, 0, 0, SRCCOPY);
pDC->SetStretchBltMode(HALFTONE);
//1. Draw Back
pDC->FillSolidRect(&rcClient, m_clrBack[m_status]);
//2. Draw Icon
if (!m_Icon.IsNull())
{
//原图大小
CRect rcSrc(0, 0, m_Icon.GetWidth(), m_Icon.GetHeight());
CRect rcDst = rcSrc;
CenterRect(&rcDst, &m_rcIcon);
m_Icon.Draw(pDC->m_hDC, rcDst, rcSrc);//绘图
}
//3. Draw DefaultText
if (m_status != CS_Focus)
{
CString sText = _T("");
GetWindowText(sText);
if (sText == "" && m_strDefault != "")
{
pDC->SetBkColor(m_clrBack[m_status]);
pDC->SetTextColor(m_clrDefaultText);
CFont* pFontOld = pDC->SelectObject(GetFont());
pDC->DrawText(m_strDefault, &m_rcText, DT_LEFT | DT_TOP | DT_SINGLELINE);
pDC->SelectObject(pFontOld);
}
}
}
return TRUE;// ::OnEraseBkgnd(pDC);
}
void CIconEdit::OnPaint()
{
SetRect(&m_rcText);
CEdit::OnPaint();
}
void CIconEdit::OnMouseMove(UINT nFlags, CPoint point)
{
if (!m_bTracked) {
TRACKMOUSEEVENT tme;
ZeroMemory(&tme, sizeof(TRACKMOUSEEVENT));
tme.cbSize = sizeof(TRACKMOUSEEVENT);
tme.dwFlags = TME_HOVER | TME_LEAVE;
tme.dwHoverTime = 1;
tme.hwndTrack = this->GetSafeHwnd();
if (::_TrackMouseEvent(&tme))
m_bTracked = true;
}
CEdit::OnMouseMove(nFlags, point);
}
LRESULT CIconEdit::OnMouseHOver(WPARAM wParam, LPARAM lParam)
{
if (CS_Hover != m_status && CS_Focus != m_status)
{
m_status = CS_Hover;
Invalidate();
}
return 0;
}
LRESULT CIconEdit::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
m_bTracked = false;
if (CS_Disable != m_status && CS_Focus != m_status)
m_status = CS_Normal;
Invalidate();
return 0;
}
void CIconEdit::OnEnable(BOOL bEnable)
{
m_status = bEnable ? CS_Normal : CS_Disable;
Invalidate();
CEdit::OnEnable(bEnable);
}
void CIconEdit::OnSetFocus(CWnd* pOldWnd)
{
m_status = CS_Focus;
Invalidate();
CEdit::OnSetFocus(pOldWnd);
}
void CIconEdit::OnKillFocus(CWnd* pNewWnd)
{
m_status = CS_Normal;
Invalidate();
CEdit::OnKillFocus(pNewWnd);
}
HBRUSH CIconEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{
// HBRUSH hbr = CEdit::CtlColor(pDC, nCtlColor);
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)GetStockObject(NULL_BRUSH);
}
void CIconEdit::OnSize(UINT nType, int cx, int cy)
{
CEdit::OnSize(nType, cx, cy);
m_rcIcon.bottom = cy;
m_rcText.right = cx;
m_rcText.bottom = cy - V_GAP;
}
void CIconEdit::OnChange()
{
Invalidate(FALSE);
CWnd* pParent = GetParent();
if (pParent && pParent->GetSafeHwnd())
{
pParent->PostMessage(WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(),EN_CHANGE_EX),LPARAM(GetSafeHwnd()));
}
}
void CIconEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(nChar == VK_RETURN)
{
CWnd* pParent = GetParent();
if (pParent && pParent->GetSafeHwnd())
{
pParent->PostMessage(WM_COMMAND, MAKEWPARAM(IDOK, 0), 0);
}
}
CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CIconEdit::PreSubclassWindow()
{
CEdit::PreSubclassWindow();
}
bool CIconEdit::CenterRect(LPRECT resRc, LPCRECT referenceRc)
{
if (!resRc || !referenceRc)
return false;
int w1 = resRc->right - resRc->left;
int h1 = resRc->bottom - resRc->top;
int w2 = referenceRc->right - referenceRc->left;
int h2 = referenceRc->bottom - referenceRc->top;
CRect rcTmp(resRc);
rcTmp -= CPoint(resRc->left-referenceRc->left, resRc->top - referenceRc->top);
rcTmp += CPoint((w2-w1)/double(2),(h2-h1)/double(2));
resRc->left = rcTmp.left;
resRc->top = rcTmp.top;
resRc->right = rcTmp.right;
resRc->bottom = rcTmp.bottom;
return true;
}