1

在我的代码中,我在 OnCreate() 的视图类中添加了按钮。我包括了 On Command 和 On Update COMmand 功能。当我单击按钮时,这里的命令功能正在工作。但是 On Update 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)

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 都不起作用。

4

2 回答 2

2

此路由不会自动完成。

你必须处理WM_IDLEUPDATECMDUI。通常你调用内部OnUpdateCmdUI虚函数。这终于调用了UpdateDialogControls

您可以在TN021中找到详细信息

只需在工作的 OnUpdate 处理程序上设置一个断点。并查看调用堆栈。比你可以看到和想象的整个东西是如何工作的。

还有一种可能的方式来使用WM_KICKIDLEUpdateDialogControls。见这篇文章

于 2019-01-21T09:04:57.037 回答
1

试试下面的。

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;
}
于 2019-01-21T17:46:47.057 回答