MFC Picture Control не отображает растровое изображение при изменении управляющей переменной - PullRequest
0 голосов
/ 21 сентября 2019

У меня есть приложение на основе MFC Dialog.Я поместил Picture Control (типа Bitmap) для отображения исходного / стандартного растрового изображения ресурса.Это прекрасно отображается при запуске приложения.

Когда пользователь выбирает элемент в CListbox, я хочу изменить отображаемый растровый ресурс.Была создана управляющая переменная CStatic m_Bitmap, и я меняю ее в зависимости от выбора списка пользователей.Затем я обновляю элементы управления.

После выполнения исходное растровое изображение просто исчезает, и элемент управления не может отобразить новое растровое изображение.Я использовал ту же технику со статическими переменными управления текстом и CStrings, и она отлично работает.

Почему мои растровые изображения не меняются?Попытка вызова функции RedrawWindow () элементов управления изображением с указателем CWnd, который тоже ничего не делает.

Это должно быть легко сделать в 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

Нет ошибок насборник.Исходное растровое изображение отображается ОК, но исчезает, когда пользователь выбирает элемент в списке.Новое растровое изображение не отображается.

1 Ответ

0 голосов
/ 21 сентября 2019

Если предположить, что IDB_Bitmap1 и IDB_Bitmap2 являются (целыми) идентификаторами ресурсов для нужных битовых карт (определенных в файле .rc или .rc2), то вы не можете просто привести их с помощью (HBITMAP)IDB_Bitamp1(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: Вам действительно следует что-то сделать (в случае default, возможно,) поставить «действительное» растровое изображение в CBitmap для необработанных случаев.

...