【发布时间】:2016-06-06 09:47:14
【问题描述】:
我目前正在使用基于对话框的 GUI,同时尝试对其进行自定义。我已经绘制了一些位图,我想在 dlg 中用作按钮和徽标。
我写了两个成员函数,一个用于将位图设置为CButtons,一个用于将位图设置为CStatics。实际上两者都在工作,当按下按钮时调用它们。但只有用于设置CButtons 的成员函数在对话框初始化期间正常工作。我的CStatics 不知何故被覆盖了。
这在OnInitDialog() 中调用时有效
void CMyDlg::setBitmapAsButton(std::string file, CButton &Button, int xPos, int yPos)
{
CImage imgFromFile;
CBitmap bitmap;
std::wstring wfile(file.begin(), file.end());
HRESULT ret = imgFromFile.Load(wfile.c_str());
int width = imgFromFile.GetWidth();
int height = imgFromFile.GetHeight();
bitmap.Attach(imgFromFile.Detach());
Button.Create(_T("My button"), WS_CHILD | WS_VISIBLE | BS_BITMAP,
CRect(xPos, yPos, xPos + width, yPos + height), this, 1);
Button.SetBitmap(bitmap);
}
这在OnInitDialog() 中调用时不起作用:
void CVisTrayDlg::setBitmapAsStatic(std::string file, CStatic &Static, int xPos, int yPos)
{
CImage imgFromFile;
CBitmap bitmap;
std::wstring wfile(file.begin(), file.end());
HRESULT ret = imgFromFile.Load(wfile.c_str());
int width = imgFromFile.GetWidth();
int height = imgFromFile.GetHeight();
bitmap.Attach(imgFromFile.Detach());
Static.Create(_T("My Static"), WS_CHILD | WS_VISIBLE | SS_BITMAP,
CRect(xPos, yPos, xPos + width, yPos + height), this);
Static.SetBitmap(bitmap);
}
CButton 和 CStatic 控件被声明为 CMyDlg 的成员。
关于如何避免这种行为的任何想法?或者有没有更好的方法在对话框中放置位图? (我尝试了CImage::BitBlt(),它也以某种方式被覆盖了。)
【问题讨论】:
-
我相信
CBitmap需要在函数返回后存在。尝试将其设为成员变量(或使用static关键字在此函数中快速获得结果)。 -
@Ajay 是的,你是对的。将 CBitmaps 声明为成员变量是可行的。奇怪...对于 CStatic 控件,它是必需的,但对于 CButton 控件则不是。非常感谢!
-
@Ajay 我修改了你建议的代码,女巫工作正常,但不知何故内存没有正确释放。也许你有一秒钟的时间来交叉检查它:stackoverflow.com/questions/38118923/…
标签: c++ visual-c++ bitmap mfc