Using ON_UPDATE_COMMAND_UI with dialogs (2) 

afxpriv.h has a message, WM_KICKIDLE, that is sent during idle processing. To get dialogs to work with the ON_UPDATE_COMMAND_UI message maps, you need to trap the kick idle message and call UpdateDialogControls. 

In a dalog class header, add the following in the message map: 

afx_msg LRESULT OnKickIdle(WPARAM , LPARAM );

In the implementation file: 

#include 

In the message map add: 

ON_MESSAGE(WM_KICKIDLE, OnKickIdle)

Implement the function: 

LRESULT CMyDlg::OnKickIdle(WPARAM wParam, LPARAM lParam)

{

UpdateDialogControls(this, FALSE);

return 0;

}

I leave the bDisableIfNoHndler flag as FALSE so buttons without message map entries are not disabled. 

You can now use ON_UPDATE_COMMAND_UI message maps for enabling/disabling controls, setting static text, etc. 

It works really well when you have two or more radio buttons that enable/disable different groups of controls. Just have one OnUpdate... function for each group of controls that enables/disables depending on the radio button selected, use IsDlgButtonChecked. Then add a message map entry for each control. 

To use ON_UPDATE_COMMAND_UI in form views.

The kick idle message doesn't work in form views, but there's another message in afxpriv.h called WM_IDLEUPDATECMDUI, that does. 

In a form view class header, add the following in the message map: 

afx_msg LRESULT OnIdleUpdateCmdUI(WPARAM , LPARAM );

In the implementation file: 

#include 

In the message map add: 

ON_MESSAGE(WM_IDLEUPDATECMDUI, OnIdleUpdateCmdUI)

Implement the function: 

LRESULT CMyFormView::OnIdleUpdateCmdUI(WPARAM wParam, LPARAM)

{

UpdateDialogControls(this, FALSE);

return 0L;

}

ON_UPDATE_COMMAND_UI can now be used as described above. 

Updated 21 March 1998