编辑框等控件边框美化(继承CEdit,然后覆盖OnMouseLeave, OnSetFocus, OnPaint函数即可。原来的CEdit虽然代码不可见,但它也是有句柄的,照样随便画)
2018-02-21 01:13
453 查看
源码说明:美化能获取焦点控件的边框颜色,获取焦点后颜色不同(类似彗星小助手、QQ等软件),支持自定义颜色,支持单独设置各个控件颜色.
实现方法:子类化,在WM_NCPAINT、WM_PAINT等消息自己画出边框
开发环境:VS2005 MFC / 易语言
源码下载:http://download.csdn.net/detail/cometnet/5663673
![](http://img.blog.csdn.net/20130628105147218?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ29tZXROZXQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20130628105152421?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ29tZXROZXQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
[cpp] view plain copy
// 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://blog.csdn.net/CometNet/article/details/9194751
实现方法:子类化,在WM_NCPAINT、WM_PAINT等消息自己画出边框
开发环境:VS2005 MFC / 易语言
源码下载:http://download.csdn.net/detail/cometnet/5663673
[cpp] view plain copy
// 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://blog.csdn.net/CometNet/article/details/9194751
相关文章推荐
- 继承自TWinControl的控件不能在设计期间接受子控件,用代码设置子控件却可以(它的自绘是直接改写PaintWindow虚函数,而不是覆盖Paint函数——对TWinControl.WMPaint又有新解了)
- 现在使用控件, 更喜欢继承(覆盖控件已有的函数,很奇怪的一种使用方式)
- 设置页面的默认焦点控件和默认接受事件控件How Do I Set the DefaultFocus or DefaultButton in a Page Based on a Master Page in ASP.NET 2.0
- MATLAB句柄相关函数和代码示例(设置美化图表属性)
- 编辑框等控件边框美化
- 问题记录之Activity的继承类的继承类覆盖的onCreate()函数,无法成功setContentView
- Qt 自定义事件(三种方法:继承QEvent,然后Send Post就都可以了,也可以覆盖customEvent函数,也可覆盖event()函数)
- C#中控件Control的Paint事件和OnPaint虚函数的区别
- CListCtrl控件中InsertItem和SetItemText函数及CTreeCtrl::SetItemText
- VC中使用OnSize函数,设置控件位置的注意事项
- IsIconic()和OnPaint()函数 虽然没什么用 留个印象
- QTabWiget Change Color 改变颜色(每个QWidget都有一个自己的调色板palette,设置它的颜色,然后setAutoFillBackground即可)
- 继承—子父类中成员函数的特点-覆盖
- C++中通过溢出覆盖虚函数指针列表执行代码
- 从虚函数的内存构造谈C++继承中函数的覆盖与隐藏
- EXCEL VBA代码,实现点击Sheet1按钮控件保存不连续单元格的数据到Sheet2中,然后清空输入内容
- 关于OnPaint函数覆盖编辑框的问题
- 虚函数与多态性,虚拟继承,纯虚函数及重载、覆盖、隐藏的区别
- 拥有虚函数覆盖的菱形继承及菱形虚拟继承
- VS编写时前面出现黑色的方框 按任何键都会将原来的代码覆盖掉