📄 menu.c
字号:
mii.type = MFT_STRING; if (dwStyle & WS_MAXIMIZE) mii.state = 0; else mii.state = MFS_DISABLED; mii.id = SC_RESTORE; mii.typedata = (DWORD)GetSysText(SysText[8]); InsertMenuItem(hmnu, 2, TRUE, &mii); } mii.type = MFT_SEPARATOR; mii.state = 0; mii.id = 0; mii.typedata = 0; InsertMenuItem(hmnu, 3, TRUE, &mii); mii.type = MFT_STRING; mii.state = 0; mii.id = SC_CLOSE; mii.typedata = (DWORD)GetSysText(SysText[9]); InsertMenuItem(hmnu, 4, TRUE, &mii); return hmnu;}static BOOL mnuInsertMenuItem (PMENUITEM pmi, PMENUITEM pnewmi, int item, BOOL flag){ PMENUITEM ptmpmi; int index; if (flag) { // Insert this new menu item at the start. if (item == 0) { pnewmi->next = pmi; return TRUE; } index = 1; while (pmi->next) { if (index == item) { ptmpmi = pmi->next; pmi->next = pnewmi; pnewmi->next = ptmpmi; return FALSE; } index ++; pmi = pmi->next; } } else { if (item == pmi->id) { pnewmi->next = pmi; return TRUE; } while (pmi->next) { if (pmi->next->id == item) { ptmpmi = pmi->next; pmi->next = pnewmi; pnewmi->next = ptmpmi; return FALSE; } pmi = pmi->next; } } // append this new menu item at the end. pmi->next = pnewmi; return FALSE;}int GUIAPI InsertMenuItem (HMENU hmnu, int item, BOOL flag, PMENUITEMINFO pmii){ PMENUBAR pmb; PMENUITEM pnewmi, pmi; pmb = (PMENUBAR) hmnu; if (pmb->class != TYPE_HMENU) return ERR_INVALID_HANDLE; if (!(pnewmi = MenuItemAlloc ())) return ERR_RES_ALLOCATION; pnewmi->class = TYPE_HMENU; pnewmi->type = TYPE_NMLMENU; pnewmi->mnutype = pmii->type; pnewmi->mnustate = pmii->state; pnewmi->id = pmii->id; pnewmi->hbmpChecked = pmii->hbmpChecked; pnewmi->hbmpUnchecked = pmii->hbmpUnchecked; pnewmi->itemdata = pmii->itemdata; pnewmi->next = NULL; pnewmi->submenu = (PMENUITEM)(pmii->hsubmenu); // copy string. if (pmii->type == MFT_STRING) { pnewmi->typedata = (DWORD)FixStrAlloc (strlen ((char*)pmii->typedata)); strcpy ((char*)pnewmi->typedata, (char*)pmii->typedata); } else pnewmi->typedata = pmii->typedata; if (pmb->type == TYPE_MENUBAR) { pmi = pmb->head; if (!pmi) pmb->head = pnewmi; else { if (mnuInsertMenuItem (pmb->head, pnewmi, item, flag)) pmb->head = pnewmi; } } else if (pmb->type == TYPE_PPPMENU) { pmi = (PMENUITEM)hmnu; if (!pmi->submenu) pmi->submenu = pnewmi; else { if (mnuInsertMenuItem (pmi->submenu, pnewmi, item, flag)) pmi->submenu = pnewmi; } } else return ERR_INVALID_HMENU; return 0;}static void mnuDeleteMenuItem (PMENUITEM pmi){ PMENUITEM ptmpmi; PMENUITEM psubmi; if (pmi->submenu) { psubmi = pmi->submenu; while (psubmi) { ptmpmi = psubmi->next; mnuDeleteMenuItem (psubmi); psubmi = ptmpmi; } } if (pmi->mnutype == MFT_STRING) FreeFixStr ((void*)pmi->typedata); FreeMenuItem (pmi);}static PMENUITEM mnuRemoveMenuItem (PMENUITEM phead, int item, BOOL flag){ int index; PMENUITEM pmi, ptmpmi; if (!phead) return NULL; if (flag) { if (item == 0) { pmi = phead->next; if (!phead->submenu) mnuDeleteMenuItem (phead); return pmi; } pmi = phead; index = 1; while (pmi->next) { if (index == item) { ptmpmi = pmi->next; pmi->next = pmi->next->next; if (!ptmpmi->submenu) mnuDeleteMenuItem (ptmpmi); return phead; } index ++; pmi = pmi->next; } } else { if (phead->id == item) { pmi = phead->next; if (!phead->submenu) mnuDeleteMenuItem (phead); return pmi; } pmi = phead; while (pmi->next) { if (pmi->next->id == item) { ptmpmi = pmi->next; pmi->next = pmi->next->next; if (!ptmpmi->submenu) mnuDeleteMenuItem (ptmpmi); return phead; } pmi = pmi->next; } } return phead;}int GUIAPI RemoveMenu (HMENU hmnu, int item, UINT flags){ PMENUBAR pmb; PMENUITEM pmi; pmb = (PMENUBAR) hmnu; if (pmb->class != TYPE_HMENU) return ERR_INVALID_HANDLE; if (pmb->type == TYPE_MENUBAR) pmb->head = mnuRemoveMenuItem (pmb->head, item, flags & MF_BYPOSITION); else if (pmb->type == TYPE_PPPMENU) { pmi = (PMENUITEM) hmnu; pmi->submenu = mnuRemoveMenuItem (pmi->submenu, item, flags & MF_BYPOSITION); } else return ERR_INVALID_HMENU; // this is a normal menu item. return 0;}static PMENUITEM mnuDeleteMenu (PMENUITEM phead, int item, BOOL flag){ int index; PMENUITEM pmi, ptmpmi; if (!phead) return NULL; if (flag) { if (item == 0) { pmi = phead->next; mnuDeleteMenuItem (phead); return pmi; } pmi = phead; index = 1; while (pmi->next) { if (index == item) { ptmpmi = pmi->next; pmi->next = pmi->next->next; mnuDeleteMenuItem (ptmpmi); return phead; } index ++; pmi = pmi->next; } } else { if (phead->id == item) { pmi = phead->next; mnuDeleteMenuItem (phead); return pmi; } pmi = phead; while (pmi->next) { if (pmi->next->id == item) { ptmpmi = pmi->next; pmi->next = pmi->next->next; mnuDeleteMenuItem (ptmpmi); return phead; } pmi = pmi->next; } } return phead;}int GUIAPI DeleteMenu (HMENU hmnu, int item, UINT flags){ PMENUBAR pmb; PMENUITEM pmi; pmb = (PMENUBAR) hmnu; if (pmb->class != TYPE_HMENU) return ERR_INVALID_HANDLE; if (pmb->type == TYPE_MENUBAR) pmb->head = mnuDeleteMenu (pmb->head, item, flags & MF_BYPOSITION); else if (pmb->type == TYPE_PPPMENU) { pmi = (PMENUITEM) hmnu; pmi->submenu = mnuDeleteMenu (pmi->submenu, item, flags & MF_BYPOSITION); } else return ERR_INVALID_HMENU; // this is a normal menu item. return 0;}int GUIAPI DestroyMenu (HMENU hmnu){ PMENUBAR pmb; PMENUITEM pmi, ptmpmi; pmb = (PMENUBAR) hmnu; if (pmb->class != TYPE_HMENU) return ERR_INVALID_HANDLE; if (pmb->type == TYPE_MENUBAR) { pmi = pmb->head; while (pmi) { ptmpmi = pmi->next; mnuDeleteMenuItem (pmi); pmi = ptmpmi; } FreeMenuBar (pmb); } else mnuDeleteMenuItem ((PMENUITEM)hmnu); return 0;}int GUIAPI IsMenu (HMENU hmnu){ PMENUBAR pMenu = (PMENUBAR)hmnu; if (pMenu->class != TYPE_HMENU) return 0; return pMenu->type;}/*************************** Menu properties support *************************/int GUIAPI GetMenuItemCount (HMENU hmnu){ PMENUBAR pmb; PMENUITEM pmi; int count; pmb = (PMENUBAR) hmnu; if (pmb->class != TYPE_HMENU) return ERR_INVALID_HANDLE; if (pmb->type == TYPE_MENUBAR) pmi = pmb->head; else if (pmb->type == TYPE_PPPMENU) { pmi = (PMENUITEM) hmnu; pmi = pmi->submenu; } else return ERR_INVALID_HMENU; // this is a normal menu item. count = 0; while (pmi) { count ++; pmi = pmi->next; } return count;}static PMENUITEM mnuGetMenuItem (HMENU hmnu, int item, BOOL flag){ PMENUBAR pmb; PMENUITEM pmi; int index; pmb = (PMENUBAR) hmnu; if (pmb->class != TYPE_HMENU) return NULL; if (pmb->type == TYPE_MENUBAR) pmi = pmb->head; else if (pmb->type == TYPE_PPPMENU) { pmi = (PMENUITEM) hmnu; pmi = pmi->submenu; } else return NULL; if (flag) { index = 0; while (pmi) { if (index == item) return pmi; index ++; pmi = pmi->next; } } else { while (pmi) { if (pmi->id == item) return pmi; pmi = pmi->next; } } return NULL; }int GUIAPI GetMenuItemID (HMENU hmnu, int pos){ PMENUBAR pmb; PMENUITEM pmi; int index; pmb = (PMENUBAR) hmnu; if (pmb->class != TYPE_HMENU) return ERR_INVALID_HANDLE; if (pmb->type == TYPE_MENUBAR) pmi = pmb->head; else if (pmb->type == TYPE_PPPMENU) { pmi = (PMENUITEM) hmnu; pmi = pmi->submenu; } else return ERR_INVALID_HMENU; // this is a normal menu item. index = 0; while (pmi) { if (index == pos) return pmi->id; index ++; pmi = pmi->next; } return ERR_INVALID_POS;}HMENU GUIAPI GetPopupSubMenu (HMENU hpppmnu){ PMENUITEM pmi; pmi = (PMENUITEM) hpppmnu; if (pmi->class != TYPE_HMENU) return 0; if (pmi->type != TYPE_PPPMENU) return 0; return (HMENU)(pmi->submenu);}HMENU GUIAPI GetSubMenu (HMENU hmnu, int pos){ PMENUBAR pmb; PMENUITEM pmi; int index; pmb = (PMENUBAR) hmnu; if (pmb->class != TYPE_HMENU) return 0; if (pmb->type == TYPE_MENUBAR) pmi = pmb->head; else if (pmb->type == TYPE_PPPMENU) { pmi = (PMENUITEM) hmnu; pmi = pmi->submenu; } else return 0; // this is a normal menu item. index = 0; while (pmi) { if (index == pos) return (HMENU)(pmi->submenu); index ++; pmi = pmi->next; } return 0;}int GUIAPI GetMenuItemInfo (HMENU hmnu, int item, BOOL flag, PMENUITEMINFO pmii){ PMENUITEM pmi; if (!(pmi = mnuGetMenuItem (hmnu, item, flag))) return ERR_INVALID_HMENU; if (pmii->mask & MIIM_CHECKMARKS) { pmii->hbmpChecked = pmi->hbmpChecked; pmii->hbmpUnchecked = pmi->hbmpUnchecked; } if (pmii->mask & MIIM_DATA) { pmii->itemdata = pmi->itemdata; } if (pmii->mask & MIIM_ID) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -