VC实现在ListBox中选择背景位图
VC實現在ListBox中選擇背景位圖
本文介紹如何在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都是畫出來的,不是作為一個整體,所以其在刷新的時候可能會慢一點,但或許程序界面的抖動會少些。
代碼我已經整理了一遍,可能還可以部分優化,如果有興趣可以可以在下面留言探討。
總結
以上是生活随笔為你收集整理的VC实现在ListBox中选择背景位图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第12课:优化神经网络——网络初始化技巧
- 下一篇: 第11课:优化神经网络——梯度优化