Команда обновления не работает для динамически созданной кнопки в MFC - PullRequest
0 голосов
/ 21 января 2019

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

In 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)

Команда Onи функция 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 ]

0 голосов
/ 21 января 2019

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

В 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;
}
0 голосов
/ 21 января 2019

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...