积累系统性知识
积聚技术精华
  首页    个人中心    撰写积文    建立课题    订立目标    整理积文    管理课题    管理目标    技能Get    代码积累 
图片背景编辑框的实现
error997 (error997)    2014-11-20 21:09:50      目标    课题
   作者:zhoudb
   在VC中,标准的WINDOWS控件如TREEVIEW,EDITBOX,COMBOBOX和LISTBOX等控件都不支持选择背景位图的属性,所以如果要使这些标准控件达到这种效果,必须有些非常规的方法。本文介绍一个CEDIT类如何实现背景位图,并且可以更换背景的例子。可能实现的方法还有其它种,如果有兴趣可以大家探讨。


本文程序运行效果图

下面介绍CMYEDITCTRL类几个关键变量和函数。

 第一步在该类中增加几个变量;
切换到: 纯代码  
   
   public:
	CBitmap m_bmp;
protected:

   CBrush m_brHollow;
切换到: 纯代码  
   
	CBitmap *m_pbmCurrent;

   第二步 重载部分函数:
切换到: 纯代码  
   
   afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnChange();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);

   各个函数的具体作用:

切换到: 纯代码  
   
2.1 OnChange();

如果没有这个函数,你敲几个字符如 ABCDEDFG,然后删除两个FG,但是EDITBOX并未更新。添加这个函数主要是这个原因。
切换到: 纯代码  
   
   void CMyEditCtrl::OnChange() 
{
	Invalidate(); ///强制进行更新
}
   2.2 OnLButtonUp();

也类似,是你鼠标选择时候的刷新问题,如果你有兴趣,可以先把它注释掉,看看BUG是怎么出现的。
切换到: 纯代码  
   
   void CMyEditCtrl::OnLButtonUp(UINT nFlags, CPoint point) 
{
	Invalidate(); ///强制进行更新
	CEdit::OnLButtonUp(nFlags, point);
}
   2.3 CtlColor(CDC* pDC, UINT nCtlColor)

一般的文字的默认背底是白色的,这儿选择了透明的形式,所以底图可以显示。
切换到: 纯代码  
   
   HBRUSH CMyEditCtrl::CtlColor(CDC* pDC, UINT nCtlColor) 
{
	pDC->SetBkMode(TRANSPARENT); ///选择透明背景模式
	pDC->SetTextColor(RGB(0xff,0xff,0xff)); ///设置文字颜色为白色
	return m_brHollow;
}
   2.4 OnEraseBkgnd(CDC* pDC)

主要把选好的背景位图显示出来。
切换到: 纯代码  
   
   BOOL CMyEditCtrl::OnEraseBkgnd(CDC* pDC) 
{
	BITMAP bm;
	m_bmp.GetBitmap(&bm);
	m_pbmCurrent = &m_bmp;
	CDC dcMem;
	dcMem.CreateCompatibleDC(pDC);
	CBitmap* pOldBitmap = dcMem.SelectObject(m_pbmCurrent);  ///选择位图
	pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&dcMem,0,0,SRCCOPY);  ///画出位图
	dcMem.SelectObject(pOldBitmap);
    return TRUE; 
}

   说明:其中代码有些部分简化了,有些部分还可以优化。对于底图的选择,在这里我选择是与我EDITBOX一样大小的底图,如果两者不一样大小,需要修改部分OnEraseBkgnd(CDC* pDC)代码。
基本上这个类的功能就这样实现了。

转自 http://blog.csdn.net/y___y/article/details/1162161
(+0)技能Get

建议楼主:搜索关键字 |参考其他资源 |回复 |追问
  error997(error997):   个人中心    课题    目标    代码积累