📄 flatedit.cpp
字号:
// CFlatEdit.cpp : implementation file
////////////////////////////////////////////////
#include "stdafx.h"
#include "FlatEdit.h"
/////////////////////////////////////////////////////////////////////////////
CFlatEdit::CFlatEdit()
{
// 失去焦点时扁平
m_bHotFlat = 2;
m_bMouseHover = FALSE;
// 文字颜色
m_rgbDown = RGB(0, 0, 255);
m_rgbText = RGB(0, 0, 0);
// 背景颜色
m_bkColor = RGB(255, 255, 255);
m_bkActive = RGB(255, 255, 255);
// 画笔句柄
m_hbrColor = NULL;
m_hbrActive = NULL;
// 最大输入个数
m_nMaxSize = -1;
}
CFlatEdit::~CFlatEdit()
{
if(m_hbrColor != NULL)
DeleteObject(m_hbrColor);
if(m_hbrActive != NULL)
DeleteObject(m_hbrActive);
}
BEGIN_MESSAGE_MAP(CFlatEdit, CEdit)
//{{AFX_MSG_MAP(CFlatEdit)
ON_WM_CTLCOLOR_REFLECT()
ON_WM_PAINT()
ON_WM_MOUSEMOVE()
ON_WM_SETFOCUS()
ON_WM_KILLFOCUS()
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFlatEdit message handlers
// 象控件一样创建
BOOL CFlatEdit::Create(DWORD dwStyle, const RECT& rect,
CWnd * lpParent, UINT nWndID, DWORD dwExStyle)
{
long cx = rect.right - rect.left;
long cy = rect.bottom - rect.top;
HWND hWnd = CreateWindowEx(dwExStyle,
"EDIT", NULL, dwStyle, rect.left,
rect.top, cx, cy, lpParent->GetSafeHwnd(),
(HMENU)nWndID, AfxGetInstanceHandle(), NULL);
if(hWnd == NULL) return FALSE;
return SubclassWindow(hWnd);
}
void CFlatEdit::PreSubclassWindow()
{
CEdit::PreSubclassWindow();
// 设置最大输入个数
if(m_nMaxSize > 0) SetLimitText(m_nMaxSize);
}
HBRUSH CFlatEdit::CtlColor(CDC * lpDC, UINT nCtlColor)
{
if( ::GetFocus() == m_hWnd ||
(m_bHotFlat == 2 && m_bMouseHover) )
{
if(m_hbrActive == NULL)
m_hbrActive = CreateSolidBrush(m_bkActive);
lpDC->SetTextColor(m_rgbDown);
lpDC->SetBkColor(m_bkActive);
return m_hbrActive;
}
if(m_hbrColor == NULL)
m_hbrColor = CreateSolidBrush(m_bkColor);
// 一般背景颜色
lpDC->SetTextColor(m_rgbText);
lpDC->SetBkColor(m_bkColor);
return m_hbrColor;
}
void CFlatEdit::OnPaint()
{
// 调用默认的函数
Default();
// 画出 Flat 样式
if( m_bHotFlat == 3 ||
::GetFocus() != m_hWnd )
{
if( (m_bHotFlat == 2 && !m_bMouseHover) ||
m_bHotFlat == 3 || m_bHotFlat == 1 )
{
// 边界样式
CRect rtFrame;
GetWindowRect(&rtFrame);
rtFrame.bottom -= rtFrame.top;
rtFrame.right -= rtFrame.left;
rtFrame.left = rtFrame.top = 0;
// 画出边界来
CWindowDC dc(this);
COLORREF rgbPen = GetSysColor(COLOR_3DSHADOW);
dc.Draw3dRect(&rtFrame, rgbPen, rgbPen);
// 去掉其它边界
long nCount = 0;
DWORD dwStyle = GetExStyle();
if(dwStyle & WS_EX_CLIENTEDGE) nCount += 2;
if(dwStyle & WS_EX_STATICEDGE) nCount += 2;
if(dwStyle & WS_EX_DLGMODALFRAME)
{
if(dwStyle & WS_EX_STATICEDGE)
nCount ++;
else nCount += 3;
}
for(nCount --; nCount > 0; nCount --)
{
rtFrame.DeflateRect(1, 1);
dc.Draw3dRect(&rtFrame, m_bkColor, m_bkColor);
}
// DrawFlat 返回
return;
}
}
// 恢复原来的边界
SendMessage(WM_NCPAINT, 0x0001);
}
void CFlatEdit::OnSetFocus(CWnd* pOldWnd)
{
CEdit::OnSetFocus(pOldWnd);
Invalidate(TRUE);
// 发送一个消息到父窗口
GetParent()->SendMessage(WM_EDIT_FOCUS,
TRUE, GetDlgCtrlID() );
}
void CFlatEdit::OnKillFocus(CWnd* pNewWnd)
{
CEdit::OnKillFocus(pNewWnd);
Invalidate(TRUE);
// 发送一个消息到父窗口
GetParent()->SendMessage(WM_EDIT_FOCUS,
FALSE, GetDlgCtrlID() );
}
void CFlatEdit::OnMouseMove(UINT nFlags, CPoint point)
{
// 默认的函数还是调用
CEdit::OnMouseMove(nFlags, point);
// 调用Timer,来跟踪Hover事件
if( !m_bMouseHover )
{
SetTimer(0x0001, 50, NULL);
m_bMouseHover = TRUE;
Invalidate(TRUE);
}
}
void CFlatEdit::OnTimer(UINT nIDEvent)
{
if( m_bMouseHover )
{
POINT myPos;
GetCursorPos(&myPos);
RECT rtRect;
GetWindowRect(&rtRect);
if( !PtInRect(&rtRect, myPos) )
{
KillTimer(0x0001);
m_bMouseHover = FALSE;
Invalidate(TRUE);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -