Команда обновления не работает для динамически созданной кнопки в MFC

В своем коде я добавил кнопку в классе представления в OnCreate(). Я включил функции "По команде" и "При обновлении команды". Здесь команда On работает, когда я нажимаю кнопку. Но при обновлении COmmand не работает. Я обновляю статус нажатия кнопки с помощью этого OnUpdateCommand().

В OnCreate ()

rBar.left = 580;
    rBar.right = 620;
    cBZoomOut.Create("",WS_CHILD|WS_VISIBLE|BS_BITMAP ,rBar,this,IDC_TZOOMOUT);
    cBZoomOut.SetIcon(IDI_TZOOMOUT);

    rBar.left = 625;
    rBar.right = 665;
    cBZoomin.Create("",WS_CHILD|WS_VISIBLE|BS_BITMAP ,rBar,this,IDC_TZOOMIN);
    cBZoomin.SetIcon(IDI_TZOOMIN);

Карты сообщений для этих кнопок.

    afx_msg void OnUpdateTzoomout(CCmdUI *pCmdUI);
    afx_msg void OnTzoomin();
    afx_msg void OnUpdateTzoomin(CCmdUI *pCmdUI);
    afx_msg void OnTzoomout();

    ON_UPDATE_COMMAND_UI(IDC_TZOOMOUT, &CTrendView::OnUpdateTzoomout)
    ON_COMMAND(IDC_TZOOMIN, &CTrendView::OnTzoomin)
    ON_UPDATE_COMMAND_UI(IDC_TZOOMIN, &CTrendView::OnUpdateTzoomin)
    ON_COMMAND(IDC_TZOOMOUT, &CTrendView::OnTzoomout)

По команде и функции OnUpdatecommand:

void CTrendView::OnTzoomout()
{   
    sTimeStatus.Format("<=>%d",Minute/2);

}
void CTrendView::OnUpdateTzoomout(CCmdUI *pCmdUI)
{   
    if (Minute == 16)
        pCmdUI->Enable(FALSE);
    else
        pCmdUI->Enable(TRUE);
}

В функциях Zoomin и Zoomout OnUpdateCommnad не работает.

2 ответа

Эта маршрутизация не выполняется автоматически.

Вы должны справиться WM_IDLEUPDATECMDUI, Обычно вы называете внутренний OnUpdateCmdUI виртуальная функция. Это наконец-то называет UpdateDialogControls,

Вы найдете детали в TN021

Просто установите точку останова на работающем обработчике OnUpdate. И посмотрите в стек вызовов. Чем вы можете увидеть и представить, как все это работает.

Существует также возможный способ использования WM_KICKIDLE а также UpdateDialogControls, Смотрите эту статью.

Попробуйте следующее.

В TrendView.h Добавь это:

afx_msg LRESULT OnKickIdle(WPARAM wParam, LPARAM lParam);

В TrendView.cpp Добавь это:

#include <afxpriv.h>

...
ON_MESSAGE(WM_KICKIDLE, OnKickIdle)
...

LRESULT CTrendView::OnKickIdle(WPARAM wParam, LPARAM lParam)
{
    UpdateDialogControls(this, FALSE);
    return 0;
}
Другие вопросы по тегам