I coded a simple text editor as one of my first C Windows programs. I found some code that could help you. Sorry for the wide post, poor formatting, etc:
This is the code to handle WM_MENUSELECT:
Code:
case WM_MENUSELECT:
//A menu has been selected but not clicked
//Make sure menuitems are enabled or not as needed
if (lParam != 0) //a menu has been selected.
MenuSelect( LOWORD(wParam), lParam);
return TRUE;
This is the MenuSelect function:
Code:
void MenuSelect(INT menu, LPARAM lParam) {
//menu will be id of selected menu
//lParam is handle to main menu.
INT selection;
BOOL noValidSelection;
switch ( menu ) {
case M_EDIT:
EnableMenuItem( (HMENU) lParam,M_EDIT_UNDO, !SendMessage(hEdit,EM_CANUNDO,0,0) );
EnableMenuItem( (HMENU) lParam,M_EDIT_PASTE, !IsClipboardFormatAvailable(CF_TEXT) );
//check if a valid selection is highlighted
selection = SendMessage(hEdit,EM_GETSEL,0,0);
noValidSelection = LOWORD(selection) == HIWORD(selection);
EnableMenuItem( (HMENU) lParam,M_EDIT_CUT, noValidSelection );
EnableMenuItem( (HMENU) lParam,M_EDIT_COPY, noValidSelection );
EnableMenuItem( (HMENU) lParam,M_EDIT_DEL, noValidSelection );
break;
} //end switch
return;
}
This was how I implemented the standard edit menu commands:
Code:
case M_EDIT_UNDO:
SendMessage(hEdit,EM_UNDO,0,0);
break;
case M_EDIT_CUT:
SendMessage(hEdit,WM_CUT,0,0);
break;
case M_EDIT_COPY:
SendMessage(hEdit,WM_COPY,0,0);
break;
case M_EDIT_PASTE:
SendMessage(hEdit,WM_PASTE,0,0);
break;
case M_EDIT_DEL:
SendMessage(hEdit,WM_CLEAR,0,0);
break;
case M_EDIT_SELALL:
SendMessage(hEdit,EM_SETSEL,0,-1);
break;
Finally, this was the resource script for the menu and accelerators:
Code:
M_MAIN MENU
BEGIN
POPUP "&File"
BEGIN
POPUP "&New"
BEGIN
MENUITEM "&Document", M_FILE_NEW
MENUITEM "&Window", M_FILE_WIN
END
MENUITEM "&Open", M_FILE_OPEN
MENUITEM "&Save", M_FILE_SAVE
MENUITEM "Save &As", M_FILE_SAVEAS
MENUITEM SEPARATOR
MENUITEM "&Refresh", M_FILE_REFRESH
MENUITEM SEPARATOR
MENUITEM "E&xit", M_FILE_EXIT
END
POPUP "&Edit"
BEGIN
MENUITEM "&Undo", M_EDIT_UNDO
MENUITEM SEPARATOR
MENUITEM "Cu&t", M_EDIT_CUT
MENUITEM "&Copy", M_EDIT_COPY
MENUITEM "&Paste", M_EDIT_PASTE
MENUITEM "De&lete", M_EDIT_DEL
MENUITEM SEPARATOR
MENUITEM "Select A&ll", M_EDIT_SELALL
MENUITEM "Time/&Date F5", M_EDIT_TIME
MENUITEM SEPARATOR
MENUITEM "&Word Wrap", M_EDIT_WORD
MENUITEM "Change &Font", M_EDIT_FONT
END
POPUP "&Search"
BEGIN
MENUITEM "&Find", M_SRCH_FND
MENUITEM "Find &Next F3", M_SRCH_FNDNXT
MENUITEM SEPARATOR
MENUITEM "&Replace", M_SRCH_RPLC
END
END
ID_ACCEL ACCELERATORS
BEGIN
VK_F5, M_EDIT_TIME, VIRTKEY,
VK_F3, M_SRCH_FNDNXT, VIRTKEY,
83, M_FILE_SAVE, VIRTKEY, CONTROL
78, M_FILE_NEW, VIRTKEY, CONTROL
65, M_EDIT_SELALL, VIRTKEY, CONTROL
79, M_FILE_OPEN, VIRTKEY, CONTROL
70, M_SRCH_FND, VIRTKEY, CONTROL
END