Chinaunix首页 | 论坛 | 博客
  • 博客访问: 987902
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

2012年(158)

我的朋友

分类: C/C++

2012-11-23 16:59:44

测试环境:英文 xp pro,VC2005
重现过程:
a. 新建一个基于dialog的工程
b. 在对话框上放置一个TreeView,设其ID为IDC_TREE
c. 在OnInitDialog中加入如下代码:
    // 得到IDC_TREE句柄
    HWND hTreeView = ::GetDlgItem(m_hWnd, IDC_TREE);
    // 得到其style
    LONG lStyle = ::GetWindowLong(hTreeView, GWL_STYLE);
    // style加上LVS_SHAREIMAGELISTS。注:LVS_SHAREIMAGELISTS是为了共享ImageList,即TreeView销毁时不自动销毁ImageList
    ::SetWindowLong( hTreeView, GWL_STYLE, lStyle|LVS_SHAREIMAGELISTS );
    // 设置ImageList,设不设置不影响本bug
    //{
    //    SHFILEINFO ssfi;
    //    HIMAGELIST hSystemImageList = (HIMAGELIST)SHGetFileInfo( (LPCTSTR)_T("c:\\"), 0, &ssfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX|SHGFI_SMALLICON );
    //    TreeView_SetImageList( hTreeView, hSystemImageList, LVSIL_NORMAL );
    //}
    // 加一个树节点,名 -.h
    TVINSERTSTRUCT InsertItem;
    InsertItem.hParent      = TVI_ROOT;
    InsertItem.hInsertAfter = TVI_LAST;
    InsertItem.item.mask    = TVIF_TEXT;
    InsertItem.item.pszText = _T("-.h");
    HTREEITEM hTreeItemRoot = TreeView_InsertItem( hTreeView, &InsertItem );
    // 加一个树节点,名 (x)y
    InsertItem.hParent      = hTreeItemRoot;
    InsertItem.item.pszText = _T("(x)y");
    HTREEITEM hChild = TreeView_InsertItem( hTreeView, &InsertItem );
    // 展开根节点
    TreeView_Expand( hTreeView, hTreeItemRoot, TVE_EXPAND );
d. 运行时现象
    "-.h" 显示为 "h.-"
    "(x)y" 显示为 "x)y)"
e. 如果不设置LVS_SHAREIMAGELISTS则一切正常

正如pcasa所言
我把LV(listview)和TV(treeview)弄混淆了。
ListView默认将销毁ImageList,使用LVS_SHAREIMAGELISTS则可以设置为不自动销毁
TreeView从不自动销毁ImageList
ListView才有的LVS_SHAREIMAGELISTS 和 TreeView的TVS_RTLREADING 值一样。
阅读(1324) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

网友评论2012-11-23 17:00:16

pcasa
LVS_xxx   ListViewStyle
TVS_xxx  TreeViewStyle
#define TVS_RTLREADING          0x0040
#define LVS_SHAREIMAGELISTS     0x0040
LVS_SHAREIMAGELISTS == TVS_RTLREADING