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

时间:2019-01-21 04:59:33

标签: mfc cbutton

在我的代码中,我在OnCreate()的视图类中添加了按钮。我包括了“按命令”和“按更新时的命令”功能。当我单击按钮时,此处的命令功能正在工作。但是在更新中,Cmmmand无法正常工作。我使用此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);
}

在“放大”和“放大”功能中,OnUpdateCommnad均不起作用。

2 个答案:

答案 0 :(得分:2)

此路由不会自动完成。

您必须处理football。通常,您调用内部WM_IDLEUPDATECMDUI虚拟函数。最后调用OnUpdateCmdUI

您可以在TN021

中找到详细信息

只需在运行的OnUpdate处理程序上设置一个断点。并查看调用堆栈。比您可以看到和想象的整个工作原理。

还有一种使用UpdateDialogControlsWM_KICKIDLE的方法。参见此article

答案 1 :(得分: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;
}