MFC类继承实现CEdit自绘文字颜色,边框,背景色

⌚Time: 2023-05-15 11:32:01

👨‍💻Author: Jack Ge

效果

新建一个继承于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个标识符,通过设置不同的标识符就可以获取系统分辨率、窗体显示区域的宽度和高度、滚动条的宽度和高度。




int WINAPI GetSystemMetrics( __in intnIndex);

参数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();

}


在主窗体头文件中包含自定义类头文件,建立一个变量




#include "MyEdit.h"

...

protected:

    HICON m_hIcon;

    CMyEdit m_myEdit;

在DoDataExchange函数中实现自定义类与控件资源的关联


void CtDlg::DoDataExchange(CDataExchange* pDX)

{

    CDialog::DoDataExchange(pDX);



    DDX_Control(pDX, IDC_EDIT1, m_myEdit);

}