Информация об изменениях

Сообщение Re[3]: CMFCToolBar button от 01.12.2014 12:05

Изменено 01.12.2014 12:09 AlexGin

Здравствуйте, Alex_st, Вы писали:

A_>Здравствуйте, AlexGin, Вы писали:



AG>>1) В чем проблема применения ON_UPDATE_COMMAND_UI(..., ...)?

A_>в том, что мне нужно апдейтить кнопки по моим событиям, а не тогда когда решит винда, что можно это сделать. к тому же переписывать кучу лигики приложения на ON_UPDATE_COMMAND_UI слишком затратно
Винда работает достаточно точно и оперативно , посему проблемы в этом не должно быть.

AG>>2) Что мешает вызвать CMFCToolBar::GetAllButtons(); — этот вызов заполнит коллекцию кнопок CObList — а в ней уже находить нужную кнопку (объект типа CMFCToolBarButton) и для нее вызывать EnableWindow(FALSE/TRUE)?

A_>то, что это не работает
Может попробовать так:
    POSITION pos;
    const CObList& list = m_wndToolBar.GetAllButtons();
    int i = 0;
    for(pos = list.GetHeadPosition(); pos != NULL; i++)
    {
        CMFCToolBarButton* pBtn = DYNAMIC_DOWNCAST(CMFCToolBarButton, list.GetNext(pos));
        if (pBtn)
        {
            pBtn->Show(TRUE);
            pBtn->SetImage(i); // Set image (or disabled image)
        }
    }
    m_wndToolBar.Invalidate();

Дело в том, что объект CMFCToolBarButton — это наследник CObject
http://msdn.microsoft.com/en-us/library/bb983678.aspx

Поэтому — приходится извращаться...
Re[3]: CMFCToolBar button
Здравствуйте, Alex_st, Вы писали:

A_>Здравствуйте, AlexGin, Вы писали:



AG>>1) В чем проблема применения ON_UPDATE_COMMAND_UI(..., ...)?

A_>в том, что мне нужно апдейтить кнопки по моим событиям, а не тогда когда решит винда, что можно это сделать. к тому же переписывать кучу лигики приложения на ON_UPDATE_COMMAND_UI слишком затратно
Винда работает достаточно точно и оперативно , посему проблемы в этом не должно быть.

AG>>2) Что мешает вызвать CMFCToolBar::GetAllButtons(); — этот вызов заполнит коллекцию кнопок CObList — а в ней уже находить нужную кнопку (объект типа CMFCToolBarButton) и для нее вызывать EnableWindow(FALSE/TRUE)?

A_>то, что это не работает
Может попробовать так:
    POSITION pos;
    const CObList& list = m_wndToolBar.GetAllButtons();
    int i = 0;
    for(pos = list.GetHeadPosition(); pos != NULL; i++)
    {
        CMFCToolBarButton* pBtn = DYNAMIC_DOWNCAST(CMFCToolBarButton, list.GetNext(pos));
        if (pBtn)
        {
            pBtn->Show(TRUE);
            pBtn->SetImage(i); // Set image (or disabled image)
        }
    }
    m_wndToolBar.Invalidate();

Дело в том, что объект CMFCToolBarButton — это наследник CObject, а не CWnd.
То есть — вызов EnableWindow(FALSE/TRUE) тут не пройдет

http://msdn.microsoft.com/en-us/library/bb983678.aspx

Поэтому — приходится извращаться...