在我的代码中,我在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_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;
}