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

📄 cmmenu.cpp

📁 本程序是一个最近邻分类算法的演示程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"
#include "CMMenu.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
IMPLEMENT_CMMENU(CMMenu, CMenu);
CMMenu::CMMenu()
{
  mrectex.top=29;mrectex.bottom=48;mrectex.left=279;mrectex.right=1023;	
  FMouse1=false;FMouse2=false;FMouse3=false;FMouse4=false;
  Seticon();
}

CMMenu::~CMMenu()
{
	
}
BOOL CMMenu::AttachMenu(HMENU hMenu)
{
	Attach(hMenu);
	ChangeMenuStyle(hMenu, TRUE);
    return TRUE;
}
BOOL	CMMenu::ChangeMenuStyle(HMENU hMenu, BOOL bTop = FALSE)
{
     CMenu *pMenu = CMenu::FromHandle(hMenu);
	if(pMenu != NULL)
	{
		UINT j= pMenu->GetMenuItemCount(); 
		for(UINT i = 0; i < pMenu->GetMenuItemCount(); i ++)
		{
			CMenuItemContext *lpMenu = new CMenuItemContext;
			lpMenu->nMenuID = pMenu->GetMenuItemID(i);
			if(lpMenu->nMenuID < 0 && bTop)
			{
				lpMenu->nMenuID = -2;
			}
			pMenu->GetMenuString(i, lpMenu->strText, MF_BYPOSITION);
	
			pMenu->ModifyMenu(i, MF_BYPOSITION | MF_OWNERDRAW,
				lpMenu->nMenuID,LPCTSTR(lpMenu));//LPCTSTR(lpMenu)
			CMenu *pSubMenu = pMenu->GetSubMenu(i);
			if(pSubMenu && lpMenu->nMenuID != -2 && !bTop)
			{
				lpMenu->nMenuID = -1;
			}
			if(pSubMenu)
			{
				ChangeMenuStyle(pSubMenu->GetSafeHmenu());
			}
		}
	}
	return TRUE;
}
void	CMMenu::MeasureItem(LPMEASUREITEMSTRUCT lpMIS)
{	
	lpMIS->itemWidth = 180;
	lpMIS->itemHeight = 34;
	UINT nMenuID= ((CMenuItemContext*)(lpMIS->itemData))->nMenuID;
	switch(nMenuID)
	{
	case -2:
		lpMIS->itemWidth =((CMenuItemContext*)(lpMIS->itemData))->strText.GetLength()*6;
        
		break;
	case -1: 
		lpMIS->itemWidth =((CMenuItemContext*)(lpMIS->itemData))->strText.GetLength()*10;
		break;
	case 0:
		lpMIS->itemHeight =10;
		break;
	default:
	
		break;	
	}
}
void	CMMenu::DrawBestRect(CDC *pDC, CRect rect, COLORREF cr1,COLORREF cr2, BOOL bHor)
{
	int r1 = GetRValue(cr1);//Red color1
	int g1 = GetGValue(cr1);//Green color1
	int b1 = GetBValue(cr1);//blue color1
	int r2 = GetRValue(cr2);//red color2
	int g2 = GetGValue(cr2);//green color2
	int b2 = GetBValue(cr2);//blue color2
	if(bHor)
	{
		float dr = ((float)(r2 - r1))/(float)(rect.Width());
		float dg = ((float)(g2 - g1))/(float)(rect.Width());
		float db = ((float)(b2 - b1))/(float)(rect.Width());
		for(int i = rect.left; i < rect.right; i ++)
		{
			int r = r1 + (int)(dr*((float)(i - rect.left)));
			int g = g1 + (int)(dg*((float)(i - rect.left)));
			int b = b1 + (int)(db*((float)(i - rect.left)));
			CPen pen(PS_SOLID, 1, RGB(r, g, b));
			CPen *old = pDC->SelectObject(&pen);
			pDC->MoveTo(i, rect.top);
			pDC->LineTo(i, rect.bottom);
			pDC->SelectObject(old);
		}
	}
	else
	{
		float dr = ((float)(r2 - r1))/(float)(rect.Height());
		float dg = ((float)(g2 - g1))/(float)(rect.Height());
		float db = ((float)(b2 - b1))/(float)(rect.Height());
		for(int i = rect.top; i < rect.bottom; i ++)
		{
			int r = r1 + (int)(dr*((float)(i - rect.top)));
			int g = g1 + (int)(dg*((float)(i - rect.top)));
			int b = b1 + (int)(db*((float)(i - rect.top)));
			CPen pen(PS_SOLID, 1, RGB(r, g, b));
			CPen *old = pDC->SelectObject(&pen);
			pDC->MoveTo(rect.left, i);
			pDC->LineTo(rect.right, i);
			pDC->SelectObject(old);
		}
	}
}
void	CMMenu::DrawTop(CDC *pDC,CRect rect,int i,BOOL bSelected)
{	
               
	if(bSelected)
	{
		
		pDC->SelectStockObject(BLACK_PEN);
	
		pDC->Rectangle(&rect);//a rectangle
		rect.DeflateRect(1, 1);
		CRect rectst1,rectst2,rectst3,rectst4;
        rectst1.left=rect.left;
        rectst1.top=rect.top;
        rectst1.bottom =rect.bottom;
		rectst1.right=rectst1.left+rect.Width()/4;
        pDC->FillSolidRect(&rectst1, RGB(255, 242, 200));
        rectst2.left=	rectst1.right;
        rectst2.top=rect.top;
        rectst2.bottom =rect.bottom;
		rectst2.right=rectst2.left+rect.Width()/4;
        pDC->FillSolidRect(&rectst2, RGB(255, 238, 196));
        rectst3.left=	rectst2.right;
        rectst3.top=rect.top;
        rectst3.bottom =rect.bottom;
		rectst3.right=rectst3.left+rect.Width()/4;
        pDC->FillSolidRect(&rectst3, RGB(255, 234, 192));
        rectst4.left=	rectst3.right;
        rectst4.top=rect.top;
        rectst4.bottom =rect.bottom;
		rectst4.right=rect.right;
        pDC->FillSolidRect(&rectst4, RGB(255, 230, 189));
        CRect recttemp;
        recttemp.left=mrectex.left;
		for(int i=0;i<=3;i++)
		{
            
			recttemp.top=mrectex.top;
            recttemp.bottom=mrectex.bottom;
            recttemp.left=mrectex.Width()/4*i+recttemp.left;
            recttemp.right=recttemp.left+mrectex.Width();
			pDC->FillSolidRect(&recttemp,RGB(194+2*i,218+2*i,249));
		}
       recttemp.left=recttemp.right;
       recttemp.right=mrectex.right;
	   pDC->FillSolidRect(&recttemp,RGB(200,224,249));
       CRect roundrect2;
      roundrect2.top=mrectex.top;
       roundrect2.bottom=mrectex.bottom;
       roundrect2.right=mrectex.right-70;
       roundrect2.left=mrectex.right-30;
	   pDC->DrawState(roundrect2.TopLeft(), 
	               roundrect2.Size(), 
				        SMicon, 
				         DSS_NORMAL, 
                 (CBrush*)NULL);
	}
	else
	{
		CRect rcGray(rect);
	    int j;
		switch(i)
		{
		case 1:
			for(j=0;j<4;j++)
			{
              rcGray.left=rect.left+rect.Width()*j/4;
              rcGray.right=rcGray.left+rect.Width()/4;
              pDC->FillSolidRect(&rcGray,RGB(168+2*j,188+2*j,249));
			}
           rcGray.left=rcGray.right;
           rcGray.right=rect.right;
           pDC->FillSolidRect(&rcGray,RGB(168+2*j,188+2*j,249));
		   break;
        case 2:
			for(j=0;j<4;j++)
			{
              rcGray.left=rect.left+rect.Width()*j/4;
              rcGray.right=rcGray.left+rect.Width()/4;
              pDC->FillSolidRect(&rcGray,RGB(178+2*j,194+2*j,249));
			}
           rcGray.left=rcGray.right;
           rcGray.right=rect.right;
           pDC->FillSolidRect(&rcGray,RGB(178+2*3,194+2*3,249));
		   break;
        case 3:
			for(j=0;j<4;j++)
			{
              rcGray.left=rect.left+rect.Width()*j/4;
              rcGray.right=rcGray.left+rect.Width()/4;
              pDC->FillSolidRect(&rcGray,RGB(184+2*j,200+2*j,249));
			}
           rcGray.left=rcGray.right;
           rcGray.right=rect.right;
           pDC->FillSolidRect(&rcGray,RGB(184+2*3,200+2*3,249));
		   break;
       case 4:
			for(j=0;j<4;j++)
			{
              rcGray.left=rect.left+rect.Width()*j/4;
              rcGray.right=rcGray.left+rect.Width()/4;
              pDC->FillSolidRect(&rcGray,RGB(192+2*j,206+2*j,249));
			}
           rcGray.left=rcGray.right;
           rcGray.right=rect.right;
           pDC->FillSolidRect(&rcGray,RGB(192+2*3,206+2*3,249));
		   break;
      
		}
       CRect recttemp;
        recttemp.left=mrectex.left;
         	for(int i=0;i<=3;i++)
		{
            
			recttemp.top=mrectex.top;
            recttemp.bottom=mrectex.bottom;
            recttemp.left=mrectex.Width()/4*i+recttemp.left;
            recttemp.right=recttemp.left+mrectex.Width();
			pDC->FillSolidRect(&recttemp,RGB(202+2*i,218+2*i,249));
		}
       recttemp.left=recttemp.right;
       recttemp.right=mrectex.right;
       pDC->FillSolidRect(&recttemp,RGB(208,224,249));
     CRect roundrect2;
       roundrect2.top=mrectex.top;
       roundrect2.bottom=mrectex.bottom;
       roundrect2.right=mrectex.right-70;
       roundrect2.left=mrectex.right-30;
	   pDC->DrawState(roundrect2.TopLeft(), 
	               roundrect2.Size(), 
				        SMicon, 
				         DSS_NORMAL, 
                 (CBrush*)NULL);
		
	}
}
void	CMMenu::DrawBGColor(CDC* pDC, CRect rect, BOOL bSelected)
{
	if(bSelected)
	{
		pDC->SelectStockObject(NULL_BRUSH);
		pDC->SelectStockObject(BLACK_PEN);
		pDC->Rectangle(&rect);
		rect.DeflateRect(1, 1);
		DrawBestRect(pDC,rect,0xf000,0xff00ff,TRUE);
	}
	else
	{
		CRect rcGray(rect);
		rcGray.right = rcGray.left + 34;
		pDC->FillSolidRect(&rcGray, RGB(0x000000DB, 0x000000D8, 0x000000D1));
		CRect rcWhite(rect);
		rcWhite.left = rcGray.right;
        pDC->FillSolidRect(&rcWhite,RGB(0x000000F9, 0x000000F8, 0x000000F7));
	}
}
void	CMMenu::DrawIcon(CDC* pDC, CRect rect, UINT uIndex, BOOL IsEnabled)
{
	rect.DeflateRect(3, 3, 3, 3);
	UINT	uStyle =ILD_TRANSPARENT;	//CImageList::Draw()绘制位图的风格
	if(IsEnabled)
	{
		uStyle |=ILD_BLEND50;//菜单无效所以位图也要经过处理
	}
	else
	{
		uStyle |=ILD_BLEND25	;
	}
	m_ImageList.Draw(pDC, uIndex, CPoint(rect.left, rect.top), uStyle);
	//	HICON hIcon = m_ImageList.ExtractIcon(uIndex);
}
void	CMMenu::DrawText(CDC* pDC, CRect rect, CString sText,BOOL Tflag)
{
	rect.DeflateRect(8,0,0,0);
    if(Tflag)
	pDC->SetTextColor(RGB(0,0,146));
	else

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -