在一个MFC扩展DLL中导出一个三态选择树类CTreeCtrlEx,派生于CTreeCtrl。我在CTreeCtrlEx的PreSubClass函数中写了如下代码:
void CCheckedTreeCtrl::PreSubclassWindow() 
{
CTreeCtrl::PreSubclassWindow(); HINSTANCE hInstOld = AfxGetResourceHandle();
AfxSetResourceHandle(xhlctrlsDLL.hResource);
m_imgState.Create(IDB_BITMAP_CHECKBOX,13, 1, RGB(255,255,255));
m_imgList.Create(IDB_BITMAP_FOLDER,16, 1, RGB(255,255,255));
AfxSetResourceHandle(hInstOld); // restore the old resource chain
SetImageList(&m_imgState,TVSIL_STATE);
SetImageList(&m_imgList,TVSIL_NORMAL);
}但是这样总是使得树的state icon和item icon显示不正确。
如果改成以下这样就可以:
void CCheckedTreeCtrl::PreSubclassWindow() 
{
CTreeCtrl::PreSubclassWindow(); HINSTANCE hInstOld = AfxGetResourceHandle();
AfxSetResourceHandle(xhlctrlsDLL.hResource);
m_imgState.Create(IDB_BITMAP_CHECKBOX,13, 1, RGB(255,255,255));
m_imgList.Create(IDB_BITMAP_FOLDER,16, 1, RGB(255,255,255));
AfxSetResourceHandle(hInstOld); // restore the old resource chain
SetImageList(&m_imgState,TVSIL_STATE);
SetImageList(&m_imgList,TVSIL_NORMAL);
SetImageList(&m_imgState,TVSIL_STATE); // 不调两遍就没有效果,不知道是为什么。
SetImageList(&m_imgList,TVSIL_NORMAL);
}不知道是什么原因?
xhlctrlsDLL是正确的。在DLLMAIN中有如下语句:
if (!AfxInitExtensionModule(xhlctrlsDLL, hInstance))
return 0;DLL与EXE均动态使用MFC,均为release编译,都对_UNICODE,UNICODE进行了预定义再编译的。