CEdit用了一个垂直居中的类后,如何边框没法改变
CEdit用了一个垂直居中的类后,怎么边框没法改变?
最终效果要垂直左右都居中,失去和获得焦点改变边框及背景颜色。贴代码:
最终效果要垂直左右都居中,失去和获得焦点改变边框及背景颜色。贴代码:
// MyEdit.cpp : 实现文件
//
#include "stdafx.h"
#include "MyEdit.h"
// CMyEdit
IMPLEMENT_DYNAMIC(CMyEdit, CEdit)
CMyEdit::CMyEdit()
{
m_BkColor = RGB(220,229,240);
m_TxtColor = RGB(7,83,181);
m_BkBrush.CreateSolidBrush(m_BkColor);
m_BkBrush2.CreateSolidBrush(RGB(255,0,0));
LOGFONT lf; //定义字体结构
lf.lfWeight=10; //字体磅数=10
lf.lfHeight=40; //字体高度56
lf.lfWidth=15; //字体宽度20
lf.lfUnderline=FALSE; //无下划线
lf.lfStrikeOut=FALSE; //无删除线
lf.lfItalic=FALSE; //非斜体
lf.lfEscapement=0;
lf.lfCharSet=DEFAULT_CHARSET; //使用缺省字符集
_tcscpy_s(lf.lfFaceName,_T("宋体")); //字体名=@system
// CFont myFont; //定义字体对象
m_font.CreateFontIndirect(&lf); //创建逻辑字体
//CEdit::SetFont(&m_font);
}
CMyEdit::~CMyEdit()
{
m_BkBrush.DeleteObject();
}
BEGIN_MESSAGE_MAP(CMyEdit, CEdit)
ON_WM_CTLCOLOR_REFLECT()
ON_CONTROL_REFLECT(EN_CHANGE, &CMyEdit::OnEnChange)
ON_WM_NCCALCSIZE()
ON_WM_NCPAINT()
ON_WM_SETFOCUS()
END_MESSAGE_MAP()
void CMyEdit::SetTextFont()
{
CEdit::SetFont(&m_font);
Invalidate(TRUE);
}
void CMyEdit::SetBkColor(COLORREF clr)
{
m_BkColor = clr;
}
void CMyEdit::SetTxtColor(COLORREF clr)
{
m_TxtColor = clr;
}
HBRUSH CMyEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{
pDC ->SetBkMode(TRANSPARENT);
pDC ->SetTextColor(m_TxtColor);
m_BkBrush.Detach();
m_BkBrush.CreateSolidBrush(m_BkColor);
CRect rect;
GetClientRect(rect);
rect.InflateRect(1,3,3,1);
pDC ->FrameRect(rect,&m_BkBrush2);
if(m_rectNCTop.IsRectEmpty())
{
SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOMOVE | SWP_FRAMECHANGED);
}
return (HBRUSH)m_BkBrush.GetSafeHandle();
}
void CMyEdit::OnEnChange()
{
Invalidate();
}
void CMyEdit::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp)
{
CRect rectWnd, rectClient;
//calculate client area height needed for a font
CFont *pFont = GetFont();
CRect rectText;
rectText.SetRectEmpty();
CDC *pDC = GetDC();
CFont *pOld = pDC->SelectObject(pFont);
pDC->DrawText(_T("Ky"), rectText, DT_CALCRECT | DT_LEFT);
UINT uiVClientHeight = rectText.Height();
pDC->SelectObject(pOld);
ReleaseDC(pDC);
//calculate NC area to center text.
GetClientRect(rectClient);
GetWindowRect(rectWnd);
ClientToScreen(rectClient);
UINT uiCenterOffset = (rectClient.Height() - uiVClientHeight) / 2;
UINT uiCY = (rectWnd.Height() - rectClient.Height()) / 2;
UINT uiCX = (rectWnd.Width() - rectClient.Width()) / 2;
rectWnd.OffsetRect(-rectWnd.left, -rectWnd.top);
m_rectNCTop = rectWnd;
m_rectNCTop.DeflateRect(uiCX, uiCY, uiCX, uiCenterOffset + uiVClientHeight + uiCY);
m_rectNCBottom = rectWnd;
m_rectNCBottom.DeflateRect(uiCX, uiCenterOffset + uiVClientHeight + uiCY, uiCX, uiCY);
lpncsp->rgrc[0].top +=uiCenterOffset ;
lpncsp->rgrc[0].bottom -= uiCenterOffset;
lpncsp->rgrc[0].left +=uiCX;
lpncsp->rgrc[0].right -= uiCY;
}
void CMyEdit::OnNcPaint()
{
Default();
CWindowDC dc(this);
CBrush Brush(m_BkColor);
dc.FillRect(m_rectNCBottom, &Brush);
dc.FillRect(m_rectNCTop, &Brush);
/*CRect rect;
GetWindowRect(&rect);
rect.DeflateRect(3,3);
dc.FrameRect(rect,&m_BkBrush2);*/
}
void CMyEdit::PreSubclassWindow()
{
ModifyStyle(0,ES_CENTER);
CEdit::PreSubclassWindow();
}
void CMyEdit::OnSetFocus(CWnd* pOldWnd)
{
CEdit::OnSetFocus(pOldWnd);
HDC hDC=::GetWindowDC(m_hWnd);
CRect rc;
::GetWindowRect(m_hWnd,&rc);
rc=CRect(0,0,rc.right-rc.left,rc.bottom-rc.top);