Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Extended Combo Box в ReBar


Автор: AndrRus 4.4.2008, 21:07
Решил добавить на Rebar - Extended Combo Box, когда создавал в диалоговом окне, то все нормально было, пользовательскую функцию для загрузки иконок и список имен вызывал в OnInitDialog () - и все работало прекрасно. Стоило мне попробовать сделать все тоже самое, но только на Rebar панели, программа ругается (не компилятор). Где бы не пытался вызвать функцию в методах класса View - везде одна и таже проблема.

Вот собственно код:
Код

...
// Таким образом стучусь к элементу управления.
CMainFrame *pFrame = (CMainFrame *) AfxGetMainWnd ();      
CComboBoxEx* pCombo = (CComboBoxEx*) pFrame->m_wndReBar.GetDlgItem (IDC_COMBOBOXEX2_COLOR);
...
COMBOBOXEXITEM cbi;
cbi.mask = CBEIF_IMAGE | CBEIF_TEXT | CBEIF_OVERLAY | CBEIF_SELECTEDIMAGE;
for (i = 0; i < 8; i++) {
        cbi.iItem = i;
        cbi.pszText = color[i];
        cbi.iImage = i; 
        cbi.iSelectedImage = i;
        cbi.iOverlay = i;
        int ListItem = pCombo->InsertItem (&cbi);           // При пробеге "дебагером" ругается на этой строчке
        ASSERT (ListItem == i);
}


Помогите разобраться с проблемой.

Автор: korian 4.4.2008, 21:37
я так понимаю  m_wndReBar это CReBar
CComboBoxEx* pCombo = (CComboBoxEx*) pFrame->m_wndReBar.GetDlgItem (IDC_COMBOBOXEX2_COLOR);
ASSERT(pCombo != NULL);//!!!!!!!!
комбо бокс находится не на ребаре, а на чилд диалоге

Автор: AndrRus 4.4.2008, 23:43
Цитата(korian @  4.4.2008,  21:37 Найти цитируемый пост)
я так понимаю  m_wndReBar это CReBar

Да, именно так.

Код

ASSERT (pCombo != NULL);

Проблему это все равно не решило... 

Вот код всей функции:
Код

    m_imageList.Create (32, 16, ILC_MASK, 12, 4); //    CImageList m_imageList - объявлена в классе View;
    CMainFrame *pFrame = (CMainFrame *) AfxGetMainWnd ();
    CComboBoxEx* pCombo = (CComboBoxEx*) pFrame->m_wndReBar.GetDlgItem (IDC_COMBOBOXEX2_COLOR);

    pCombo->SetImageList(&m_imageList);   // сдесь ругается "дебагер"

    COMBOBOXEXITEM cbi;

    HICON hIcon[8];

    hIcon[0] = AfxGetApp()->LoadIcon(IDI_WHITE);
    hIcon[1] = AfxGetApp()->LoadIcon(IDI_BLACK);
    hIcon[2] = AfxGetApp()->LoadIcon(IDI_RED);
    hIcon[3] = AfxGetApp()->LoadIcon(IDI_BLUE);
    hIcon[4] = AfxGetApp()->LoadIcon(IDI_YELLOW);
    hIcon[5] = AfxGetApp()->LoadIcon(IDI_CYAN);
    hIcon[6] = AfxGetApp()->LoadIcon(IDI_PURPLE);
    hIcon[7] = AfxGetApp()->LoadIcon(IDI_GREEN);
    for (int i = 0; i < 8; i++) {
        m_imageList.Add(hIcon[i]);
    }

    static char* color[] = {"white", "black", "red", "blue", "yellow", "cyan", "purple", "green"};

    cbi.mask = CBEIF_IMAGE | CBEIF_TEXT | CBEIF_OVERLAY | CBEIF_SELECTEDIMAGE;

    for (int i = 0; i < 8; i++) {
        cbi.iItem = i;
        cbi.pszText = color[i];
        cbi.iImage = i; 
        cbi.iSelectedImage = i;
        cbi.iOverlay = i;
        int ListItem = pCombo->InsertItem(&cbi); // если закоментировать предыдущую проблему, то ругаться будет сдесь...
        ASSERT(ListItem == i);
    }

Автор: korian 5.4.2008, 00:03
основная мысль была тут:
Цитата(korian @  4.4.2008,  20:37 Найти цитируемый пост)
комбо бокс находится не на ребаре, а на чилд диалоге


ASSERT (pCombo != NULL); - это я хотел показать, что pCombo у вас равен нулю. Если pCombo не равен нулю, то это достаточно странно.

не знаю как вы добавляете бары на ребар...
поидее у вас в MainFrame должна быть переменная, которая является объектом подкласса CDialog.
это переменную, вы указываете, когда используете m_wndRebar.AddBar(&m_bar);
может конечно вы добавляете туда ребары так: m_wndRebar.AddBar(new SomeClass);
что вообщем-то зря, т.к. как это потом удалить...
короче, проблема тут:
CComboBoxEx* pCombo = (CComboBoxEx*) pFrame->m_wndReBar.GetDlgItem (IDC_COMBOBOXEX2_COLOR);
CComboBoxEx* pCombo = (CComboBoxEx*) pFrame->m_bar.GetDlgItem (IDC_COMBOBOXEX2_COLOR);

Автор: AndrRus 5.4.2008, 10:41
korian, 
Код

CComboBoxEx* pCombo = (CComboBoxEx*) pFrame->m_wndReBar.GetDlgItem (IDC_COMBOBOXEX2_COLOR);
CComboBoxEx* pCombo = (CComboBoxEx*) pFrame->m_bar.GetDlgItem (IDC_COMBOBOXEX2_COLOR);

Решение проблемы оказалось куда более простым, чем я думал smile ! Спасибо! В миг решились все проблемы smile !

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)