?? toolbarex.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 + -