Не удалось изменить растровые изображения вкладок в CMFCPropertySheet в стиле OutLook_Bar

#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);