CEdit 编辑框控件边框美化

邓学彬 2013-06-28 11:00:35
源码说明:美化能获取焦点控件的边框颜色,获取焦点后颜色不同(类似彗星小助手、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);
}


源码下载:http://download.csdn.net/detail/cometnet/5663673
...全文
670 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
maomao85 2013-12-29
  • 打赏
  • 举报
回复
版主回复我啊,我很迷惑啊,rc=CRect(0,0,rc.right-rc.left,rc.bottom-rc.top); 为什么要让rc这个矩形以0为起点? ::GetWindowRect(m_hWnd,&rc);这个矩形的大小时edit控件的客户区+edit控件的非客户区吗?
u011730237 2013-11-06
  • 打赏
  • 举报
回复
提醒楼主结贴。。
tanyufeng_521 2013-08-31
  • 打赏
  • 举报
回复
方法很好,顶一下
向立天 2013-08-31
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
邓学彬 2013-07-31
  • 打赏
  • 举报
回复
引用 10 楼 jiejieaiai 的回复:
楼主写的不错呀,是不是用钩子钩的呢,还是直接用呢楼主
没有钩子,直接在相关消息里绘制的,具体请看源码
onlyhuiyi 2013-07-31
  • 打赏
  • 举报
回复
这样的帖子一定要顶
邓学彬 2013-07-30
  • 打赏
  • 举报
回复
引用 5 楼 zhousitiaoda 的回复:
版主自己也给自己推荐下呗。。
不能"滥用职权".呵呵
jiejieaiai 2013-07-30
  • 打赏
  • 举报
回复
楼主写的不错呀,是不是用钩子钩的呢,还是直接用呢楼主
gfm688 2013-07-30
  • 打赏
  • 举报
回复
文字垂直居中,还是去掉编辑框边框,然后用另一个控件做边框来得简单
etz2008 2013-07-30
  • 打赏
  • 举报
回复
文字不能垂直居中。
zhousitiaoda 2013-07-23
  • 打赏
  • 举报
回复
版主自己也给自己推荐下呗。。
bazzi2011 2013-07-23
  • 打赏
  • 举报
回复
这才是业界良心!
zgl7903 2013-07-23
  • 打赏
  • 举报
回复
VisualUI 2013-07-22
  • 打赏
  • 举报
回复
学习一下
jaynaviee 2013-06-28
  • 打赏
  • 举报
回复
顶!!!!!!!!!!! 收藏了
wanglu343280746 2013-06-28
  • 打赏
  • 举报
回复
顶一个,虽然没看内容

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