⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ppmenu.cpp

📁 基于ARM平台的控制系统,自己带有MINIGUI,可以直接在VC下运行界面演示程序
💻 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 + -