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

📄 coolmenu.cpp

📁 (VC)又一个酒店管理系统, (VC)又一个酒店管理系统,(VC)又一个酒店管理系统
💻 CPP
📖 第 1 页 / 共 4 页
字号:
				}
			}

			
			//绘制图标-------------------------------------
			if (bIsGrayed)
			{
				m_iDisabledImageList.Draw(pDC, nIndex, CPoint(rc.left, rc.top), ILD_TRANSPARENT);
			}
			else if(bIsSelected)
			{
				m_iHotImageList.Draw(pDC, nIndex, CPoint(rc.left, rc.top), ILD_TRANSPARENT);
			}
			else
			{
				m_iImageList.Draw(pDC, nIndex, CPoint(rc.left, rc.top), ILD_TRANSPARENT);
			}
		}

		//如果没有图标---------------------------------------
		else 
		{
			// 绘制Check标志-------------------------
			if(bIsChecked)
			{
				rc.InflateRect(-1, 0, 0, -1);

				if(bIsSelected)
				{
					pDC->FillSolidRect(rc,RGB(255,255,255));
					pDC->Draw3dRect(rc, RGB(160,170,210), RGB(160,170,210));
				}
				else
				{
					pDC->FillSolidRect(rc,RGB(235,235,235));
					pDC->Draw3dRect(rc, RGB(160,170,210), RGB(160,170,210));
				}

				//画勾号----------------------------
				pDC->MoveTo(rc.left + 4,  rc.top + 6);
				pDC->LineTo(rc.left + 6,  rc.top + 8);
				pDC->LineTo(rc.left + 11, rc.top + 3);
				pDC->MoveTo(rc.left + 4,  rc.top + 7);
				pDC->LineTo(rc.left + 6,  rc.top + 9);
				pDC->LineTo(rc.left + 11, rc.top + 4);
			}
		}
		//---------结束绘制图标或Check标志>>>
	}

	//扫尾工作-------------------------------------------
	pdc->BitBlt(rect.left + nMenuLogoBarcx, rect.top, rect.Width() - nMenuLogoBarcx, rect.Height(), 
					pDC, rect.left + nMenuLogoBarcx, rect.top, SRCCOPY);
	pDC->SelectObject(&oldfont);
	pDC->SelectObject(oldbitmap);
	if (pDC != NULL) delete pDC;
	if (bitmap != NULL) delete bitmap;

}

void CCoolMenu::DrawMenuBar(CDC *pDC, CRect rect)
{
	rect.right -= 4;
	
//	pDC->FillSolidRect(rect, m_crIconBarColor);
	pDC->Draw3dRect(rect, ::GetSysColor(COLOR_3DDKSHADOW), ::GetSysColor(COLOR_3DDKSHADOW));

	//Draw shadow----------------------------------------->>
	COLORREF oldcolor = ::GetSysColor(COLOR_3DFACE);
	BYTE AlphaArray[] ={90,210, 222, 240};
	
	for (int i = 0; i < 4; i++)
	{
		BYTE newR = GetRValue(oldcolor) * AlphaArray[i] / 255;  
		BYTE newG = GetGValue(oldcolor) * AlphaArray[i] / 255;  
		BYTE newB = GetBValue(oldcolor) * AlphaArray[i] / 255;  
		CPen pen(0, 1, RGB(newR, newG, newB));
		CPen *oldpen = pDC->SelectObject(&pen);
		pDC->MoveTo(rect.right + i, rect.top + i + 3);
		pDC->LineTo(rect.right + i, rect.bottom );
		pDC->SelectObject(oldpen);
	}
}

/*========================================================================
	功能:	绘制光标条
	-----------------------------------------
	rect:	绘制范围
==========================================================================*/
void CCoolMenu::DrawLightBar(CDC *pDC, CRect rect, BOOL bfill)
{
	if (bfill)
	{
		//绘制渐变色----------------------------------------
		FillGradient(pDC, rect, m_crLightBarStartColor, m_crLightBarEndColor);
//		DrawGradsRect(pDC,rect,m_crLightBarStartColor,m_crLightBarEndColor);
	}

	pDC->Draw3dRect(rect, m_crLightBarColor, m_crLightBarColor);
}

/*========================================================================
	功能:	绘制LOGO栏
	--------------------------------------------
	pDC:	设备上下文
	rect:	绘制范围
==========================================================================*/
void CCoolMenu::DrawLogoBar(CDC *pDC, CRect rect)
{
	if (m_szMenuLogo.cx > 0)
	{
		//如果设置了LOGO图片------------------------------------
		if(m_uLogoBmpID != NULL)
		{
			CDC memDC;
			memDC.CreateCompatibleDC(pDC);
			CBitmap bitmap, *oldbitmap;
			bitmap.LoadBitmap(m_uLogoBmpID);
			if (bitmap.GetSafeHandle() != NULL)
			{
				oldbitmap = memDC.SelectObject(&bitmap);
				pDC->BitBlt(rect.left, rect.bottom-m_szMenuLogo.cy, m_szMenuLogo.cx, m_szMenuLogo.cy,
							&memDC, 0, 0, SRCCOPY);	
				memDC.SelectObject(oldbitmap);
				bitmap.DeleteObject();
				memDC.DeleteDC();
				//如果图片比要填充的矩形小,则继续用此图片填充剩下的矩形,直到填满为止----------
				if(rect.Height() > m_szMenuLogo.cy) DrawLogoBar(pDC, CRect(0, 0, rect.right, (rect.Height() - m_szMenuLogo.cy)));
			}
		}

		//如果没有设置LOGO图片,则以渐变色和LOGO字串绘制LOGO栏--
		else 
		{
			//绘制渐变色--------------------------------
			FillGradient(pDC, rect, RGB(90, 90, 90), m_crLogoColor);
					
			//绘制LOGO字串---------------------------------
			CFont	vertFont;
			vertFont.CreateFont(14, 0, 900, 900, FW_BOLD,
				0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
				CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
				DEFAULT_PITCH, "Arial");
			CFont *pOldFont = pDC->SelectObject(&vertFont);
			pDC->SetTextColor(RGB(255, 255, 255));
			pDC->SetBkMode(TRANSPARENT);
			pDC->TextOut(rect.left+3, rect.bottom-4, m_sLogoText);
			pDC->SelectObject(pOldFont);
			vertFont.DeleteObject();
		}
	}
}

/*########################################################################
						-----------------------
							设置菜单LOGO栏	
						-----------------------
  ########################################################################*/

/*========================================================================
	功能:	设置LOGO字串及背景渐变色
==========================================================================*/
void CCoolMenu::SetLogoText(CString strText, COLORREF color)
{
	m_sLogoText  = strText;
	m_crLogoColor = color;
	m_szMenuLogo.cx = 20;
}

/*========================================================================
	功能:			设置LOGO图片
	--------------------------------------------
	uID:			LOGO图片ID
	width:			LOGO栏宽度,如果为0,则把图片的宽度作为LGOG栏宽度
==========================================================================*/
BOOL CCoolMenu::SetLogoImage(UINT uBitmapID, int nwidth)
{
	if (uBitmapID == NULL) 
	{
		m_uLogoBmpID = 0;
		return FALSE;
	}
	CBitmap bitmap;
	bitmap.LoadBitmap(uBitmapID);
	if(bitmap.GetSafeHandle() != NULL)
	{
		BITMAP bm;
		bitmap.GetBitmap(&bm);
		if (nwidth == 0) m_szMenuLogo.cx = bm.bmWidth;
		else m_szMenuLogo.cx = nwidth;
		m_szMenuLogo.cy = bm.bmHeight;
		m_uLogoBmpID = uBitmapID;
		bitmap.DeleteObject();
	}
	else
	{
		m_uLogoBmpID = 0;
		m_szMenuLogo = CSize(0, 0);
	}
	return TRUE;
}

/*########################################################################
					-----------------------
						设置菜单图像列表	
					-----------------------
  ########################################################################*/

/*========================================================================
	功能:			设置菜单图像列表.
	------------------------------------------------------------	
	uToolBarID:		对应用来提取命令ID工具栏资源的ID.
	uBitmapID:		图像资源ID.
	bAlpha:			是否有alpha通道.
==========================================================================*/
int CCoolMenu::SetImageList(UINT uToolBarID, UINT uBitmapID, BOOL bAlpha)
{
	if (uToolBarID != NULL)
	{
		if (uBitmapID == NULL)
		{
			m_uBitmapID = uToolBarID;
			m_crMarkColor = RGB(192, 192, 192);
		}
		else
		{
			m_uBitmapID = uBitmapID;
			m_crMarkColor = RGB(255, 0, 255);
		}
		
		if (bAlpha) 
		{
			m_dwStyle |= CMS_32IMAGELIST;
		}
		else 
		{
			m_dwStyle &= ~CMS_32IMAGELIST;
		}
		InitImageList();
		m_uIDArray.RemoveAll();
		return GetIDFromToolBar(uToolBarID, &m_uIDArray);
	}
	return -1;
}

