📄 menu.c
字号:
if (bCount == 0) { bCount = _MENU_GetCountForUpItem(_pMENUSubMenu[hMenu], _Cursor[hMenu].bSubMenuIndex); if (bCount > 0) { _Cursor[hMenu].bSubMenuIndex -= bCount; } } else { _Cursor[hMenu].bSubMenuIndex += bCount; } _pMENUSubMenu[hMenu]->bDefaultCursorPos = _Cursor[hMenu].bSubMenuIndex; _MENU_SetSubMenuInitialDisplay(hMenu); } //Fill rectangle _MENU_GetSubMenuDisplayRect(hMenu, &MENURect); MENURect.bColor = MENU_PALETTE_ENTRY_GENERAL_BACKGROUND; GDI_FillRect(0, &MENURect); //Fill frame _MENU_DrawFrame(MENU_SUB_MENU, hMenu); //Draw separate frame if (_SubMenuDisplay[hMenu].bUpMark == TRUE) { _MENU_DrawSeparateFrame(MENU_SUB_MENU, hMenu, MENU_UP_SEPARATE_FRAME); _MENU_UpdateUpDownArraow(MENU_SUB_MENU, hMenu, MENU_ARROW_TYPE_UP); } if (_SubMenuDisplay[hMenu].bDownMark == TRUE) { _MENU_DrawSeparateFrame(MENU_SUB_MENU, hMenu, MENU_DOWN_SEPARATE_FRAME); _MENU_UpdateUpDownArraow(MENU_SUB_MENU, hMenu, MENU_ARROW_TYPE_DOWN); } wMenuWidth = _MENU_GetMenuWidth(_pMENUSubMenu[hMenu]); MENUStringAttr.bTextColor = MENU_PALETTE_ENTRY_ITEM_TEXT; MENUStringAttr.bBackground = MENU_PALETTE_ENTRY_GENERAL_BACKGROUND; MENUStringAttr.bColorKey = 0; if (_pMENUSubMenu[hMenu]->bTotalItem <= _SubMenuDisplay[hMenu].bMaxVisibleItem) { bDisplayItemNum = _pMENUSubMenu[hMenu]->bTotalItem; } else { bDisplayItemNum = _SubMenuDisplay[hMenu].bMaxVisibleItem; } for (bMenuIndex = 0; bMenuIndex < bDisplayItemNum; bMenuIndex++) { if (_pMENUSubMenu[hMenu]->pMenuItem[bMenuIndex+(_SubMenuDisplay[hMenu].bStartDrawItem)].bAttribute == MENU_ITEM_STATE_DISABLE) { MENUStringAttr.bTextColor = MENU_PALETTE_ENTRY_ITEM_GRAYED; } else { MENUStringAttr.bTextColor = MENU_PALETTE_ENTRY_ITEM_TEXT; } if (_pMENUSubMenu[hMenu]->bMenuType == MENU_TYPE_NUM) { OSDUTL_PrepareOutputString(); OSDUTL_OutputNumFromIndex(_pMENUSubMenu[hMenu]->wStartNum+_SubMenuDisplay[hMenu].bStartDrawItem+bMenuIndex); _MENU_CopyString(); MENUStringAttr.wX = _MENU_GetStringStartH(MENU_SUB_MENU, hMenu, __pOSDUTLOutputString); MENUStringAttr.wY = _MENU_GetSubMenuNormalStartV(hMenu) + MENU_STRING_DISTANCE_V+bMenuIndex*MENU_ITEM_HEIGHT+((MENU_ITEM_HEIGHT-GDI_GetStringHeight(__pOSDUTLOutputString)) >> 1); GDI_DrawString_909(0, &MENUStringAttr, __wMENUStringBuf); } else { MENUStringAttr.wX = _MENU_GetStringStartH(MENU_SUB_MENU, hMenu, _pMENUSubMenu[hMenu]->pMenuItem[bMenuIndex+(_SubMenuDisplay[hMenu].bStartDrawItem)].pwItemText); MENUStringAttr.wY = _MENU_GetSubMenuNormalStartV(hMenu) + MENU_STRING_DISTANCE_V + bMenuIndex*MENU_ITEM_HEIGHT+((MENU_ITEM_HEIGHT-GDI_GetStringHeight(_pMENUSubMenu[hMenu]->pMenuItem[bMenuIndex+(_SubMenuDisplay[hMenu].bStartDrawItem)].pwItemText)) >> 1);; GDI_DrawString_909(0, &MENUStringAttr, _pMENUSubMenu[hMenu]->pMenuItem[bMenuIndex+(_SubMenuDisplay[hMenu].bStartDrawItem)].pwItemText); } //Draw check symbol if (_pMENUSubMenu[hMenu]->bCheckMenuItemPos != MENU_ITEM_NO_CHECKED_ITEM) { if ((bMenuIndex+_SubMenuDisplay[hMenu].bStartDrawItem) == _pMENUSubMenu[hMenu]->bCheckMenuItemPos) { MENUStringAttr.wX = MENURect.rect.wLeft + MENU_STRING_DISTANCE_H; MENUStringAttr.wY = _MENU_GetSubMenuNormalStartV(hMenu) + MENU_STRING_DISTANCE_V + bMenuIndex*MENU_ITEM_HEIGHT+((MENU_ITEM_HEIGHT-GDI_GetStringHeight(aMENUCheckSymbol)) >> 1); GDI_DrawString_909(0, &MENUStringAttr, aMENUCheckSymbol); } } } }}WORD _MENU_GetSubMenuNormalStartH(HMENU hMenu){ if (_pMENUSubMenu[hMenu]->wStartX == MENU_START_X_OPTIMIZED) { return _pMENUCurrentMenu[hMenu]->wStartX+_MENU_GetMenuWidth(_pMENUCurrentMenu[hMenu])+MENU_SUBMENU_DISTANCE; } else { return _pMENUSubMenu[hMenu]->wStartX; } }WORD _MENU_GetSubMenuNormalStartV(HMENU hMenu){ if (_pMENUSubMenu[hMenu]->wStartY == MENU_START_Y_OPTIMIZED) { return _pMENUCurrentMenu[hMenu]->wStartY; } else { return _pMENUSubMenu[hMenu]->wStartY; }}void _MENU_GetMainMenuDisplayRect(HMENU hMenu, PARM_RECT *pMENURect){ BYTE bItem; pMENURect->rect.wLeft = _pMENUCurrentMenu[hMenu]->wStartX; pMENURect->rect.wTop = _pMENUCurrentMenu[hMenu]->wStartY; pMENURect->rect.wRight = _pMENUCurrentMenu[hMenu]->wStartX+_MENU_GetMenuWidth(_pMENUCurrentMenu[hMenu])-1; if ((_MainMenuDisplay[hMenu].bUpMark == TRUE) || (_MainMenuDisplay[hMenu].bDownMark == TRUE)) { bItem = _MainMenuDisplay[hMenu].bMaxVisibleItem; } else { bItem = _pMENUCurrentMenu[hMenu]->bTotalItem; } pMENURect->rect.wBottom = _pMENUCurrentMenu[hMenu]->wStartY+bItem*MENU_ITEM_HEIGHT+MENU_STRING_DISTANCE_V*2-1; if (_MainMenuDisplay[hMenu].bUpMark == TRUE) { pMENURect->rect.wTop -= MENU_SEPARATE_FRAME_THICKNESS; pMENURect->rect.wTop -= MENU_UP_DOWN_ITEM_HEIGHT; } if (_MainMenuDisplay[hMenu].bDownMark == TRUE) { pMENURect->rect.wBottom += MENU_SEPARATE_FRAME_THICKNESS; pMENURect->rect.wBottom += MENU_UP_DOWN_ITEM_HEIGHT; } }void _MENU_GetSubMenuDisplayRect(HMENU hMenu, PARM_RECT *pMENURect){ BYTE bItem; pMENURect->rect.wLeft = _MENU_GetSubMenuNormalStartH(hMenu); pMENURect->rect.wTop = _MENU_GetSubMenuNormalStartV(hMenu); pMENURect->rect.wRight = pMENURect->rect.wLeft + _MENU_GetMenuWidth(_pMENUSubMenu[hMenu]) - 1; if ((_SubMenuDisplay[hMenu].bUpMark == TRUE) || (_SubMenuDisplay[hMenu].bDownMark == TRUE)) { bItem = _SubMenuDisplay[hMenu].bMaxVisibleItem; } else { bItem = _pMENUSubMenu[hMenu]->bTotalItem; } pMENURect->rect.wBottom = _MENU_GetSubMenuNormalStartV(hMenu)+bItem*MENU_ITEM_HEIGHT+MENU_STRING_DISTANCE_V*2-1; if (_SubMenuDisplay[hMenu].bUpMark == TRUE) { pMENURect->rect.wTop -= MENU_SEPARATE_FRAME_THICKNESS; pMENURect->rect.wTop -= MENU_UP_DOWN_ITEM_HEIGHT; } if (_SubMenuDisplay[hMenu].bDownMark == TRUE) { pMENURect->rect.wBottom += MENU_SEPARATE_FRAME_THICKNESS; pMENURect->rect.wBottom += MENU_UP_DOWN_ITEM_HEIGHT; } }void _MENU_DrawFrame(BYTE bMenuMode, HMENU hMenu){ PARM_RECT MENURect; PARM_FRAME MENUFrame; if (bMenuMode == MENU_MAIN_MENU) { _MENU_GetMainMenuDisplayRect(hMenu, &MENURect); } else if (bMenuMode == MENU_SUB_MENU) { _MENU_GetSubMenuDisplayRect(hMenu, &MENURect); } MENUFrame.rect.wTop = MENURect.rect.wTop - MENU_FRAME_THICKNESS; MENUFrame.rect.wBottom = MENURect.rect.wBottom + MENU_FRAME_THICKNESS; MENUFrame.rect.wLeft = MENURect.rect.wLeft - MENU_FRAME_THICKNESS; MENUFrame.rect.wRight = MENURect.rect.wRight + MENU_FRAME_THICKNESS; MENUFrame.bColorBright = MENU_PALETTE_ENTRY_NORMAL_FRAME_BRIGHT; MENUFrame.bColorDark = MENU_PALETTE_ENTRY_NORMAL_FRAME_DARK; MENUFrame.bColorCenter = MENU_PALETTE_ENTRY_NORMAL_FRAME_CENTER; MENUFrame.bStyle = FRAME_POP_SOLID; //FRAME_DOUBLE; MENUFrame.bThickness = MENU_FRAME_THICKNESS; GDI_DrawFrame_909(0, &MENUFrame);}void _MENU_ShowMainMenu(HMENU hMenu){ BYTE bMenuIndex; PARM_RECT MENURect; PARM_DRAW_STRING MENUStringAttr; BYTE bDisplayItemNum; BYTE bCount; if (_pMENUCurrentMenu[hMenu]->pMenuItem[_Cursor[hMenu].bMainMenuIndex].bAttribute == MENU_ITEM_STATE_DISABLE) { bCount = _MENU_GetCountForDownItem(_pMENUCurrentMenu[hMenu], _Cursor[hMenu].bMainMenuIndex); if (bCount == 0) { bCount = _MENU_GetCountForUpItem(_pMENUCurrentMenu[hMenu], _Cursor[hMenu].bMainMenuIndex); if (bCount > 0) { _Cursor[hMenu].bMainMenuIndex -= bCount; } } else { _Cursor[hMenu].bMainMenuIndex += bCount; } _pMENUCurrentMenu[hMenu]->bDefaultCursorPos = _Cursor[hMenu].bMainMenuIndex; _MENU_SetMainMenuInitialDisplay(hMenu); } //Fill rectangle MENURect.bColor = MENU_PALETTE_ENTRY_GENERAL_BACKGROUND; _MENU_GetMainMenuDisplayRect(hMenu, &MENURect); GDI_FillRect(0, &MENURect); //Fill frame _MENU_DrawFrame(MENU_MAIN_MENU, hMenu); //Draw separate frame if (_MainMenuDisplay[hMenu].bUpMark == TRUE) { _MENU_DrawSeparateFrame(MENU_MAIN_MENU, hMenu, MENU_UP_SEPARATE_FRAME); _MENU_UpdateUpDownArraow(MENU_MAIN_MENU, hMenu, MENU_ARROW_TYPE_UP); } if (_MainMenuDisplay[hMenu].bDownMark == TRUE) { _MENU_DrawSeparateFrame(MENU_MAIN_MENU, hMenu, MENU_DOWN_SEPARATE_FRAME); _MENU_UpdateUpDownArraow(MENU_MAIN_MENU, hMenu, MENU_ARROW_TYPE_DOWN); } //Draw String MENUStringAttr.bBackground = MENU_PALETTE_ENTRY_GENERAL_BACKGROUND; //PAL_ENTRY_COLOR_TRANSPARENT; //Set the color of background is the same as color key. MENUStringAttr.bColorKey = 0; MENUStringAttr.bShadow1 = PAL_ENTRY_COLOR_TRANSPARENT; //Use OSDDSPLY_LD_PALETTE_ENTRY_GENERAL_BACKGROUND to prevent the "Open Folder" icon is wrong. MENUStringAttr.bShadow2 = PAL_ENTRY_COLOR_TRANSPARENT; //Use OSDDSPLY_LD_PALETTE_ENTRY_GENERAL_BACKGROUND to prevent the "Open Folder" icon is wrong. if (_pMENUCurrentMenu[hMenu]->bTotalItem <= _MainMenuDisplay[hMenu].bMaxVisibleItem) { bDisplayItemNum = _pMENUCurrentMenu[hMenu]->bTotalItem; } else { bDisplayItemNum = _MainMenuDisplay[hMenu].bMaxVisibleItem; } for (bMenuIndex = 0; bMenuIndex < bDisplayItemNum; bMenuIndex++) { if (_pMENUCurrentMenu[hMenu]->pMenuItem[bMenuIndex+(_MainMenuDisplay[hMenu].bStartDrawItem)].bAttribute == MENU_ITEM_STATE_DISABLE) { MENUStringAttr.bTextColor = MENU_PALETTE_ENTRY_ITEM_GRAYED; } else { MENUStringAttr.bTextColor = MENU_PALETTE_ENTRY_ITEM_TEXT; } MENUStringAttr.wX = _MENU_GetStringStartH(MENU_MAIN_MENU, hMenu, _pMENUCurrentMenu[hMenu]->pMenuItem[bMenuIndex+(_MainMenuDisplay[hMenu].bStartDrawItem)].pwItemText); MENUStringAttr.wY = _pMENUCurrentMenu[hMenu]->wStartY + MENU_STRING_DISTANCE_V + bMenuIndex*MENU_ITEM_HEIGHT+((MENU_ITEM_HEIGHT-GDI_GetStringHeight(_pMENUCurrentMenu[hMenu]->pMenuItem[bMenuIndex+(_MainMenuDisplay[hMenu].bStartDrawItem)].pwItemText)) >> 1); GDI_DrawString_909(0, &MENUStringAttr, _pMENUCurrentMenu[hMenu]->pMenuItem[bMenuIndex+(_MainMenuDisplay[hMenu].bStartDrawItem)].pwItemText); if (_pMENUCurrentMenu[hMenu]->pMenuItem[bMenuIndex+(_MainMenuDisplay[hMenu].bStartDrawItem)].pSubMenu != NULL) { MENUStringAttr.wX = MENURect.rect.wRight-MENU_STRING_DISTANCE_H-GDI_GetStringWidth_909(aMENUSubMenuSymbol); MENUStringAttr.wY = _pMENUCurrentMenu[hMenu]->wStartY+MENU_STRING_DISTANCE_V+bMenuIndex*MENU_ITEM_HEIGHT+((MENU_ITEM_HEIGHT-GDI_GetStringHeight(aMENUSubMenuSymbol)) >> 1); GDI_DrawString_909(0, &MENUStringAttr, aMENUSubMenuSymbol); } }}void _MENU_DrawSeparateFrame(BYTE bMenuMode, HMENU hMenu, BYTE bFrameType){ PARM_RECT MENURect; if (bMenuMode == MENU_MAIN_MENU) { _MENU_GetMainMenuDisplayRect(hMenu, &MENURect); } else if (bMenuMode == MENU_SUB_MENU) { _MENU_GetSubMenuDisplayRect(hMenu, &MENURect); } if (bFrameType == MENU_UP_SEPARATE_FRAME) { MENURect.rect.wTop = MENURect.rect.wTop+MENU_UP_DOWN_ITEM_HEIGHT; } else if (bFrameType == MENU_DOWN_SEPARATE_FRAME) { MENURect.rect.wTop = MENURect.rect.wBottom-MENU_UP_DOWN_ITEM_HEIGHT-MENU_SEPARATE_FRAME_THICKNESS+1; } MENURect.rect.wBottom = MENURect.rect.wTop+(MENU_SEPARATE_FRAME_THICKNESS >> 1) -1; MENURect.bColor = MENU_PALETTE_ENTRY_NORMAL_FRAME_DARK; GDI_FillRect_909(0, &MENURect); MENURect.rect.wTop = MENURect.rect.wBottom + 1; MENURect.rect.wBottom = MENURect.rect.wTop+(MENU_SEPARATE_FRAME_THICKNESS >> 1) -1; MENURect.bColor = MENU_PALETTE_ENTRY_NORMAL_FRAME_BRIGHT; GDI_FillRect_909(0, &MENURect); }void _MENU_UpdateUpDownArraow(BYTE bMenuMode, HMENU hMenu, BYTE bArrowType){ PARM_DRAW_STRING MENUStringAttr; PARM_RECT MENURect; WORD wMenuWidth = 0; _MENU_SetCommonItemStringAttribute(&MENUStringAttr); if (bMenuMode == MENU_MAIN_MENU) { _MENU_GetMainMenuDisplayRect(hMenu, &MENURect); wMenuWidth = _MENU_GetMenuWidth(_pMENUCurrentMenu[hMenu]); } else if (bMenuMode == MENU_SUB_MENU) { _MENU_GetSubMenuDisplayRect(hMenu, &MENURect); wMenuWidth = _MENU_GetMenuWidth(_pMENUSubMenu[hMenu]); } if (bArrowType == MENU_ARROW_TYPE_UP) { MENUStringAttr.wX = MENURect.rect.wLeft+((wMenuWidth-GDI_GetStringWidth_909(aMENUUpArrowSymbol)) >> 1); MENUStringAttr.wY = MENURect.rect.wTop+((MENU_UP_DOWN_ITEM_HEIGHT-GDI_GetStringHeight_909(aMENUUpArrowSymbol)) >> 1); //Output the "up arraow" GDI_DrawString_909(0, &MENUStringAttr, aMENUUpArrowSymbol); } else if (bArrowType == MENU_ARROW_TYPE_DOWN) { MENUStringAttr.wX = MENURect.rect.wLeft+((wMenuWidth-GDI_GetStringWidth_909(aMENUDownArrowSymbol)) >> 1); MENUStringAttr.wY = MENURect.rect.wBottom-MENU_UP_DOWN_ITEM_HEIGHT+1+((MENU_UP_DOWN_ITEM_HEIGHT-GDI_GetStringHeight_909(aMENUDownArrowSymbol)) >> 1); //Output the "down arraow" GDI_DrawString_909(0, &MENUStringAttr, aMENUDownArrowSymbol); }}void _MENU_SetCommonItemStringAttribute(PARM_DRAW_STRING *pMENUStringAttr){ pMENUStringAttr->bBackground = MENU_PALETTE_ENTRY_GENERAL_BACKGROUND; pMENUStringAttr->bColorKey = 0; pMENUStringAttr->bShadow1 = PAL_ENTRY_COLOR_TRANSPARENT; pMENUStringAttr->bShadow2 = PAL_ENTRY_COLOR_TRANSPARENT; pMENUStringAttr->bTextColor = MENU_PALETTE_ENTRY_ITEM_TEXT; }void _MENU_ClearUpDownArrowBackground(BYTE bMenuMode, HMENU hMenu, BYTE bArrowType){ PARM_RECT MENURect; if (bMenuMode == MENU_MAIN_MENU) { _MENU_GetMainMenuDisplayRect(hMenu, &MENURect); } else if (bMenuMode == MENU_SUB_MENU) { _MENU_GetSubMenuDisplayRect(hMenu, &MENURect); } MENURect.rect.wLeft -= MENU_FRAME_THICKNESS; MENURect.rect.wRight += MENU_FRAME_THICKNESS; if (bArrowType == MENU_ARROW_TYPE_UP) { MENURect.rect.wBottom = MENURect.rect.wTop+MENU_UP_DOWN_ITEM_HEIGHT+MENU_SEPARATE_FRAME_THICKNESS-1; MENURect.rect.wTop = MENURect.rect.wTop-MENU_FRAME_THICKNESS; } else if (bArrowType == MENU_ARROW_TYPE_DOWN) { MENURect.rect.wTop = MENURect.rect.wBottom-MENU_UP_DOWN_ITEM_HEIGHT-MENU_SEPARATE_FRAME_THICKNESS+1; MENURect.rect.wBottom = MENURect.rect.wBottom+MENU_FRAME_THICKNESS; } MENURect.bColor = _bMENUBackgroundColor[hMenu]; GDI_FillRect_909(0, &MENURect); }void _MENU_SetSubMenuInitialDisplay(HMENU hMenu){ //Sub-menu has "Up" mark? if (_pMENUSubMenu[hMenu]->bDefaultCursorPos > (_SubMenuDisplay[hMenu].bMaxVisibleItem-1)) { _SubMenuDisplay[hMenu].bUpMark = TRUE; _SubMenuDisplay[hMenu].bStartDrawItem = _pMENUSubMenu[hMenu]->bDefaultCursorPos-_SubMenuDisplay[hMenu].bMaxVisibleItem+1; } else { _SubMenuDisplay[hMenu].bUpMark = FALSE; _SubMenuDisplay[hMenu].bStartDrawItem = 0; } //Sub-menu has "Down" mark? if ((_SubMenuDisplay[hMenu].bStartDrawItem + _SubMenuDisplay[hMenu].bMaxVisibleItem) < _pMENUSubMenu[hMenu]->bTotalItem) { _SubMenuDisplay[hMenu].bDownMark = TRUE; } else { _SubMenuDisplay[hMenu].bDownMark = FALSE; } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -