自绘编辑框CEdit(继承CEdit方式)

对于自定义控件, 我们可以这样理解: 我们要处理控件的行为和显示. 我这里的需求只需要自定义编辑框的显示即可, 行为则使用默认即可. 通过重载CEdit就可以实现.

1. 主要实现内容

显示主要有: 边框, 背景, 文字颜色, 禁用态的各种颜色.

2. 边框

边框可以通过重载OnNCPaint实现. 
例如:
void CMyEdit::OnNcpaint()
{
	CRect rect, rc;
	CDC* pDC;
	int  nSaveDC;


	pDC = GetWindowDC();
	GetWindowRect(&rect);
	rect -= rect.TopLoeft();


	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(150,150,150));
	ReleaseDC(pDC);
}

3. 背景

背景可以通过重载OnEraseBkgnd实现
BOOL CMyEdit::OnEraseBkgnd(CDC* pDC)
{
	// TODO: Add your message handler code here and/or call default
	return 0;		
	return CEdit::OnEraseBkgnd(pDC);
}

你也可以贴图:
BOOL CMyEdit::OnEraseBkgnd(CDC* pDC)
{
     //TODO: 在此添加消息处理程序代码和/或调用默认值
    CDC memDC;
    memDC.CreateCompatibleDC(pDC);
    memDC.SelectObject(&m_Bitmap);
    BITMAP m_Bmp;
    m_Bitmap.GetBitmap(&m_Bmp);
    CRect rect;
    GetClientRect(&rect);
	//拉伸贴图
    pDC->StretchBlt(0,0,rect.Width() ,rect.Height(),&memDC,0,0,m_Bmp.bmWidth,m_Bmp.bmHeight,SRCCOPY);
    memDC.DeleteDC();
    return TRUE;
    //return CEdit::OnEraseBkgnd(pDC);
}

4. 字体颜色

HBRUSH CMyEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{	
	pDC->SetBkMode(TRANSPARENT);					// 透明	
	pDC->SetTextColor(RGB(255, 255, 255));			// 字体色彩	
	return (HBRUSH)GetStockObject(DKGRAY_BRUSH);	// 字体背景(OnEraseBkgnd只是避免闪烁)
}

5. 小结

通过重载这几个函数, 就实现了编辑框显示的自绘.
http://bbs.csdn.net/topics/340257075
http://bbs.csdn.net/topics/190119634
http://blog.csdn.net/xianglitian/article/details/1728920

你可能感兴趣的:(VC,UI,VC,控件)