/*========================================================================
	功能:	初始化图像列表
==========================================================================*/
BOOL CCoolMenu::InitImageList()
{
	CBitmap bitmap, tempbitmap;
	CSize szIcon(16, 16);

	bitmap.LoadBitmap(m_uBitmapID);
	if (bitmap.GetSafeHandle() == NULL)
	{
		return FALSE;
	}
	
	m_iImageList.DeleteImageList();
	m_iHotImageList.DeleteImageList();
	m_iDisabledImageList.DeleteImageList();

	m_iImageList.Create(szIcon.cx, szIcon.cy, ILC_COLOR24 | ILC_MASK, 16, 16);
	m_iHotImageList.Create(szIcon.cx, szIcon.cy, ILC_COLOR24 | ILC_MASK, 16, 16);
	m_iDisabledImageList.Create(szIcon.cx, szIcon.cy, ILC_COLOR24 |ILC_MASK, 16, 16);

	BOOL bAlpha = ((GetStyle() & CMS_32IMAGELIST) == CMS_32IMAGELIST);

	//创建正常图像列表----------------------------------------
	HBITMAP bm = NULL;

	
	if ((GetStyle() & CMS_ICONBAR) == 0)
	{
		bm =CCoolMenu::CreateImage(HBITMAP(bitmap), 1, bAlpha, m_crMenuColor, m_crMarkColor);
	}
	else
	{
		bm = CCoolMenu::CreateImage(HBITMAP(bitmap), 1, bAlpha, m_crIconBarColor, m_crMarkColor);
	}
	tempbitmap.Attach(bm);
	m_iImageList.Add(&tempbitmap, RGB(255, 0, 255));
	
	//创建禁止图像列表----------------------------------------
	tempbitmap.DeleteObject();
	if (GetStyle() & CMS_ICONBAR == 0)
	{
		bm = CCoolMenu::CreateImage(HBITMAP(bitmap), 0, bAlpha, m_crMenuColor, m_crMarkColor);
	}
	else
	{
		bm = CCoolMenu::CreateImage(HBITMAP(bitmap), 0, bAlpha, m_crIconBarColor, m_crMarkColor);
	}
	tempbitmap.Attach(bm);
	m_iDisabledImageList.Add(&tempbitmap, RGB(255, 0, 255));

	//创建热图像列表----------------------------------------
	tempbitmap.DeleteObject();

	bm = CCoolMenu::CreateImage(HBITMAP(bitmap), 2, bAlpha, m_crLightBarStartColor, m_crMarkColor);
	tempbitmap.Attach(bm);
	m_iHotImageList.Add(&tempbitmap, RGB(255, 0, 255));

	bitmap.DeleteObject();
	return TRUE;
}

/*========================================================================
	功能:			从工具栏资源中提取命令ID
	---------------------------------------------
	uToolBarID:	工具栏资源ID
	uIDArray:		用于存贮ID列表的数组指针
==========================================================================*/
int CCoolMenu::GetIDFromToolBar(UINT uToolBarID, CUIntArray *uIDArray)
{
	if (uToolBarID <= 0 || uIDArray == NULL) return -1;

	struct CToolBarData
	{
		WORD wVersion;
		WORD wWidth;
		WORD wHeight;
		WORD wItemCount;
		WORD* items()
		{
			return (WORD*)(this + 1); 
		}
	};
	
	ASSERT(MAKEINTRESOURCE(uToolBarID) != NULL);

	HINSTANCE hInst = AfxFindResourceHandle(MAKEINTRESOURCE(uToolBarID), RT_TOOLBAR);
	HRSRC hRsrc = ::FindResource(hInst, MAKEINTRESOURCE(uToolBarID), RT_TOOLBAR);
	if (hRsrc == NULL)
	{
		return -1;
	}

	HGLOBAL hGlobal = LoadResource(hInst, hRsrc);
	if (hGlobal == NULL)
	{
		return -1;
	}

	CToolBarData* pData = (CToolBarData*)LockResource(hGlobal);
	if (pData == NULL)
	{
		return -1;
	}
	ASSERT(pData->wVersion == 1);
	UINT uID;
	for (int i = 0; i < pData->wItemCount; i++)
	{
		uID = pData->items()[i];
		if (uID != ID_SEPARATOR)
		{
			uIDArray->Add(uID);
		}
	}

	UnlockResource(hGlobal);
	FreeResource(hGlobal);

	return uIDArray->GetSize();
}

/*########################################################################
			  ------------------------------------------------
								class CMenuWndHook
			  ------------------------------------------------
  ########################################################################*/
CMap <HWND, HWND, CMenuWndHook*, CMenuWndHook*> CMenuWndHook::m_WndMenuMap;
HHOOK CMenuWndHook::m_hMenuHook = NULL;
COLORREF CMenuWndHook::m_crFrame[4] = {::GetSysColor(COLOR_3DDKSHADOW), ::GetSysColor(COLOR_3DDKSHADOW), ::GetSysColor(COLOR_WINDOW), ::GetSysColor(COLOR_WINDOW)};

CMenuWndHook::CMenuWndHook (HWND hWnd)
: m_hWnd(hWnd), m_rcMenu(0, 0, 0, 0), m_ptMenu(-0xFFFF, -0xFFFF)
{

}

CMenuWndHook::~CMenuWndHook ()
{
    WNDPROC oldWndProc = (WNDPROC)::GetProp(m_hWnd, CoolMenu_oldProc);
    if (oldWndProc != NULL)
    {
        ::SetWindowLong(m_hWnd, GWL_WNDPROC, (DWORD)(ULONG)oldWndProc);
        ::RemoveProp(m_hWnd, CoolMenu_oldProc);
    }
    m_WndMenuMap.RemoveKey(m_hWnd);
}

void CMenuWndHook::InstallHook()
{
    if (m_hMenuHook == NULL )
    {
        m_hMenuHook = ::SetWindowsHookEx(WH_CALLWNDPROC, WindowHook, 
						AfxGetApp()->m_hInstance, ::GetCurrentThreadId());
    }
}

⌨️ 快捷键说明

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