📄 ppmenu.cpp
字号:
#include "GUIpp.h"
#include "Glib.h"
#include "ppMenu.h"
#if _USE_GUI == 1
NANARect NANAMenu::GetPopupRect(NANAWnd * pDockWnd, int nWidth,int nHeight, int nAlign)
{
NANARect rcMenu;
NANARect rc;
pDockWnd->GetWindowRect(&rc);
if(nAlign & MENU_ALIGN_HOR_LEFT){
if(nAlign & MENU_ALIGN_HOR_INNER){
rcMenu.w_nX1= rc.w_nX1;
}
if(nAlign & MENU_ALIGN_HOR_OUTER){
rcMenu.w_nX1= rc.w_nX1- nWidth;
}
}
if(nAlign & MENU_ALIGN_HOR_RIGHT){
if(nAlign & MENU_ALIGN_HOR_INNER){
rcMenu.w_nX1= rc.w_nX2- nWidth;
}
if(nAlign & MENU_ALIGN_HOR_OUTER){
rcMenu.w_nX1= rc.w_nX2;
}
}
if(nAlign & MENU_ALIGN_VER_TOP){
if(nAlign & MENU_ALIGN_VER_INNER){
rcMenu.w_nY1= rc.w_nY1;
}
if(nAlign & MENU_ALIGN_VER_OUTER){
rcMenu.w_nY1= rc.w_nY1- nHeight;
}
}
if(nAlign & MENU_ALIGN_VER_BOTTOM){
if(nAlign & MENU_ALIGN_VER_INNER){
rcMenu.w_nY1= rc.w_nY2- nHeight;
}
if(nAlign & MENU_ALIGN_VER_OUTER){
rcMenu.w_nY1= rc.w_nY2;
}
}
if((rcMenu.w_nX1 + nWidth)>=SCREEN_WIDTH)
{
rcMenu.w_nX1=SCREEN_WIDTH-1 - nWidth;
}
if(rcMenu.w_nX1<0)
{
rcMenu.w_nX1= 0;
}
if((rcMenu.w_nY1 + nHeight)>=SCREEN_HEIGHT)
{
rcMenu.w_nY1 = SCREEN_HEIGHT-1 - nHeight;
}
if(rcMenu.w_nY1 < 0)
{
rcMenu.w_nY1 = 0;
}
rcMenu.w_nX2 = rcMenu.w_nX1 + nWidth;
rcMenu.w_nY2 = rcMenu.w_nY1 + nHeight;
return rcMenu;
}
void NANAMenu::DrawBlackIconItem(int nStartX,int nStartY,int nWidth , NANAMenuItem * pMenuItem,int nSelected,int nPressed)
{
int nHeight;
int nX;
int nBitMapSize;
if((w_font->GBFontSize == 16) || (w_font->GBFontSize == 12))
{
nHeight = 16+MENU_ITEM_TOP_MARGEN+MENU_ITEM_BOTTOM_MARGEN;
nBitMapSize = 16;
}else if(w_font->GBFontSize == 24)
{
nHeight = 24+MENU_ITEM_TOP_MARGEN+MENU_ITEM_BOTTOM_MARGEN;
nBitMapSize = 24;
}
if(nSelected)
{
if(nPressed){
Rect(nStartX+1,nStartY+1,nStartX+nWidth,nStartY+nHeight-1,COLOR_BORDER,COLOR_BKGROUND);
nX = nStartX + MENU_ITEM_ICON_LEFT_MARGEN;
if(pMenuItem->w_icon != 0)
{
DrawICON(pMenuItem->w_icon,nX,nStartY + MENU_ITEM_TOP_MARGEN,0);
}
else
{
RectFill(nX,nStartY + MENU_ITEM_TOP_MARGEN, nX+nBitMapSize,nStartY + MENU_ITEM_TOP_MARGEN+nBitMapSize ,0);
}
nX += nBitMapSize+MENU_ITEM_ICON_RIGHT_MARGEN;
TextPrint(
pMenuItem->w_strCaption,
nX + MENU_ITEM_TEXT_LEFT_MARGEN,
nStartY + MENU_ITEM_TOP_MARGEN,
w_font,1);
}
else
{
Rect(nStartX+1,nStartY+1,nStartX+nWidth,nStartY+nHeight-1,COLOR_BORDER,COLOR_BKGROUND);
nX = nStartX+MENU_ITEM_ICON_LEFT_MARGEN;
if(pMenuItem->w_icon!=0)
{
DrawICON(pMenuItem->w_icon,nX - 1,nStartY + MENU_ITEM_TOP_MARGEN - 1,0);
}
nX += nBitMapSize+MENU_ITEM_ICON_RIGHT_MARGEN;
TextPrint(
pMenuItem->w_strCaption,
nX + MENU_ITEM_TEXT_LEFT_MARGEN - 1,
nStartY + MENU_ITEM_TOP_MARGEN - 1,
w_font,1);
}
}
else
{
// 非选中状态
RectFill(nStartX,nStartY, nStartX+nWidth,nStartY+nHeight,0);
nX = nStartX + MENU_ITEM_ICON_LEFT_MARGEN;
if(pMenuItem->w_icon!=0)
{
DrawICON(pMenuItem->w_icon,nX,nStartY+MENU_ITEM_TOP_MARGEN,1);
}
else
{
RectFill(nX,nStartY + MENU_ITEM_TOP_MARGEN, nX+nBitMapSize,nStartY + MENU_ITEM_TOP_MARGEN+nBitMapSize ,0);
}
nX += nBitMapSize+MENU_ITEM_ICON_RIGHT_MARGEN;
RectFill(nX,nStartY,nX+nWidth+nStartX-nX,nStartY+nHeight,1);
TextPrint(
pMenuItem->w_strCaption,
nX + MENU_ITEM_TEXT_LEFT_MARGEN,
nStartY + MENU_ITEM_TOP_MARGEN,
w_font,0);
}
}
void NANAMenu::DrawItem(int nStartX,int nStartY,int nWidth , NANAMenuItem * pMenuItem,int nSelected,int nPressed)
{
int nHeight;
int nX;
int nBitMapSize;
if((w_font->GBFontSize == 16) || (w_font->GBFontSize == 12))
{
nHeight = 16+MENU_ITEM_TOP_MARGEN+MENU_ITEM_BOTTOM_MARGEN;
nBitMapSize = 16;
}else if(w_font->GBFontSize == 24)
{
nHeight = 24+MENU_ITEM_TOP_MARGEN+MENU_ITEM_BOTTOM_MARGEN;
nBitMapSize = 24;
}
if(nSelected)
{
if(nPressed){
RectFill(nStartX,nStartY, nStartX+nWidth+2,nStartY+nHeight,COLOR_SHADOW);
nX = nStartX + MENU_ITEM_ICON_LEFT_MARGEN;
if(pMenuItem->w_icon!=0)
{
DrawICON(pMenuItem->w_icon,nX,nStartY + MENU_ITEM_TOP_MARGEN,1);
}
nX += nBitMapSize + MENU_ITEM_ICON_RIGHT_MARGEN;
TextPrint(
pMenuItem->w_strCaption,
nX + MENU_ITEM_TEXT_LEFT_MARGEN,
nStartY + MENU_ITEM_TOP_MARGEN,
w_font,1);
}
else
{
RectFill(nStartX,nStartY, nStartX+nWidth + 2,nStartY+nHeight,COLOR_SHADOW);
nX = nStartX+MENU_ITEM_ICON_LEFT_MARGEN;
if(pMenuItem->w_icon!=0)
{
DrawICON(pMenuItem->w_icon,nX - 1,nStartY + MENU_ITEM_TOP_MARGEN - 1,1);
}
nX += nBitMapSize + MENU_ITEM_ICON_RIGHT_MARGEN;
TextPrint(
pMenuItem->w_strCaption,
nX + MENU_ITEM_TEXT_LEFT_MARGEN - 1,
nStartY + MENU_ITEM_TOP_MARGEN - 1,
w_font,1);
}
}
else
{
RectFill(nStartX,nStartY, nStartX+nWidth,nStartY+nHeight,COLOR_BKGROUND);
nX = nStartX+MENU_ITEM_ICON_LEFT_MARGEN;
if(pMenuItem->w_icon!=0)
{
DrawICON(pMenuItem->w_icon,nX,nStartY+MENU_ITEM_TOP_MARGEN,0);
}
nX += nBitMapSize+MENU_ITEM_ICON_RIGHT_MARGEN;
TextPrint(
pMenuItem->w_strCaption,
nX + MENU_ITEM_TEXT_LEFT_MARGEN,
nStartY + MENU_ITEM_TOP_MARGEN,
w_font,0);
}
}
NANAMenu::NANAMenu():w_MenuItemHead(NULL,0,0,NULL),w_MenuItemTail(NULL,0,0,NULL)
{
w_MenuItemHead.InsertAfter(&w_MenuItemTail);
w_nTotalItem = 0;
w_nPressed = 0;
w_nSelectedItem = 0;
w_style = MENU_STYLE_NORMAL;
w_font = &NANA_FONT12;
}
void NANAMenu::SetStyle(int nStyle,NANA_FONT font)
{
w_style = nStyle;
w_font = font;
}
void NANAMenu::Show(NANAFrameWnd *pNotifyWnd,NANAWnd *pDockWnd,int nAlign)
{
NANARect rcMenu;
NANAMenuItem *pItem;
int nWidth,nHeight;
int nMaxWidth;
int i;
w_pNotifyWnd = pNotifyWnd;
w_nPressed = 0;
w_nSelectedItem = 0;
w_nAlign = nAlign;
//求出菜单的宽度和高度
nMaxWidth = 0;
nHeight = MENU_TOP_MARGEN+MENU_BOTTOM_MARGEN;
pItem = (NANAMenuItem *)w_MenuItemHead.GetNextNode(1);
for(i=0;i<w_nTotalItem;i++)
{
nWidth = MENU_ITEM_ICON_LEFT_MARGEN + MENU_ITEM_ICON_RIGHT_MARGEN;
if((w_font->GBFontSize == 16) || (w_font->GBFontSize == 12))
{
nHeight += 16+MENU_ITEM_TOP_MARGEN+MENU_ITEM_BOTTOM_MARGEN;
nWidth += 16;
}else if(w_font->GBFontSize == 24)
{
nHeight += 24+MENU_ITEM_TOP_MARGEN+MENU_ITEM_BOTTOM_MARGEN;
nWidth += 24;
}
nWidth += GetTextWidth((pItem->w_strCaption),w_font,-1);
nWidth += MENU_ITEM_TEXT_RIGHT_MARGEN + MENU_ITEM_TEXT_LEFT_MARGEN;
//求出最大宽度作为菜单的宽度
if (nWidth>nMaxWidth)
{
nMaxWidth = nWidth;
}
pItem = (NANAMenuItem *)pItem->GetNextNode(1);
}
nMaxWidth += MENU_SHADOW_SIZE;
nHeight += MENU_SHADOW_SIZE;
//求出弹出的位置
rcMenu = GetPopupRect(pDockWnd,nMaxWidth,nHeight,w_nAlign);
//弹出菜单
CreateWnd(NULL,rcMenu.w_nX1,rcMenu.w_nY1,rcMenu.GetWidth(),rcMenu.GetHeight());
//Capture the mouse
CaptureMouse();
}
void NANAMenu::AddItem(const char *pStrCaption,int nIcon,int nStyle,NANAMenu * pSubMenu)
{
NANAMenuItem *pItem = new NANAMenuItem(pStrCaption,nIcon,nStyle,pSubMenu);
DEBUG_Assert( pItem );
w_MenuItemTail.InsertBefore(pItem);
w_nTotalItem ++;
}
void NANAMenu::OnPaint()
{
NANAMenuItem * pItem;
NANARect rc;
int i;
GetWindowRect(&rc);
rc.w_nX2 -= MENU_SHADOW_SIZE;
rc.w_nY2 -= MENU_SHADOW_SIZE;
DrawVerticalLine(rc.w_nX2,rc.w_nY1+MENU_SHADOW_SIZE,rc.GetHeight(),MENU_SHADOW_SIZE);
DrawHorizontalLine(rc.w_nX1+MENU_SHADOW_SIZE,rc.w_nY2,rc.GetWidth(),MENU_SHADOW_SIZE);
Rect(rc.w_nX1,rc.w_nY1,rc.w_nX2,rc.w_nY2,COLOR_BORDER,COLOR_BKGROUND);
//ButtonFrame(rc.x1,rc.y1,rc.x2-rc.x1,rc.y2-rc.y1,0);
rc.w_nY1 += MENU_TOP_MARGEN;
pItem = (NANAMenuItem *)w_MenuItemHead.GetNextNode(1);
for(i=0;i<w_nTotalItem;i++)
{
if(w_style & MENU_STYLE_BLACKICON)
{
DrawBlackIconItem(
rc.w_nX1+1,rc.w_nY1,rc.w_nX2-rc.w_nX1-3,pItem,
(i==w_nSelectedItem),
w_nPressed);
}else
{
DrawItem(rc.w_nX1+1,rc.w_nY1,rc.w_nX2-rc.w_nX1-3,pItem,
(i==w_nSelectedItem),
w_nPressed);
}
if(w_font->GBFontSize == 16 || w_font->GBFontSize == 12)
{
rc.w_nY1 += 16+MENU_ITEM_TOP_MARGEN+MENU_ITEM_BOTTOM_MARGEN;
}else if(w_font->GBFontSize == 24)
{
rc.w_nY1 += 24+MENU_ITEM_TOP_MARGEN+MENU_ITEM_BOTTOM_MARGEN;
}
pItem = (NANAMenuItem *)pItem->GetNextNode(1);
}
}
void NANAMenu::OnKey(int nKeyCode,int bKeyDown)
{
if (bKeyDown == MSGCODE_KEY_DOWN)
{
switch(nKeyCode)
{
case MENU_KEY_OK:
w_nPressed = 1;
SetUIDirty(1);
break;
}
}
else if(bKeyDown == MSGCODE_KEY_UP)
{
if(w_nPressed)
{
w_nPressed = 0;
SetUIDirty(1);
}
switch(nKeyCode)
{
case MENU_KEY_UP:
w_nSelectedItem=(w_nSelectedItem-1);
if(w_nSelectedItem<0)
{
w_nSelectedItem = w_nTotalItem - 1;
}
SetUIDirty(1);
break;
case MENU_KEY_DOWN:
w_nSelectedItem=(w_nSelectedItem+1);
if(w_nSelectedItem>=w_nTotalItem)
{
w_nSelectedItem = 0;
}
SetUIDirty(1);
break;
case MENU_KEY_OK:
NotifyWindow(w_pNotifyWnd, UGNC_CLICK, w_nSelectedItem , 0);
CloseWindow();
break;
case MENU_KEY_CANCEL:
CloseWindow();
break;
}
}
}
void NANAMenu::OnMouseDown(int x,int y)
{
int nItemHeight;
if( w_Rect.IsPointInside(x,y) )
{
nItemHeight = w_Rect.GetHeight()/w_nTotalItem;
w_nSelectedItem = (y - w_Rect.w_nY1)/nItemHeight;
SetUIDirty(1);
}
}
void NANAMenu::OnMouseUp(int x,int y)
{
int nItemHeight;
if( !(w_Rect.IsPointInside(x,y)) )
{
ReleaseMouse();
CloseWindow();
}else{
nItemHeight = w_Rect.GetHeight()/w_nTotalItem;
w_nSelectedItem = (y - w_Rect.w_nY1)/nItemHeight;
NotifyWindow(w_pNotifyWnd, UGNC_CLICK, w_nSelectedItem , 0);
ReleaseMouse();
CloseWindow();
}
//NotifyWindow(w_pNotifyWnd, MENU_NOTIFY_MESSAGE, w_nSelectedItem , 0);
//CloseWindow();
}
void NANAMenu::OnMouseMove(int x,int y)
{
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -