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

📄 toolbarex.cpp

📁 开发环境为VC++ 的数据库管理系统
💻 CPP
字号:
// ToolBarEx.cpp : implementation file
//

#include "stdafx.h"
#include "ToolBarEx.h"
#include <afxadv.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CToolBarEx message handlers

BEGIN_MESSAGE_MAP(CToolBarEx, CToolBar)
	//{{AFX_MSG_MAP(CToolBarEx)
	ON_WM_PAINT()
	ON_WM_MOUSEMOVE()
	ON_WM_CREATE()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CToolBarEx Constructor/Creator.

CToolBarEx::CToolBarEx ()
{
	// Init variables.
 	all_frame = true;
	ImageStyle = IM_TRANSPARENT;
	MaskColor = RGB(198, 195, 198);
	nbButtons = 1;
	DrawGripper = false;
	button_flat = false;
	init = false;
	button_down = false;
}

CToolBarEx::~CToolBarEx ()
{
	dcMemSave.DeleteDC();
}

BOOL CToolBarEx::CreateEx ( CWnd* pParentWnd,
							DWORD dwCtrlStyle,
							DWORD dwStyle,
							UINT BkBitMapId,
							UINT TbBitMapId,
							UINT NBButtons,
							bool strechBackGround )
{
	// Get the button's style.
	if ( dwCtrlStyle == TBSTYLE_FLAT )
		button_flat = true;

	// Set the existing toolbar as transparent to avoid flickering.
	dwCtrlStyle = TBSTYLE_TRANSPARENT;

	// Check if the gripper must be drawn.
	if ( (dwStyle & CBRS_GRIPPER) != 0 )
		DrawGripper = true;

	// Load the background image.
	bmpBackground.LoadBitmap(BkBitMapId);
	bmpBackground.GetObject(sizeof(bk_bm),&bk_bm);

	BkSave.LoadBitmap(BkBitMapId);
	BkSave.GetObject(sizeof(bk_bm),&bk_bm);

	// Load the toolbar image.
	bmptoolbar.LoadBitmap(TbBitMapId);	
	bmptoolbar.GetObject(sizeof(bmt),&bmt);

	StrechBackGround = strechBackGround;
	nbButtons =  NBButtons;
	image_len = ((bmt.bmWidth)/nbButtons);

	BOOL rc = CToolBar::CreateEx ( pParentWnd, dwCtrlStyle, dwStyle );

	dcMemSave.CreateCompatibleDC(this->GetDC());
	dcMemSave.SelectObject(&BkSave);
	
	return rc;
}

///////////////////////////////////////////////////////////////////////////////
// OnPaint method.

void CToolBarEx::OnPaint() 
{
	// Get a paint handle to disable the system paint.
	CPaintDC pDC(this);

	DrawBackGround();

}

///////////////////////////////////////////////////////////////////////////////
// Draw the toolbar.

