效果

新建一个继承于CEdit的类CMyEdit

在他的窗体OnNcPaint函数中实现绘制边框,它所响应的消息是WM_NCPAINT
void CMyEdit::OnNcPaint()
{
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CEdit::OnNcPaint()
//
//执行默认的窗体处理过程
Default();
//获取窗体区域
CDC* pDC = GetWindowDC();
CRect rect;
GetWindowRect(rect);
ScreenToClient(rect);
//区域微调InflateRect
rect.InflateRect(-GetSystemMetrics(SM_CXEDGE),-GetSystemMetrics(SM_CYEDGE),GetSystemMetrics(SM_CXEDGE), GetSystemMetrics(SM_CYEDGE));
//rect.top += 2;
//rect.left += 2;
//rect.bottom+=2;
//rect.right+=2;
//查看区域信息
TRACE("%d %d %d %d",rect.top,rect.left,rect.bottom,rect.right);
//画边框
pDC->Draw3dRect(rect, RGB(222,0, 222), RGB(222,0, 222));
ReleaseDC(pDC);
}
其中Default函数是执行默认的窗体消息处理,他会绘制最原始风格的CEdit控件外观
InflateRect函数调整获取到的CEdit窗体区域,默认获取到的窗体区域绘制后发现在x方向上向左偏移了2,在y方向上向上偏移了2,受到窗体边框的影响
InflateRect在MFC中有4个重载函数
void CRect::InflateRect(int x,int y);
void CRect::InflateRect(SIZE size);
void CRect::InflateRect(LPCRECT lpRect);
void CRect::InflateRect(int l,int t,int r,int b);
参数
x
指定扩大CRect左和右边的单位数。
y
指定扩大CRect上、下边的单位数。
size
一个指定扩大CRect的单位数的SIZE或CSize。cx值指定扩大左、右边的单位数,cy指定扩大上、下边的单位数。
lpRect
指向一个RECT结构或CRect,指定扩大每一边的单位数。
l
指定扩大CRect左边的单位数。
t
指定扩大CRect上边的单位数。
r
指定扩大CRect右边的单位数。
b
指定扩大CRect下边的单位数。
GetSystemMetrics是一个计算机函数,该函数只有一个参数,称之为「索引」,这个索引有75个标识符,通过设置不同的标识符就可以获取系统分辨率、窗体显示区域的宽度和高度、滚动条的宽度和高度。
参数SM_CXEDGE,SM_CYEDGE 以像素值为单位的3D边框的宽度和高度
在CtlColor函数中,设置字体颜色和背景颜色,它响应=WM_CTLCOLOR,而不是WM_CTLCOLOR消息。带有=是从父窗口反射回来的消息
HBRUSH CMyEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{
// TODO: 在此更改 DC 的任何属性
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(0, 255, 0));
// TODO: 如果不应调用父级的处理程序,则返回非空画笔
return CreateSolidBrush(RGB(22,12,222));
}
在OnEnChange函数中,在编辑发生改变时,使窗口失效发生重绘,它响应=EN_CHANCE消息
oid CMyEdit::OnEnChange()
{
// TODO: 如果该控件是 RICHEDIT 控件,则它将不会
// 发送该通知,除非重写 CEdit::OnInitDialog()
// 函数并调用 CRichEditCtrl().SetEventMask(),
// 同时将 ENM_CHANGE 标志“或”运算到掩码中。
// TODO: 在此添加控件通知处理程序代码
Invalidate();
}
在主窗体头文件中包含自定义类头文件,建立一个变量
在DoDataExchange函数中实现自定义类与控件资源的关联