一个DLL中有一个对话框窗口类为DLLDlg,是在DLL中加入一个对话框资源后通过CLASSWIZZARD生成的,功能是做个资源管理器样的窗口。
该对话框为了被调用显示,有成员函数:
int DLLDlg::RemoteFileMng(char *ip, UINT uiPort)
{
m_Ip = ip;
m_UiPort = uiPort;
DoModal();
return m_netFuncRet;
}为了避免“资源切换”的问题,做了一个导出类:
class AFX_EXT_CLASS UIShell : public CObject
{
public:
int RemoteFileMng(char* ip,UINT uiPort);
UIShell();
virtual ~UIShell();};int UIShell::RemoteFileMng(char* ip,UINT uiPort)
{
DLLDlg dlg;
return dlg.RemoteFileMng(ip,uiPort);}DLL导出的函数为:
int RemoteFileMng(char* ip,UINT uiPort)
{
UIShell shell;
return shell.RemoteFileMng(ip,uiPort);
}
也就是通过一层导出类的封装,通过DLL导出函数RemoteFileMng就可以打开对话框。而对话框的初始化如BOOL DLLDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SHFILEINFO sfi;
hImageList = (HIMAGELIST)SHGetFileInfo("",
0,
&sfi,
sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
//m_ListLeft.SendMessage( LVM_SETIMAGELIST, (WPARAM)LVSIL_SMALL, (LPARAM)hImageList);
//m_ListRight.SendMessage( LVM_SETIMAGELIST, (WPARAM)LVSIL_SMALL, (LPARAM)hImageList);
pCImgList = new CImageList;
pCImgList = CImageList::FromHandle(hImageList);
m_ListLeft.SetImageList(pCImgList,LVSIL_SMALL);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}/**********************************************************/
代码如上,为什么对话框第1次被某界面程序打开能成功出现图标,而后再打开就不行了,一定要重新运行界面程序重新再次打开对话框才行。
该对话框为了被调用显示,有成员函数:
int DLLDlg::RemoteFileMng(char *ip, UINT uiPort)
{
m_Ip = ip;
m_UiPort = uiPort;
DoModal();
return m_netFuncRet;
}为了避免“资源切换”的问题,做了一个导出类:
class AFX_EXT_CLASS UIShell : public CObject
{
public:
int RemoteFileMng(char* ip,UINT uiPort);
UIShell();
virtual ~UIShell();};int UIShell::RemoteFileMng(char* ip,UINT uiPort)
{
DLLDlg dlg;
return dlg.RemoteFileMng(ip,uiPort);}DLL导出的函数为:
int RemoteFileMng(char* ip,UINT uiPort)
{
UIShell shell;
return shell.RemoteFileMng(ip,uiPort);
}
也就是通过一层导出类的封装,通过DLL导出函数RemoteFileMng就可以打开对话框。而对话框的初始化如BOOL DLLDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SHFILEINFO sfi;
hImageList = (HIMAGELIST)SHGetFileInfo("",
0,
&sfi,
sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
//m_ListLeft.SendMessage( LVM_SETIMAGELIST, (WPARAM)LVSIL_SMALL, (LPARAM)hImageList);
//m_ListRight.SendMessage( LVM_SETIMAGELIST, (WPARAM)LVSIL_SMALL, (LPARAM)hImageList);
pCImgList = new CImageList;
pCImgList = CImageList::FromHandle(hImageList);
m_ListLeft.SetImageList(pCImgList,LVSIL_SMALL);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}/**********************************************************/
代码如上,为什么对话框第1次被某界面程序打开能成功出现图标,而后再打开就不行了,一定要重新运行界面程序重新再次打开对话框才行。
m_ListLeft.DeleteAllItems ();
ASSERT(pCImgList);
m_ListLeft.SetImageList(pCImgList,LVSIL_SMALL);
DLLDlg dlg;
dlg.RemoteFileMng(ip,uiPort);
return dlg.RemoteFileMng(ip,uiPort);
在一个对话框对象生存周期内连续两次DoModal();第二次也是没有图标。
pCImgList.DeleteImageList();
用VC6做一个MFC对话框EXE,其主对话框上只保留按钮BBB。
给工程添加对话框资源,上面放一个LISTCTRL控件然后用CLASSWIZARD给对话框生成类DDD,给LISTCTRL控件帮定变量m_list。
DDD类添加成员变量HIMAGELIST hImageList,在DDD的OnInitDialog里,用SHGetFileInfo给hImageList获取系统图标,然后给m_list加入图标。
BBB按钮响应里,用DDD类生成对象ddd,dddDoModal。只有第1次DoModal才有图标,第2次以后都没有了,不知道为什么。
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_list.InsertColumn(0,"Name",LVCFMT_LEFT,60);
m_list.InsertColumn(1,"Size",0,60);
m_list.InsertColumn(2,"Date",0,80);
SHFILEINFO sfi;
hImageList = (HIMAGELIST)SHGetFileInfo("",
0,
&sfi,
sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
m_list.SendMessage(LVM_SETIMAGELIST, (WPARAM)LVSIL_SMALL, (LPARAM)hImageList);
m_list.InsertItem(0,"hello",3);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
“终于明白了,原来
m_hImageList = (HIMAGELIST)SHGetFileInfo( "C:\\ ",0,&m_shFi,sizeof(m_shFi),
SHGFI_SYSICONINDEX|SHGFI_SMALLICON);
在一个进程里面不能调用多次,否则后面的调用会无效。 改进办法是:把dialog的成员变量m_hImageList变为静态变量,然后在进程开始的时候就调用一次就可以了,后面无论有多少个dialog的实例产生,都只使用静态变量m_hImageList的内容。”
我也做成静态变量,却仍然解决不了。
详细流程:
用VC6做一个MFC对话框EXE,其主对话框上只保留按钮BBB。
给工程添加对话框资源,上面放一个LISTCTRL控件然后用CLASSWIZARD给对话框生成类DDD,给LISTCTRL控件帮定变量m_list。
DDD类添加成员变量HIMAGELIST hImageList,在DDD的OnInitDialog里,用SHGetFileInfo给hImageList获取系统图标,然后给m_list加入图标。
BBB按钮响应里,用DDD类生成对象ddd,dddDoModal。只有第1次DoModal才有图标,第2次以后都没有了,不知道为什么。
有没有给力直接的答案。
问题解决了,不过有个新问题:
我仍然使用的是hImagelist来给LISTCTRL设置图标,pCImgList的出现也只是在初试和结束对话框各调用了一次Attach(hImagelist)和Detach(),为什么第2次对话框就正常了?因为毕竟设置的是hImagelist而不是pCImgList啊?