Processing the WM_INITMENUPOPUP Message

Not all clipboard commands are available to the user at any given time. An application should process the WM_INITMENUPOPUP message to enable the menu items for available commands and disable unavailable commands.

Following is the WM_INITMENUPOPUP case for an application named Label.

case WM_INITMENUPOPUP:

InitMenu((HMENU) wParam);

break;

The InitMenu function is defined as follows.

void WINAPI InitMenu(HMENU hmenu)

{

int cMenuItems = GetMenuItemCount(hmenu);

int nPos;

UINT id;

UINT fuFlags;

PLABELBOX pbox = (hwndSelected == NULL) ? NULL :

(PLABELBOX) GetWindowLong(hwndSelected, 0);

for (nPos = 0; nPos < cMenuItems; nPos++)

{

id = GetMenuItemID(hmenu, nPos);

switch (id)

{

case IDM_CUT:

case IDM_COPY:

case IDM_DELETE:

if (pbox == NULL || !pbox->fSelected)

fuFlags = MF_BYCOMMAND | MF_GRAYED;

else if (pbox->fEdit)

fuFlags = (id != IDM_DELETE && pbox->ichSel

== pbox->ichCaret) ?

MF_BYCOMMAND | MF_GRAYED :

MF_BYCOMMAND | MF_ENABLED;

else

fuFlags = MF_BYCOMMAND | MF_ENABLED;

EnableMenuItem(hmenu, id, fuFlags);

break;

case IDM_PASTE:

if (pbox != NULL && pbox->fEdit)

EnableMenuItem(hmenu, id,

IsClipboardFormatAvailable(CF_TEXT) ?

MF_BYCOMMAND | MF_ENABLED :

MF_BYCOMMAND | MF_GRAYED

);

else

EnableMenuItem(hmenu, id,

IsClipboardFormatAvailable(

uLabelFormat) ?

MF_BYCOMMAND | MF_ENABLED :

MF_BYCOMMAND | MF_GRAYED

);

}

}

}