Visual c++ 更改控制变量时MFC图片控件不显示位图

Visual c++ 更改控制变量时MFC图片控件不显示位图,visual-c++,bitmap,mfc,Visual C++,Bitmap,Mfc,我有一个基于MFC对话框的应用程序。我放置了一个图片控件(位图类型)来显示初始/默认资源位图。当应用程序启动时,它显示的很好 当用户在CListbox中选择项目时,我想更改显示的位图资源。创建了CStatic控制变量m_Bitmap,我根据用户的列表框选择对其进行了更改。然后我更新控件 执行时,原始位图将消失,控件无法显示新位图。我对静态文本控制变量和cstring使用了相同的技术,效果很好 为什么我的位图无法更改?尝试使用CWnd指针调用picture控件的RedrawWindow()函数,该

我有一个基于MFC对话框的应用程序。我放置了一个图片控件(位图类型)来显示初始/默认资源位图。当应用程序启动时,它显示的很好

当用户在CListbox中选择项目时,我想更改显示的位图资源。创建了CStatic控制变量m_Bitmap,我根据用户的列表框选择对其进行了更改。然后我更新控件

执行时,原始位图将消失,控件无法显示新位图。我对静态文本控制变量和cstring使用了相同的技术,效果很好

为什么我的位图无法更改?尝试使用CWnd指针调用picture控件的RedrawWindow()函数,该指针也不执行任何操作

这在MFC中应该是一件容易的事情

//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);是的,请作为答案发布。谢谢你指出我的问题。。。