MFC:从ChildView访问CMainFrame的CImageList

MFC : accessing CMainFrame's CImageList from ChildView

本文关键字:CMainFrame CImageList 访问 ChildView MFC      更新时间:2023-10-16

我正在尝试将图像添加到工具栏的imagelist,这是CMainFrame的成员

startStopPicture.LoadBitmapW(IDB_STOP_PIC);
m_ToolBar.GetToolBarCtrl().GetImageList()->Add(&startStopPicture, reinterpret_cast<CBitmap*>(NULL)); 
startStopPicture.DeleteObject();
startStopPicture.LoadBitmapW(IDB_START_PIC);
m_ToolBar.GetToolBarCtrl().GetImageList()->Add(&startStopPicture, reinterpret_cast<CBitmap*>(NULL)); 

那么我需要从childview访问这个imagelist。我试着这样做

CMainFrame* mainFrame = dynamic_cast<CMainFrame*>(GetParentFrame());
CImageList* imList = mainFrame->m_ToolBar.GetToolBarCtrl().GetImageList();

但是我在主机的方法中添加的那些图像现在没有了。如何解决这个问题?

我假设您的CBitmap startStopPicture是一个局部变量,因为您既没有提到其他内容,也没有在变量名之前使用任何类标识符。之后,您尝试通过CImageList::Add 通过引用存储本地变量。

你要做的是要么分配CBitmap - new CBitmap,要么将startStopPicture变量作为成员添加到你的类中。

如果您选择分配变量并且不必跟踪CBitmap,则可以使用std::vector<std::unique_ptr<CBitmap> >作为类成员。

如果在CImageList中存储一个局部变量CBitmap,图像将不显示

的例子:

//class declaration
private:
    std::vector<std::unique_ptr<CBitmap> > m_vLoadedBitmaps;
};
void CMyCtrl::SetBitmaps(CImageList &imgList)
{
    CBitmap *bmpDelete = new CBitmap();
    bmpDelete->LoadBitmapW(IDB_DELETE);
    m_vLoadedBitmaps.push_back(std::unique_ptr<CBitmap>(bmpDelete));
    imgList.Add(bmpDelete, static_cast<CBitmap*>(NULL));
}

我还建议在变量的所有者类中加载图像。如果需要,还有SendMessage