处理WM_INITMENUPOPUP消息

【勇芳软件工作室】汉化HomePreviousNext

在任何给定时间,并非所有剪贴板命令都可供用户使用。应用程序应处理WM_INITMENUPOPUP消息以启用可用命令的菜单项,并禁用不可用命令。

以下是名为Label的应用程序的WM_INITMENUPOPUP情况。

case WM_INITMENUPOPUP:

InitMenu((HMENU) wParam);

break;

InitMenu函数定义如下。

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);

开关(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;

其他

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

);

其他

EnableMenuItem(hmenu,id,

IsClipboardFormatAvailable(

uLabelFormat)?

MF_BYCOMMAND | MF_ENABLED :

MF_BYCOMMAND | MF_GRAYED

);

}

}

}