void CToolBarEx::DrawBackGround()
{
	// Get a paint handle to the parent frame control.
	CFrameWnd*  frame = this->GetParentFrame();	
	CClientDC frameDC(frame);

	// Get a paint handle to the toolbar control.
	CClientDC toolbarDC(this);
	
	// Get the size of the toolbar parent control.
	frame->GetClientRect(&Frame_rect);
	
	// Get the size of the toolbar control.
	GetClientRect(&ToolBar_rect);
	ToolBar_rect.right = Frame_rect.right;	

	// Handle to display the background.
	CDC dcMem;
	dcMem.CreateCompatibleDC(&frameDC);
	dcMem.SelectObject(&bmpBackground);

	// Check if the gripper is to be drawn.
	if ( DrawGripper == true && all_frame == true )
	{
		CPoint frame_client_pt(Frame_rect.left, Frame_rect.top);
		frame->ClientToScreen(&frame_client_pt);
		
		CPoint control_client_pt(ToolBar_rect.left, ToolBar_rect.top);
		ClientToScreen(&control_client_pt);
		
		ToolBar_rect.left += control_client_pt.x - frame_client_pt.x;
		ToolBar_rect.top += control_client_pt.y - frame_client_pt.y;
		ToolBar_rect.bottom += 2;

		frameDC.BitBlt (	Frame_rect.left, Frame_rect.top + 1, ToolBar_rect.left - 7, ToolBar_rect.bottom - 1,
							&dcMem, 0, 0, SRCCOPY );
	}


	//
	// Draw the background image.
	//

	if ( all_frame == true )
	{
		if ( StrechBackGround == false )
			frameDC.BitBlt (	ToolBar_rect.left, ToolBar_rect.top, ToolBar_rect.Width(), ToolBar_rect.Height(),
								&dcMem, 0, 0, SRCCOPY );
		
		else
			frameDC.StretchBlt (	ToolBar_rect.left, ToolBar_rect.top, ToolBar_rect.Width(), ToolBar_rect.Height(),
									&dcMem, 0, 0, bk_bm.bmWidth, bk_bm.bmHeight, SRCCOPY );
	}
	else
	{
		if ( StrechBackGround == false )
			toolbarDC.BitBlt (	ToolBar_rect.left, ToolBar_rect.top, ToolBar_rect.Width(), ToolBar_rect.Height(),
								&dcMem, 0, 0, SRCCOPY );
		
		else
			toolbarDC.StretchBlt ( ToolBar_rect.left, ToolBar_rect.top, ToolBar_rect.Width(), ToolBar_rect.Height(),
								&dcMem, 0, 0, bk_bm.bmWidth, bk_bm.bmHeight, SRCCOPY );
	}


	//
	// Draw the button's image.
	//

	// Get a handle to the toolbar control to get the button's info.
	CToolBarCtrl& control = GetToolBarCtrl();

	// Handle to display the toolbar buttons.
	CDC dcMemt;
	dcMemt.CreateCompatibleDC(&toolbarDC);
	dcMemt.SelectObject(&bmptoolbar);

	// Loop to get each button.
	for ( short i = 0 ; i < control.GetButtonCount() ; i++ )
	{
		// Get button's info.
		GetButtonInfo ( i, id, style, index );
		GetItemRect ( i, &button_rect );

		// Position of the button's bitmap into the toolbar bitmap row.
		image_pos = ((bmt.bmWidth)/nbButtons) * index;

		// Insert the button's bitmap if this is a button.
		if ( ImageStyle == IM_STRECH && style != TBBS_SEPARATOR  )
		{
			if ( style == TBBS_DISABLED )
			{
				for ( short x = 0 ; x < image_len ; x++ )
				{
					for ( short y = 0 ; y < bmt.bmHeight ; y++ )
					{
						if ( dcMemt.GetPixel(x + image_pos, y) != MaskColor )
						{
							if ( init == false )
							{
								dcMemSave.SetPixel ( x + image_pos, y, GetSysColor(COLOR_GRAYTEXT) );
							}
							
							dcMemt.SetPixel ( x + image_pos, y, GetSysColor(COLOR_GRAYTEXT) );
						}
					}
				}
			}

			// Strech the bitmap onto the toolbar button.
			toolbarDC.StretchBlt (	button_rect.left + 2, button_rect.top + 3, button_rect.right - button_rect.left - 4, button_rect.bottom - button_rect.top - 4,
								&dcMemt, image_pos, 0, image_len, bmt.bmHeight,	SRCCOPY );

			if ( init == false )
			{				
				dcMemSave.StretchBlt (	button_rect.left + 2, button_rect.top + 3, button_rect.right - button_rect.left - 4, button_rect.bottom - button_rect.top - 4,
								&dcMemt, image_pos, 0, image_len, bmt.bmHeight,	SRCCOPY );
			}
		}

		else if ( ImageStyle == IM_TRANSPARENT && style != TBBS_SEPARATOR )
		{
			// If the button size < image size, ot process this one, could also strech the image...)
			if ( (button_rect.right - button_rect.left) < image_len || (button_rect.bottom - button_rect.top) < bmt.bmHeight )
			{
				//**toolbarDC.StretchBlt (	button_rect.left + 2, button_rect.top + 3, button_rect.right - button_rect.left - 4, button_rect.bottom - button_rect.top - 4,
				//**				&dcMemt, image_pos, 0, image_len, bmt.bmHeight,	SRCCOPY );
			}

			else
			{
				// Remove mask background.
				for ( short x = 0 ; x < image_len ; x++ )
				{
					for ( short y = 0 ; y < bmt.bmHeight ; y++ )
					{
						COLORREF color = dcMemt.GetPixel ( x + image_pos, y );

						int center_x = (button_rect.right - button_rect.left)/2;
						int center_y = (button_rect.bottom - button_rect.top)/2;

						dest_pt.x = button_rect.left + center_x - image_len/2 + x;
						dest_pt.y = button_rect.top + center_y - bmt.bmHeight/2 + y;

						if ( color != MaskColor )
						{
							if ( style == TBBS_DISABLED )
							{
								if ( init == false )
								{				
									dcMemSave.SetPixel ( dest_pt.x, dest_pt.y, GetSysColor(COLOR_GRAYTEXT) );
								}

								toolbarDC.SetPixel ( dest_pt.x, dest_pt.y, GetSysColor(COLOR_GRAYTEXT) );
							}
						
							else
							{
								if ( init == false )
								{				
									dcMemSave.SetPixel ( dest_pt.x, dest_pt.y, color );
								}
							
								toolbarDC.SetPixel ( dest_pt.x, dest_pt.y, color );
							}
						}
					}
				}
			}
		}
	}

	init = true;
	
	// Free the device context.
	dcMem.DeleteDC();
	dcMemt.DeleteDC();
}

