“更新”命令不适用于 MFC 中动态创建的按钮



在我的代码中,我在OnCreate()的视图类中添加了按钮。 我包括了"命令"和"更新通信功能"。当我单击按钮时,这里的命令功能正在工作。但是在更新时通信不起作用。我使用此 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 命令

和 OnUpdate命令功能:

void CTrendView::OnTzoomout()
{   
    sTimeStatus.Format("<=>%d",Minute/2);
}
void CTrendView::OnUpdateTzoomout(CCmdUI *pCmdUI)
{   
    if (Minute == 16)
        pCmdUI->Enable(FALSE);
    else
        pCmdUI->Enable(TRUE);
}

在放大和缩小功能中,OnUpdateCommnad不起作用。

此路由不会自动完成。

你必须处理WM_IDLEUPDATECMDUI.通常,您将内部函数OnUpdateCmdUI虚拟函数称为虚函数。这终于叫UpdateDialogControls.

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

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

还有一种可能的方法 使用WM_KICKIDLEUpdateDialogControls .请参阅此文章。

尝试以下操作。

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;
}

最新更新