Using ON_UPDATE_COMMAND_UI with controls

CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More.

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 <afxpriv.h>

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 <afxpriv.h>

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

More by Author

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Must Read