CEdit 自绘
实现编辑框输入检查不能含有某些字符
检查语法使用了boost库注意添加头文件#include <boost/regex.hpp>
为了实现代码重用,将编辑控件与一个自己派生的CMyEdit关联
使用反射消息 实现控件自处理
对CmyEdit添加 CtlColor和EnChange 消息处理
消息映射为:
BEGIN_MESSAGE_MAP(CCheckEdit, CEdit)
ON_WM_CTLCOLOR_REFLECT()
ON_CONTROL_REFLECT(EN_CHANGE, &CCheckEdit::OnEnChange)
END_MESSAGE_MAP()
/*以下实现改变控件颜色设置*/
HBRUSH CCheckEdit::CtlColor(CDC* pDC, UINT /*nCtlColor*/)
{
// TODO: Change any attributes of the DC here
if(m_ErrorEditState)
{
pDC->SetTextColor( RGB(255,0,0) );//设置控件中文本颜色
}
else
{
pDC->SetTextColor( RGB(0,0,0) );
}
// TODO: Return a non-NULL brush if the parent's handler should not be called
//return false;
return (HBRUSH)m_BkBrush.GetSafeHandle();//返回一个自己的背景画刷 否则上面的设置不其作用
}
void CCheckEdit::OnEnChange()
{
/*
//隐掉部分是为编辑框画个红色边框标识有错误 //此部分也可在OnNCPaint中处理
CRect rectEdit, rectInser;
GetWindowRect(rectEdit);
ScreenToClient(rectEdit);
rectEdit.OffsetRect(2,2);
rectInser.SetRect(rectEdit.left+1, rectEdit.top+1, rectEdit.right-1, rectEdit.bottom-1);
CBrush brushOuter, brushInser;
brushOuter.CreateSolidBrush(RGB(255,0,0));
brushInser.CreateSolidBrush(RGB(0,0,255));
CDC* pDC = GetWindowDC();
pDC->FrameRect(rectEdit,&brushOuter); //画红色外框
pDC->FrameRect(rectInser,&brushInser);//画蓝色内框
ReleaseDC(pDC);
*/
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CEdit::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
CString m_strProjectName;
GetWindowText(m_strProjectName);
if(m_strProjectName.IsEmpty() != -1)
{
//正则表达式".{0,}([:?*<>\/\"| ]|[:?*<>\/\"| ].{0,})"
//标识不能含有 .{0,}([:?*<>\/\"| ]|[:?*<>\/\"| ].{0,})
const wstring REGEX = L;".{0,}([:?*<>\/\"| ]|[:?*<>\/\"| ].{0,})"
boost::wsmatch match;
const boost::wregex reg(REGEX);
wstring wstr = m_strProjectName.GetString();
bool match_status = boost::regex_match(wstr, match, reg);
/*
//在对话框中直接处理可以使用此方法获得控件矩形
CEdit* m_pEdit = (CEdit*)GetDlgItem(IDC_EDIT_PROJECT_NAME);
CRect rect;
m_pEdit->GetWindowRect(&rect);
*/
CRect rect;
GetWindowRect(rect);
ScreenToClient(rect);
if (match_status)
{
m_ErrorEditState = true;
}
else
{
m_ErrorEditState = false;
}
InvalidateRect( &rect );//此处立即重绘控件 将调用CtlColor
}
// TODO: Add your control notification handler code here
}