当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 如何在ListBox中选择背景位图

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 如何在ListBox中选择背景位图


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

如何在ListBox中选择背景位图
作者:zhoudb

下载本文源代码

本文介绍如何在ListBox中添加更换背景位图,并提供源代码供参考。本文源代码运行效果图如下:


一、基本原理

构造一个LISTBOX的子类CMYLISTBOX,在刷新背底的时候,选择背景位图。此时需要设置背景模式为透明,当你在其上写入文字的时候,文字背底就不会变白色,而是背景色;刷子也必须是空的,这样每次刷新的后,背景就不会改变。
其中特别需要注意的是,当你的LISTBOX出现了滚动条的时候需要重新设置背底位图的尺寸的大小,减去相应的滚动条区域,否则,底图会把滚动条覆盖。

二、实现代码

下面把CMYLISTBOX类几个重载函数再说明一下:
//当你选择的ITEM变化时刷新;

void CMyListBox::OnSelchange() {	iSelectChange = TRUE;}void CMyListBox::OnLButtonDown(UINT nFlags, CPoint point) {	if(iSelectChange)	{	iSelectChange= FALSE;	Invalidate();	}	CListBox::OnLButtonDown(nFlags, point);}
//设置画刷,背景模式,文字颜色
HBRUSH CMyListBox::CtlColor(CDC* pDC, UINT nCtlColor) {	pDC->SetBkMode(TRANSPARENT); //设置背景模式透明	pDC->SetTextColor(RGB(64,32,0));//设置文字颜色;	return m_brHollow;	//设置空心画刷;}
//在垂直滚动时刷新;
void CMyListBox::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) {	Invalidate();	CListBox::OnVScroll(nSBCode, nPos, pScrollBar);}
//在水平滚动时刷新;
void CMyListBox::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) {	Invalidate();	CListBox::OnHScroll(nSBCode, nPos, pScrollBar);}
//将背景位图画出来;
BOOL CMyListBox::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 CListBox::OnEraseBkgnd(pDC);}
对于背景位图的大小,我们事先先判断一下区域大小;
m_listbox.GetClientRect(LPRECT);
然后判断如果需要更改背景位图大小的话,可以调用HBITMAP CMylistboxDlg::GetSizeBITMAP(HBITMAP hBitmap, int w, int h)函数,这个函数可以根据把你的HBITMAP减切至适当大小(w,h)。具体一些其它函数就不一一介绍。
说明,可能有人通过对LISTBOX的DRAWITEM函数进行重载,实现的方法与此方法原理不同,每个ITEM都是画出来的,不是作为一个整体,所以其在刷新的时候可能会慢一点,但或许程序界面的抖动会少些。
代码我已经整理了一遍,可能还可以部分优化,如果有兴趣可以发信至[email protected]一起探讨。