///////////////////////////////////////////////////////////////////////////////
// Draw the edge of the button.

void CToolBarEx::DrawButtonEdge()
{
	short i = 0;

	// Get a paint handle to the toolbar control.
	CClientDC toolbarDC(this);
	
	// Get a handle to the toolbar control to get the button's info.
	CToolBarCtrl& control = GetToolBarCtrl();
	
	// Loop to get each button.
	for ( i = 0 ; i < control.GetButtonCount() ; i++ )
	{
		// Get button's info.
		GetButtonInfo ( i, id, style, index );
		GetItemRect ( i, &button_rect );

		// Do no draw separators.
		//if ( style != TBBS_SEPARATOR && style != TBBS_DISABLED )
		{
			button_rect.left += 1;
			button_rect.right -= 1;
			button_rect.top += 1;
			button_rect.bottom -= 1;

			if ( button_flat == true )
			{
				// If flat, only the selected button will be displayed.
				if ( button_rect.left <= mousePosition.x &&
					 button_rect.right >= mousePosition.x &&
					 button_rect.top <= mousePosition.y  &&
					 button_rect.bottom >= mousePosition.y )
				{
					CClientDC toolbarDC(this);
					toolbarDC.BitBlt (	0, 0,
										bk_bm.bmWidth, bk_bm.bmHeight,
										&dcMemSave, 0, 0, SRCCOPY );

					if ( style != TBBS_SEPARATOR && style != TBBS_DISABLED )
					{
						toolbarDC.DrawEdge ( &button_rect, EDGE_BUMP, BF_BOTTOMLEFT );
						return;
					}
				}
			}
  			
			else
			{
				if ( style != TBBS_SEPARATOR && style != TBBS_DISABLED )
				{
					if ( button_down == true && i == control.HitTest(&mousePosition) )
						toolbarDC.DrawEdge ( &button_rect, EDGE_BUMP, BF_BOTTOMLEFT );
					else
						toolbarDC.DrawEdge ( &button_rect, EDGE_RAISED, BF_RECT );
				}
			}
		}
	}
}

///////////////////////////////////////////////////////////////////////////////
// Indicate the mouse moved.

void CToolBarEx::OnMouseMove(UINT nFlags, CPoint point) 
{
	mousePosition = point;
	DrawButtonEdge();
	
	CToolBar::OnMouseMove(nFlags, point);
}

///////////////////////////////////////////////////////////////////////////////
// Indicate a button down/up.

void CToolBarEx::OnLButtonDown(UINT nFlags, CPoint point) 
{
	button_down = true;
	DrawButtonEdge();
	CToolBar::OnLButtonDown(nFlags, point);
}

void CToolBarEx::OnLButtonUp(UINT nFlags, CPoint point) 
{
	button_down = false;	
	CToolBar::OnLButtonUp(nFlags, point);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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