源码说明:美化能获取焦点控件的边框颜色,获取焦点后颜色不同(类似彗星小助手、QQ等软件),支持自定义颜色,支持单独设置各个控件颜色.
实现方法:子类化,在WM_NCPAINT、WM_PAINT等消息自己画出边框
开发环境:VS2005 MFC / 易语言
源码下载:http://download.csdn.net/detail/cometnet/5663673
// SkinEdit.cpp : 实现文件
//
#include "stdafx.h"
#include "SkinEdit.h"
// CSkinEdit
IMPLEMENT_DYNAMIC(CSkinEdit, CEdit)
CSkinEdit::CSkinEdit()
{
m_bTracking=m_bHover=m_bFocus=FALSE;
m_ClientBrush=::CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
m_hOrderBrush=::CreateSolidBrush(GetSysColor(COLOR_WINDOWFRAME));
m_HotOrderBrush1=::CreateSolidBrush(0xFDC860);
m_HotOrderBrush2=::CreateSolidBrush(0xE7AC49);
}
CSkinEdit::~CSkinEdit()
{
DeleteObject(m_ClientBrush);
DeleteObject(m_hOrderBrush);
DeleteObject(m_HotOrderBrush1);
DeleteObject(m_HotOrderBrush2);
}
BEGIN_MESSAGE_MAP(CSkinEdit, CEdit)
ON_WM_NCPAINT()
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
ON_WM_MOUSEMOVE()
ON_WM_SETFOCUS()
ON_WM_KILLFOCUS()
END_MESSAGE_MAP()
// CSkinEdit 消息处理程序
void CSkinEdit::OnMouseMove(UINT nFlags, CPoint point)
{
if (!m_bTracking)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE | TME_HOVER;
tme.dwHoverTime = 50;
m_bTracking = (bool)_TrackMouseEvent(&tme);
}
CEdit::OnMouseMove(nFlags, point);
}
LRESULT CSkinEdit::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
m_bTracking = FALSE;
m_bHover=FALSE;
DrawBorder();
return 0;
}
LRESULT CSkinEdit::OnMouseHover(WPARAM wParam, LPARAM lParam)
{
m_bHover=TRUE;
DrawBorder();
return 0;
}
void CSkinEdit::OnSetFocus(CWnd* pOldWnd)
{
CEdit::OnSetFocus(pOldWnd);
m_bFocus=TRUE;
DrawBorder();
}
void CSkinEdit::OnKillFocus(CWnd* pNewWnd)
{
CEdit::OnKillFocus(pNewWnd);
m_bFocus=FALSE;
DrawBorder();
}
void CSkinEdit::OnNcPaint()
{
CEdit::OnNcPaint();
DrawBorder();
}
void CSkinEdit::OnPaint()
{
CEdit::OnPaint();
DrawBorder();
}
void CSkinEdit::DrawBorder()
{
HDC hDC=::GetWindowDC(m_hWnd);
CRect rc;
::GetWindowRect(m_hWnd,&rc);
rc=CRect(0,0,rc.right-rc.left,rc.bottom-rc.top);
if(m_bHover){
::FrameRect(hDC,&rc,m_HotOrderBrush1);
rc.InflateRect(-1,-1);
::FrameRect(hDC,&rc,m_HotOrderBrush2);
}else if(m_bFocus){
::FrameRect(hDC,&rc,m_ClientBrush);
rc.InflateRect(-1,-1);
::FrameRect(hDC,&rc,m_HotOrderBrush2);
}else{
::FrameRect(hDC,&rc,m_ClientBrush);
rc.InflateRect(-1,-1);
::FrameRect(hDC,&rc,m_hOrderBrush);
}
::ReleaseDC(m_hWnd,hDC);
}