这次来一个简单一点的文本框重绘
实现了背景颜色和文本颜色大小
.h文件
#pragma once
#include "afxwin.h"
class MyEdit :public CEdit{
public:
MyEdit();
~MyEdit();
private:
//背景颜色
COLORREF m_bkColor;
//文字颜色
COLORREF m_txtColor;
//背景刷子
CBrush m_bkBrush;
public:
DECLARE_MESSAGE_MAP()
void SetBkColor(COLORREF color);
afx_msg void OnNcPaint();
afx_msg HBRUSH CtlColor(CDC* /*pDC*/, UINT /*nCtlColor*/);
};
.cpp文件
#include "StdAfx.h"
#include "MyEdit.h"
MyEdit::MyEdit(){
m_bkColor = RGB(0, 0, 0);
m_txtColor = RGB(100, 100, 100);
m_bkBrush.CreateSolidBrush(m_bkColor);
}
MyEdit::~MyEdit()
{
m_bkBrush.DeleteObject();
}
BEGIN_MESSAGE_MAP(MyEdit, CEdit)
ON_WM_NCPAINT()
ON_WM_CTLCOLOR_REFLECT()
END_MESSAGE_MAP()
//设置背景色
void MyEdit::SetBkColor(COLORREF color){
m_bkColor = color;
if (m_bkBrush.GetSafeHandle()) m_bkBrush.DeleteObject();
m_bkBrush.CreateSolidBrush(color);
Invalidate(TRUE);
}
//重绘
void MyEdit::OnNcPaint(){
CRect rect, rc;
CDC* pDC;
int nSaveDC;
pDC = GetWindowDC();
GetWindowRect(&rect);
rect -= rect.TopLeft();
rc = rect;
rc.InflateRect(-GetSystemMetrics(SM_CXEDGE), -GetSystemMetrics(SM_CYEDGE));
nSaveDC = pDC->SaveDC();
pDC->ExcludeClipRect(&rc);
pDC->FillSolidRect(&rect, RGB(255, 255, 255));
pDC->RestoreDC(nSaveDC);
pDC->FrameRect(&rect, &CBrush(RGB(150, 150, 150)));
ReleaseDC(pDC);
}
//返回画笔
HBRUSH MyEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{
// TODO: 在此更改 DC 的任何特性
pDC->SetTextColor(m_txtColor);
pDC->SetBkColor(m_bkColor);
// TODO: 如果不应调用父级的处理程序,则返回非 null 画笔
return m_bkBrush;
}
调用 在Dlg.h中先声明一个MyEdit myEdit;变量
再在Dlg.cpp中创建
//编辑框重绘
myEdit.Create(WS_VISIBLE | ES_READONLY | ES_AUTOVSCROLL | ES_MULTILINE | ES_WANTRETURN | WS_CLIPCHILDREN | WS_EX_COMPOSITED,CRect(100, 600, 800, 1000), this, IDC_MYEDIT);
函数细节可以看微软MFC微软学习
编辑框内容不多,可以摸索一下