树控制是一个不支持自绘的控件。这就为显示背景图像增加了一定的难度。但无论如何,它是能够做到的,我们将讨论如何做。一个基本的方法是将树控制绘制在一个内存设备上,并透明的覆盖在背景图像上,那么其结果将是背景图像显示在控件服务区。当然,这些相关资料较少。
树控制使用背景位图,一个好的用途是显示公司商标。还有我们必须保证使用的位图不能影响我们的阅读。
首先我们要求图像已被作为资源加入工程,我们可以使用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;
-
<script type="text/java script">BAIDU_CLB_fillSlot("771048");
-
点击复制链接 与好友分享!
回本站首页
<script>
function copyToClipBoard(){
var clipBoardContent=document.title + '\r\n' + document.location;
clipBoardContent+='\r\n';
window.clipboardData.setData("Text",clipBoardContent);
alert("恭喜您!复制成功");
}
<script type="text/java script" id="bdshare_js" data="type=tools&uid=12732">
<script type="text/java script" id="bdshell_js">
<script type="text/java script">
var bds_config = {'snsKey':{'tsina':'2386826374','tqq':'5e544a8fdea646c5a5f3967871346eb8'}};
document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js cdnversion=" + Math.ceil(new Date()/3600000)