樹控制是一個不支持自繪的控件。這就為顯示背景圖像增加了一定的難度。但無論如何,它是能夠做到的,我們將討論如何做。一個基本的方法是將樹控制繪制在一個內存設備上,並透明的覆蓋在背景圖像上,那麼其結果將是背景圖像顯示在控件服務區。當然,這些相關資料較少。
樹控制使用背景位圖,一個好的用途是顯示公司商標。還有我們必須保證使用的位圖不能影響我們的閱讀。
首先我們要求圖像已被作為資源加入工程,我們可以使用256色的位圖(16色的應當也被支持)。如果加入的圖像小於控件的面積,圖像將平鋪在控件服務區。
步驟1: 加入位圖到資源
使用導入功能加入位圖到資源編輯器。
步驟2: 加入變量
protected:
CPalette m_pal;
CBitmap m_bitmap;
int m_cxBitmap, m_cyBitmap;
步驟3: 加入設置背景圖像的成員函數
我們加入了兩個重載函數去設置背景圖像,這兩個函數應當是公共函數,第一函數參數為資源ID,第二個函數參數為資源名。
這些函數能夠被調用來改變一個已經被指定的位圖。首先它們將刪除GDI對象上已有的位圖與調色板。然後它們加載位圖,並將它們附加到CBitmap對象上。我們調用了全局函數::LoadImage()而沒有調用CBitmap::LoadBitmap()。這樣做的原因是我們需要訪問位圖的DIBSECTION,為什麼要訪問位圖的DIBSECTION,這是因為我產需要創建一個與位圖顏色相配的邏輯調色板。如果你沒有設置和使用這個邏輯調色板,那麼圖象看上去將非常DULL。同時為了將來使用我們也保存了位圖的尺寸。
如果位圖是256色的或更少,我們將創建調色板。我們分配足夠的空間保存位圖顏色表並調用 ::GetDIBColorTable()函數從位圖中獲得它。我們分配的足夠的內存去創建調色板並從位圖顏色表中獲得顏色調色板信息。調色板的版本應當是0x300。
BOOL CTreeCtrlX::SetBkImage(UINT nIDResource)
{
return SetBkImage( (LPCTSTR)nIDResource );
}
BOOL CTreeCtrlX::SetBkImage(LPCTSTR lpszResourceName)
{
// If this is not the first call then Delete GDI objects
if( m_bitmap.m_hObject != NULL )
m_bitmap.DeleteObject();
if( m_pal.m_hObject != NULL )
m_pal.DeleteObject();
HBITMAP hBmp = (HBITMAP)::LoadImage( AfxGetInstanceHandle(),
lpszResourceName, IMAGE_BITMAP, 0,0, LR_CREATEDIBSECTION );
if( hBmp == NULL )
return FALSE;
m_bitmap.Attach( hBmp );
BITMAP bm;