#visual-c #mfc #win32gui
Вопрос:
У меня есть приложение с таблицей свойств в стиле outlook_bar, которое я использую в качестве основного диалогового окна. Я создал лист свойств с 3 страницами на нем. Я создал 6 растровых изображений каждого измерения(82,82) для отображения на вкладках.Одновременно 3 растровых изображения будут использоваться листом свойств.
Всякий раз, когда пользователь переходит на новую вкладку, я хотел бы изменить растровое изображение, отображаемое на выбранной вкладке. Для этого я написал ниже функцию ChangeImgList(int selno).
Функция вызывается из функции OnSetActive соответствующих страниц свойств.Когда я запускаю код, я получаю сообщение «Обнаружена ошибка неправильного аргумента» в строке SetIconsList(m_shtSelImages.m_hImageList).
Я получаю эту ошибку при втором вызове этой функции.
Функция выглядит следующим образом:
void AppPropSheet::ChangeImgList(int sel)
{
//m_shtSelImages is of type CImageList and m_bmpimgs[3] is an array of CBitmap
//both are members of AppPropSheet class
static bool firsttime = true;
int retval;
if(!firsttime)
for(int i=0;i<3;i )
m_bmpimgs[i].~CBitmap();
if (sel == 0)
m_bmpimgs[0].LoadBitmapA(IDB_BITMAP86);
else
m_bmpimgs[0].LoadBitmapA(IDB_BITMAP77);
if (sel == 1)
m_bmpimgs[1].LoadBitmapA(IDB_BITMAP87);
else
m_bmpimgs[1].LoadBitmapA(IDB_BITMAP81);
if (sel == 2)
m_bmpimgs[2].LoadBitmapA(IDB_BITMAP88);
else
m_bmpimgs[2].LoadBitmapA(IDB_BITMAP79);
if (!firsttime)
m_shtSelImages.DeleteImageList();
retval = m_shtSelImages.Create(81, 81, ILC_COLOR24|ILC_MASK , 1, 1);
retval = m_shtSelImages.Add(amp;m_bmpimgs[0], RGB(128, 128, 128));
retval = m_shtSelImages.Add(amp;m_bmpimgs[1], RGB(128, 128, 128));
retval = m_shtSelImages.Add(amp;m_bmpimgs[2], RGB(128, 128, 128));
//SetIconsList(m_shtSelImages.m_hImageList);
firsttime = false;
}
//end of function
В отладчике я нашел следующее :
Это утверждается в функции SetIconsList в строке ОБЕСПЕЧИТЬ(m_Icons.GetSafeHandle()==NULL) в afxpropertysheet.cpp
Очевидно, то, как я пытаюсь изменить растровое изображение, не предусмотрено фреймворком.С нетерпением ждем ваших предложений.
Комментарии:
1. Не уверен, что это причина вашей проблемы, но чего вы надеетесь достичь с
bmpimgs[i].~CBitmap();
помощью иm_shtSelImages.~CImageList();
?2. Или, может быть, в этом и есть проблема. Вы вызываете деструктор объектов (что означало бы, что эти объекты уничтожены), а затем, сразу после этого, вы используете эти объекты, например, в строках
bmpimgs[0].LoadBitmapA(IDB_BITMAP86);
. ???3. ~CBitmap() вызывается для полного уничтожения существующего растрового изображения перед перезагрузкой нового растрового изображения с помощью функции LoadBitmap. В списке CImageList есть список удалений, но я также нашел функции отсоединения и присоединения, поэтому не уверен, какие функции использовать.
4. Позвольте мне попробовать изменить код и посмотреть, в этом ли проблема.
5. «Он падает на
ENSURE(...)
» — это не катастрофа. Это неудачное утверждение отладки . Это говорит вам, какие условия должны быть верными, но это не так. Кроме того, пожалуйста, отформатируйте код. Как уже было сказано, трудно даже выполнить эту функцию.
Ответ №1:
Следующий код в классе, производном от класса CMFCPropertySheet, работает. Если есть какой-либо другой способ, пожалуйста, дайте мне знать.
m_wndPane1.RemoveAllButtons();
retval=m_wndPane1.AddButton(m_bmpimgs[0], "Button one text", 10050, 0);
retval=m_wndPane1.AddButton(m_bmpimgs[1], "Button two text", 10051, 1);
retval=m_wndPane1.AddButton(m_bmpimgs[2], "Button three text", 10052, 2);
m_wndPane1.InvalidateButton(0);
m_wndPane1.InvalidateButton(1);
m_wndPane1.InvalidateButton(2);