Команда обновления не работает для динамически созданной кнопки в 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;
}