66上位机VC MFC列表框任意设置背景图片
66上位机VC MFC列表框任意设置背景图片
功能展示 有时我们开发上位机时想要设置列表框的背景图片,美化下程序界面。但VC默认的是不支持列表框背景的设置,我们就得自己动手实现,我们当前例程就实现 了列表框背景图片的任意设置,效果如图; 要点提示 列表框的背景图片设置主要是通过列表框的绘制背景方法实现OnEraseBkgnd(); 在此函数中我们为防止绘制背景时闪烁,定义一个缓冲CDC memDC;先将背景图片加载到此DC中,再进行绘制; 另外我们在CtlColor()函数返回时,得返回透明的画刷还是实现背景图片绘制效果return (HBRUSH)GetStockObject (HOLLOW_BRUSH) ;;
实现功能 1.新建基于对话框的应用程序 2.再创建我们自己的派生类class CBmpList : public CListBox;添加一位图变量作为背景图片的保存public: CBitmap m_bmp;再添加它的设置函数void CBmpList::SetBkBmp(UINTnIDSource) { if(m_bmp.GetSafeHandle() ){ m_bmp.DeleteObject(); } m_bmp.LoadBitmap(nIDSource); Invalidate();} 3.添加OnLButtonDown(), OnVScroll()函数实现鼠标按下和滚动条滚动时的生绘if(m_bmp.GetSafeHandle())Invalidate(); 4.添加CtlColor()及OnEraseBkgnd()实现我们背景图片的绘制 - HBRUSH CBmpList::CtlColor(CDC* pDC, UINT nCtlColor)
- {
- if(m_bmp.GetSafeHandle() )
- {
- pDC->SetBkMode(TRANSPARENT);
- pDC->SetBkColor(RGB(255,0,255));
- return (HBRUSH)GetStockObject (HOLLOW_BRUSH) ;
- }
- return NULL;
- }
复制代码- BOOL CBmpList::OnEraseBkgnd(CDC* pDC)
- {
- if(m_bmp.GetSafeHandle())
- {
- SendMessage( WM_SETREDRAW, FALSE, 0L);
- CRect rc;
- GetClientRect(rc);
- CDC memDC;
- memDC.CreateCompatibleDC(pDC);
- memDC.SelectObject(m_bmp);
- pDC->BitBlt(0,0,rc.Width(),rc.Height(),&memDC,0,0,SRCCOPY);
- SendMessage( WM_SETREDRAW, TRUE, 0L);
- }
- return CListBox::OnEraseBkgnd(pDC);
- }
复制代码5.最后就是我们自己创建的类的使用,在对话框资源中拖拽一列表框,关联我们创建类的变量CBmpList m_List;给这变量初始化些文字上去 CString str; for(inti=0;i<68;i++)//给列表框添加些文字 { str.Format("我是陈工添加的第%d行列表框文字",i);m_List.AddString(str); } 最后就是背景图片的任意设置m_List.SetBkBmp(IDB_BITMAP2);//设置列表框背景
我们来演示下功能实现的整个过程
|