Visual c++ 更改控制变量时MFC图片控件不显示位图
我有一个基于MFC对话框的应用程序。我放置了一个图片控件(位图类型)来显示初始/默认资源位图。当应用程序启动时,它显示的很好 当用户在CListbox中选择项目时,我想更改显示的位图资源。创建了CStatic控制变量m_Bitmap,我根据用户的列表框选择对其进行了更改。然后我更新控件 执行时,原始位图将消失,控件无法显示新位图。我对静态文本控制变量和cstring使用了相同的技术,效果很好 为什么我的位图无法更改?尝试使用CWnd指针调用picture控件的RedrawWindow()函数,该指针也不执行任何操作 这在MFC中应该是一件容易的事情Visual c++ 更改控制变量时MFC图片控件不显示位图,visual-c++,bitmap,mfc,Visual C++,Bitmap,Mfc,我有一个基于MFC对话框的应用程序。我放置了一个图片控件(位图类型)来显示初始/默认资源位图。当应用程序启动时,它显示的很好 当用户在CListbox中选择项目时,我想更改显示的位图资源。创建了CStatic控制变量m_Bitmap,我根据用户的列表框选择对其进行了更改。然后我更新控件 执行时,原始位图将消失,控件无法显示新位图。我对静态文本控制变量和cstring使用了相同的技术,效果很好 为什么我的位图无法更改?尝试使用CWnd指针调用picture控件的RedrawWindow()函数,该
//Code Snippet
//
//Picture Control (IDC_BitmapCntl), control variable is m_Bitmap
// DDX_Control(pDX, IDC_BitmapCntl, m_Bitmap);
//
//Code from CList Control, OnLbnSelchange() function, CListbox variable is m_Selection
//
switch (m_Selection) { //Select a coresponding bitmap to display
case (0):
m_Bitmap.SetBitmap((HBITMAP)IDB_Bitmap1);
break;
case (1):
m_Bitmap.SetBitmap((HBITMAP)IDB_Bitmap2);
break;
//additional cases ommited for brevity
default:
break;
}
UpdateData(FALSE); //this should update the control but does not display new bitmap
//Failed attempt to then redraw control
CWnd* pDlg;
pDlg = GetDlgItem(IDC_BitmapCntl);
pDlg->RedrawWindow(); //cannot access OnPaint() via a pointer
//end snippet
编译时没有错误。初始位图图像显示正常,但在用户选择列表框中的项目时消失。新位图不显示。假设
IDB_位图1
和IDB_位图2
是所需位图(在.rc
或.rc2
文件中定义)的(完整)资源标识符,则不能简单地使用(HBITMAP)IDB_位图1
强制转换它们(HBITMAP
实际上是一个指针,然后它将指向谁知道是什么=>可怕的未定义的行为)
您必须使用LoadBitmap()
函数(或类似函数)从应用程序的资源中获取实际位图。最简单的方法是使用(本地)CBitmap
对象:
//...
CBitmap bitmap;
switch (m_Selection) { //Select a coresponding bitmap to display
case 0: // Don't really need brackets around case 'values'
bitmap.LoadBitmap(IDB_Bitmap1); // "LoadBitmap" will have "W" appended for Unicode builds
break; // or "A" appended for non-Unicode ('ASCII') builds.
case 1:
bitmap.LoadBitmap(IDB_Bitmap2); // Probably best practice to use the 'native' names?
break;
// Additional cases ...
default: // Strictly speaking, unnecessary, but I like to put this catch-all in ...
break; // ... and good for you, for also having it!
}
m_Bitmap.SetBitmap(bitmap.operator HBITMAP());
// Strict way to do it, but you can omit the ".operator HBITMAP()" in MOST cases.
希望这有帮助
PS:对于未处理的情况,您确实应该(在
默认情况下)在CBitmap
中放置一个“有效”位图。效果很好。添加了新代码:CBitmap bm;……案例(0):bm.LoadBitmapW(IDB_Bitmap1);break;……m_bitmap.SetBitmap(bm);UpdateData(FALSE);是的,请作为答案发布。谢谢你指出我的问题。。。