amiga-bootcamp/09_intuition/menus.md

65 lines
1.8 KiB
Markdown
Raw Normal View History

[← Home](../README.md) · [Intuition](README.md)
# Menus — MenuStrip Construction
## Overview
Intuition menus are structured as: `Menu``MenuItem``SubItem`. Menus are attached to windows and appear when the user presses the right mouse button.
---
## GadTools Menu Creation (OS 2.0+)
```c
struct NewMenu nm[] = {
{ NM_TITLE, "Project", NULL, 0, 0, NULL },
{ NM_ITEM, "New", "N", 0, 0, NULL },
{ NM_ITEM, "Open...", "O", 0, 0, NULL },
{ NM_ITEM, NM_BARLABEL, NULL, 0, 0, NULL }, /* separator */
{ NM_ITEM, "Quit", "Q", 0, 0, NULL },
{ NM_TITLE, "Edit", NULL, 0, 0, NULL },
{ NM_ITEM, "Cut", "X", 0, 0, NULL },
{ NM_ITEM, "Copy", "C", 0, 0, NULL },
{ NM_ITEM, "Paste", "V", 0, 0, NULL },
{ NM_END, NULL, NULL, 0, 0, NULL }
};
struct Menu *menu = CreateMenus(nm, TAG_DONE);
LayoutMenus(menu, vi, TAG_DONE);
SetMenuStrip(win, menu);
/* In event loop on IDCMP_MENUPICK: */
UWORD code = imsg->Code;
while (code != MENUNULL) {
struct MenuItem *item = ItemAddress(menu, code);
UWORD menuNum = MENUNUM(code);
UWORD itemNum = ITEMNUM(code);
UWORD subNum = SUBNUM(code);
/* process selection */
code = item->NextSelect;
}
/* Cleanup: */
ClearMenuStrip(win);
FreeMenus(menu);
```
---
## Menu Selection Macros
```c
#define MENUNUM(code) ((code) & 0x1F) /* menu number (031) */
#define ITEMNUM(code) (((code) >> 5) & 0x3F) /* item number (063) */
#define SUBNUM(code) (((code) >> 11) & 0x1F) /* subitem number */
#define FULLMENUNUM(m,i,s) ((m)|((i)<<5)|((s)<<11))
#define MENUNULL 0xFFFF /* no selection */
```
---
## References
- NDK39: `libraries/gadtools.h`, `intuition/intuition.h`
- ADCD 2.1: `CreateMenus`, `LayoutMenus`, `SetMenuStrip`