This message is returned by EvntWIndom() when a window menu item is selected by the user. The message has the following structure :
evnt.buff[0] = WM_MNSELECTED evnt.buff[1] = application identifier evnt.buff[2] = always 0 evnt.buff[3] = window targetted handle evnt.buff[4] = title selected index evnt.buff[5] = item selected indexHere a typical example :
main() { int res, title; WINDOW *win; /* create a window with a menu */ ... while( 1) { res = EvntWindom( MU_MESAG); if( res & MU_MESAG && evnt.buff[0] == WM_MNSELECTED) { title = evnt.buff[4]; /* get the window targetted */ win = WindHandle( evnt.buff[3]); /* Handle the menu */ switch( evnt.buff[5]) { case ITEM1: break; case ITEM2: break; } /* unhighlight the menu title */ MenuTnormal( win, evnt.buff[4], 1); } } }
This message, returned by EvntWindom() when a user selects a desktop menu item, has a similar structure than the previous one :
evnt.buff[0] = WM_MNSELECTED evnt.buff[1] = application identifier evnt.buff[2] = always 0 evnt.buff[3] = title selected index evnt.buff[4] = item selected indexAnd now an example :
main() { int res, title; WINDOW *win; /* Diverses WinDom initialization ... */ while( 1) { res = EvntWindom( MU_MESAG); if( res & MU_MESAG && evnt.buff[0] == MN_SELECTED) { title = evnt.buff[3]; /* Handle the menu */ switch( evnt.buff[4]) { case ITEM1: break; case ITEM2: break; } /* unhighlight the menu title */ MenuTnormal( NULL, evnt.buff[3], 1); } } }
A function can be linked to the window menu event with the call :
WindSet( win, menu, do_menu);where menu is the address of a menu object tree and do_menu is an event function which handle the user selection in the menu. This function is called by EvntWindom() when event WM_MNSELECTED occurs. This method have the advantage to have a global action in WinDom : each time EvntWindom() function is invoked, user selection of menu is taken into account.
void main() { int res; WINDOW *win; /* target window */ OBJECT *tree; void do_menu( WINDOW *); ApplInit(); RsrcLoad( "menu.rsc"); /* create the window */ win = WindCreate( NAME|MOVBER|CLOSER|SMALLER, app.x, app.y, app.w, app.h); /* add a menu and an event menu function */ rsrc_gaddr( 0, MY_MENU, &menu); WindSet( win, WF_MENU, menu, do_menu); while(1) EvntWindom( MU_MESAG); RsrcFree(); ApplExit(); } /* Here the menu function */ void do_menu( WINDOW *win) { int title = evnt.buff[4]; switch(( evnt.buff[5]) { case ENTRE1: break; case ENTRE2: break; } MenuTnormal( win, title, 1); }Note : the call
WindSet( win, WF_MENU, menu, do_menu);is strictly equivalent to :
WindSet( win, WF_MENU, menu, NULL); EvntAttach( win, WM_MNSELECTED, do_menu);
As WM_MNSELECTED message, MN_SELECTED message, which designs user selection in the desktop menu, can be binded to a function. It is performed by the following call :
EvntAttach( NULL, MN_SELECTED, do_menu);
It is the third method to handle a menu in WinDom. Instead of handle the user selection event by catching an event message and trait it in a switch structure, we can attach each entry of a menu to a specific function. The method is the same for window menu and desktop menu. The following call :
ObjcAttach( OC_MENU, win, QUIT, BIND_FUNCTION, quit);attached the quit() function to the entry QUIT of the menu of the window win. If win is NULL, the desktop menu is addressed.
Object selection event function have a different prototype than event function :
void quit( WINDOW *win, int obj, int mode, int title);where win is the window descriptor containing the menu (it is NULL for the desktop menu, obj is the index of the selected entry, mode is equal to OC_MENU and title is the index of menu title hilighted by the user selection. This value is typically used by MenuTnormal() to unhilght the menu title. Example :
#include <windom.h> #include <stdlib.h> /* Quit the application */ void quitapp(void) { while( wglb.first) { ApplWrite( app.id, WM_DESTROY, wglb.first->handle); EvntWindom( MU_MESAG); } RsrcFree(); ApplExit(); exit( 0); } /* Give information */ void information( WINDOW *win, int obj, int mode, int title) { FormAlert( 1, "[1][We have selected item %d][OK]", obj); MenuTnormal( NULL, title, 1); } /* Open a window */ void openwin( WINDOW *win, int obj, int mode, int title) { WINDOW *win; OBJECT *menu; win = WindCreate( WAT_NOINFO, app.x, app.y, app.w, app.h); rsrc_gaddr( 0, WINMENU, &menu); WindSet( win, WF_MENU, menu, NULL); ObjcAttach( OC_MENU, win, CLOSE, BIND_FUNC, closewin); WindOpen( win, -1, -1, 300, 200); MenuTnormal( win, title, 1); } /* Close the window */ void closewin( WINDOW *win, int obj, int mode, int title) { MenuTnormal( win, title, 1); } void main( void) { OBJECT *menu; WINDOW *win; ApplInit(); RsrcLoad( "resource.rsc"); rsrc_gaddr( 0, DESKMENU, &menu); MenuBar( menu, 1); ObjcAttach( OC_MENU, NULL, QUIT, BIND_FUNC, quitapp); ObjcAttach( OC_MENU, NULL, INFORMATION, BIND_FUNC, information); ObjcAttach( OC_MENU, NULL, OPEN, BIND_FUNC, openwin); for(;;) EvntWindom( MU_MESAG); }