当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 如何在EDITBOX控件中使用背景位图

VC++
VC++ 的常用编程技巧
VC++编译环境详解
Visual C++制作一个Sniffer实例
vc.net中实现启动画面来个淡入淡出效果
VC++中进程间相互通信的十一种方法
深入了解VC++编译器
VC++删除浮动工具条中“关闭”按钮
VISUAL C++中的OCX控件的使用方法
VC++:用VC++实现上网拨号功能
VC++:基于VC++中ATL创建ActiveX控件的探讨
VC++删除浮动工具条中“关闭”按钮
VC++:VC++中的面向对象和Windows编程
VC++:Vc++中线程的同步
VC++:更新命令用户接口(UI)消息
VC++:CDatabase类的那些事
VC++:小编谈VC++中 CDatabase类的那些事
VC++:小编泛谈MFC的ODBC类
VC++:小编分享线程的创建和终止
在VC资源文件中加入声音资源
C++的static关键字

VC++ 中的 如何在EDITBOX控件中使用背景位图


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 87 ::
收藏到网摘: n/a

如何在EDITBOX控件中使用背景位图
作者: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)代码。
基本上这个类的功能就这样实现了。
如果有兴趣和我一起探讨这个问题,可以发信到[email protected]