三、Windows键盘快捷键—启用菜单项
窗口消息处理程序的工作包括启用和无效化「Edit」菜单中的选项,这项工作在处理WM_INITMENUPOPUP时完成。首先,程序检查是否要显示「Edit」弹出式菜单。因为菜单里「Edit」的位置索引(「File」从0开始)是1,因此如果即将显示「Edit」弹出式菜单,那么lParam应该等于1。
为了确定是否启用「Undo」选项,POPPAD2给编辑控件发送一条EM_CANUNDO消息。如果编辑控件能够执行「Undo」动作,那么SendMessage呼叫传回非零值。在这种情况下,选项被启用;否则,选项无效化:
EnableMenuItem (wParam, IDM_UNDO, SendMessage (hwndEdit, EM_CANUNDO, 0, 0) ? MF_ENABLED : MF_GRAYED) ;
只有当剪贴簿中包含文字时,「Paste」选项才能够被启用。我们可以使用CF_TEXT标识符通过IsClipboardFormatAvailable呼叫来确定这一点:
EnableMenuItem (wParam, IDM_PASTE, IsClipboardFormatAvailable (CF_TEXT) ? MF_ENABLED : MF_GRAYED) ;
只有选择了编辑控件中的文字,「Cut」、「Copy」和「Delete」选项才能够被启用。给编辑控件发送一条EM_GETSEL消息,并传回包含此信息的整数:
iSelect = SendMessage (hwndEdit, EM_GETSEL, 0, 0) ;
iSelect的低位字是第一个被选中字符的位置,iSelect的高字组是下一个被选中字符的位置。如果这两个字相等,则表示没有选中文字:
if (HIWORD (iSelect) == LOWORD (iSelect)) iEnable = MF_GRAYED ; else iEnable = MF_ENABLED ;
然后可以将iEnable的值用于「Cut」、「Copy」和「Delete」选项:
EnableMenuItem (wParam, IDM_CUT, iEnable) ; EnableMenuItem (wParam, IDM_COPY, iEnable) ; EnableMenuItem (wParam, IDM_DEL, iEnable) ;