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

📄 bcgpdropdown.cpp

📁 远程网络监视程序的源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//*******************************************************************************
// COPYRIGHT NOTES
// ---------------
// This is a part of the BCGControlBar Library
// Copyright (C) 1998-2000 BCGSoft Ltd.
// All rights reserved.
//
// This source code can be used, distributed or modified
// only under terms and conditions 
// of the accompanying license agreement.
 //*******************************************************************************

// BCGPDropDown.cpp : implementation file
//

#include "stdafx.h"
#include "multimon.h"

#include <afxpriv.h>
#include "mmsystem.h"
#include "BCGPDropDown.h"
#include "BCGGlobals.h"
#include "BCGPToolbarMenuButton.h"
#include "BCGPMDIFrameWnd.h"
#include "BCGPFrameWnd.h"
#include "BCGPMenuBar.h"
#include "bcgpsound.h"
#include "BCGPToolbarMenuButton.h"
#include "TrackMouse.h"
#include "BCGPVisualManager.h"
#include "BCGPDrawManager.h"
#include "bcgprores.h"

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

static const UINT uiShowBarTimerId = 1;
static const UINT uiShowBarDelay = 500;	// ms
static const int nArrowSize = 7;

IMPLEMENT_SERIAL(CBCGPDropDownToolBar, CBCGPToolBar, 1)

extern CObList	gAllToolbars;

BOOL CBCGPDropDownToolBar::OnSendCommand(const CBCGPToolbarButton* pButton)
{
	ASSERT_VALID (pButton);
	
	if ((pButton->m_nStyle & TBBS_DISABLED) != 0 ||
		pButton->m_nID == 0 || pButton->m_nID == (UINT)-1)
	{
		return FALSE;
	}
	
	CBCGPDropDownFrame* pParent = (CBCGPDropDownFrame*)GetParent();
	ASSERT_KINDOF(CBCGPDropDownFrame, pParent);
	
	pParent->m_pParentBtn->SetDefaultCommand (pButton->m_nID);
	
	//----------------------------------
	// Send command to the parent frame:
	//----------------------------------
	CFrameWnd* pParentFrame = GetParentFrame ();
	ASSERT_VALID (pParentFrame);
	
	GetOwner()->PostMessage(WM_COMMAND, pButton->m_nID);
	pParentFrame->DestroyWindow ();
	return TRUE;
}
//*************************************************************************************
void CBCGPDropDownToolBar::OnUpdateCmdUI(CFrameWnd* /*pTarget*/, BOOL bDisableIfNoHndler)
{
	CBCGPToolBar::OnUpdateCmdUI ((CFrameWnd*)GetCommandTarget(), bDisableIfNoHndler);
}

BEGIN_MESSAGE_MAP(CBCGPDropDownToolBar, CBCGPToolBar)
//{{AFX_MSG_MAP(CBCGPDropDownToolBar)
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONUP()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CBCGPDropDownToolBar::OnMouseMove(UINT /*nFlags*/, CPoint point)
{
	if (m_ptLastMouse != CPoint (-1, -1) &&
		abs (m_ptLastMouse.x - point.x) < 1 &&
		abs (m_ptLastMouse.y - point.y) < 1)
	{
		m_ptLastMouse = point;
		return;
	}
	
	m_ptLastMouse = point;
	
	int iPrevHighlighted = m_iHighlighted;
	m_iHighlighted = HitTest (point);
	
	CBCGPToolbarButton* pButton = m_iHighlighted == -1 ?
		NULL : GetButton (m_iHighlighted);
	if (pButton != NULL &&
		(pButton->m_nStyle & TBBS_SEPARATOR || 
		(pButton->m_nStyle & TBBS_DISABLED && !AllowSelectDisabled ())))
	{
		m_iHighlighted = -1;
	}
	
	if (!m_bTracked)
	{
		m_bTracked = TRUE;
		
		TRACKMOUSEEVENT trackmouseevent;
		trackmouseevent.cbSize = sizeof(trackmouseevent);
		trackmouseevent.dwFlags = TME_LEAVE;
		trackmouseevent.hwndTrack = GetSafeHwnd();
		trackmouseevent.dwHoverTime = HOVER_DEFAULT;
		BCGPTrackMouse (&trackmouseevent);	
	}
	
	if (iPrevHighlighted != m_iHighlighted)
	{
		BOOL bNeedUpdate = FALSE;
		
		m_iButtonCapture = m_iHighlighted;
		if (iPrevHighlighted != -1)
		{
			CBCGPToolbarButton* pTBBCapt = GetButton (iPrevHighlighted);
			ASSERT (pTBBCapt != NULL);
			ASSERT (!(pTBBCapt->m_nStyle & TBBS_SEPARATOR));
			
			UINT nNewStyle = (pTBBCapt->m_nStyle & ~TBBS_PRESSED);
			
			if (nNewStyle != pTBBCapt->m_nStyle)
			{
				SetButtonStyle (iPrevHighlighted, nNewStyle);
			}
			
		}
		
		if (m_iButtonCapture != -1)
		{
			CBCGPToolbarButton* pTBBCapt = GetButton (m_iButtonCapture);
			ASSERT (pTBBCapt != NULL);
			ASSERT (!(pTBBCapt->m_nStyle & TBBS_SEPARATOR));
			
			UINT nNewStyle = (pTBBCapt->m_nStyle & ~TBBS_PRESSED);
			if (m_iHighlighted == m_iButtonCapture)
			{
				nNewStyle |= TBBS_PRESSED;
			}
			
			if (nNewStyle != pTBBCapt->m_nStyle)
			{
				SetButtonStyle (m_iButtonCapture, nNewStyle);
				bNeedUpdate = TRUE;
			}
		}
		
		if ((m_iButtonCapture == -1 || 
			iPrevHighlighted == m_iButtonCapture) &&
			iPrevHighlighted != -1)
		{
			InvalidateButton (iPrevHighlighted);
			bNeedUpdate = TRUE;
		}
		
		if ((m_iButtonCapture == -1 || 
			m_iHighlighted == m_iButtonCapture) &&
			m_iHighlighted != -1)
		{
			InvalidateButton (m_iHighlighted);
			bNeedUpdate = TRUE;
		}
		
		if (bNeedUpdate)
		{
			UpdateWindow ();
		}
		
		if (m_iHighlighted != -1 && 
			(m_iHighlighted == m_iButtonCapture || m_iButtonCapture == -1))
		{
			ASSERT (pButton != NULL);
			ShowCommandMessageString (pButton->m_nID);
		}
		else if (m_iButtonCapture == -1 && m_hookMouseHelp == NULL)
		{
			GetOwner()->SendMessage (WM_SETMESSAGESTRING, AFX_IDS_IDLEMESSAGE);
		}
		
		OnChangeHot (m_iHighlighted);
	}
}
//****************************************************************************************
void CBCGPDropDownToolBar::OnLButtonUp(UINT nFlags, CPoint point) 
{
	CRect rectClient;
	GetClientRect (&rectClient);
	
	if (!m_bCustomizeMode && 
		!rectClient.PtInRect (point))
	{
		CFrameWnd* pParentFrame = GetParentFrame ();
		ASSERT_VALID (pParentFrame);
		
		pParentFrame->DestroyWindow ();
		return;
	}
	
	if (!m_bCustomizeMode && m_iHighlighted >= 0)
	{
		m_iButtonCapture = m_iHighlighted;

		CBCGPToolbarButton* pButton = GetButton (m_iHighlighted);
		ASSERT_VALID (pButton);

		pButton->m_nStyle &= ~TBBS_PRESSED;
	}
	
	CBCGPToolBar::OnLButtonUp (nFlags, point);
}

/////////////////////////////////////////////////////////////////////////////
// CBCGPDropDownFrame

static const int iBorderSize = 2;

CString	CBCGPDropDownFrame::m_strClassName;

IMPLEMENT_SERIAL(CBCGPDropDownFrame, CMiniFrameWnd, VERSIONABLE_SCHEMA | 1)

CBCGPDropDownFrame::CBCGPDropDownFrame()
{
	m_x = m_y = 0;
	m_pParentBtn = NULL;
	m_bAutoDestroyParent = TRUE;
	m_bAutoDestroy = TRUE;
	m_pWndOriginToolbar = NULL;
}
//****************************************************************************************
CBCGPDropDownFrame::~CBCGPDropDownFrame()
{
	m_wndToolBar.m_Buttons.RemoveAll ();	// toolbar has references to original buttons!

	if (m_bAutoDestroy)
	{
		m_wndToolBar.DestroyWindow();
	}
}

BEGIN_MESSAGE_MAP(CBCGPDropDownFrame, CMiniFrameWnd)
//{{AFX_MSG_MAP(CBCGPDropDownFrame)
	ON_WM_CREATE()
	ON_WM_SIZE()
	ON_WM_PAINT()
	ON_WM_MOUSEACTIVATE()
	ON_WM_DESTROY()
	ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
	ON_WM_ACTIVATEAPP()
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBCGPDropDownFrame message handlers

BOOL CBCGPDropDownFrame::Create (CWnd* pWndParent, int x, int y, CBCGPDropDownToolBar* pWndOriginToolbar)
{
	ASSERT_VALID (pWndOriginToolbar);
	ASSERT (pWndParent != NULL);
	
	BCGPlaySystemSound (BCGSOUND_MENU_POPUP);
	
	if (m_strClassName.IsEmpty ())
	{
		m_strClassName = ::AfxRegisterWndClass (
			CS_SAVEBITS,
			::LoadCursor(NULL, IDC_ARROW),
			(HBRUSH)(COLOR_BTNFACE + 1), NULL);
	}

	m_pWndOriginToolbar = pWndOriginToolbar;

	if (x == -1 && y == -1)	// Undefined position
	{
		if (pWndParent != NULL)
		{
			CRect rectParent;
			pWndParent->GetClientRect (&rectParent);
			pWndParent->ClientToScreen (&rectParent);
			
			m_x = rectParent.left + 5;
			m_y = rectParent.top + 5;
		}
		else
		{
			m_x = 0;
			m_y = 0;
		}
	}
	else
	{
		m_x = x;
		m_y = y;
	}
	
	DWORD dwStyle = WS_POPUP;
	
	CRect rect (x, y, x, y);
	BOOL bCreated = CMiniFrameWnd::CreateEx (
		0,
		m_strClassName, m_strCaption,
		dwStyle, rect,
		pWndParent->GetOwner () == NULL ? 
			pWndParent : pWndParent->GetOwner ());
	if (!bCreated)
	{
		return FALSE;
	}
	
	ShowWindow (SW_SHOWNOACTIVATE);
	return TRUE;
}
//****************************************************************************************
int CBCGPDropDownFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	ASSERT_VALID (m_pWndOriginToolbar);
	ASSERT (m_pWndOriginToolbar->m_bLocked);

	if (CMiniFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;

	CBCGPToolBar* pParentBar = m_pParentBtn == NULL ? NULL :
		DYNAMIC_DOWNCAST (CBCGPToolBar, m_pParentBtn->m_pWndParent);
	
	BOOL bHorz = pParentBar == NULL ? TRUE : pParentBar->IsHorizontal ();
	DWORD style = bHorz? CBRS_ORIENT_VERT : CBRS_ORIENT_HORZ;
	
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | style, 
		CRect(1, 1, 1, 1), AFX_IDW_TOOLBAR + 39))
	{
		TRACE(_T ("Can't create toolbar bar\n"));
		return -1;
	}

	m_wndToolBar.m_bLocked = TRUE;

	//------------------------------
	// "Clone" the original toolbar:
	//------------------------------
	m_pWndOriginToolbar->m_ImagesLocked.CopyTemp (m_wndToolBar.m_ImagesLocked);
	m_pWndOriginToolbar->m_ColdImagesLocked.CopyTemp (m_wndToolBar.m_ColdImagesLocked);
	m_pWndOriginToolbar->m_DisabledImagesLocked.CopyTemp (m_wndToolBar.m_DisabledImagesLocked);

	m_wndToolBar.m_sizeButtonLocked = m_pWndOriginToolbar->m_sizeButtonLocked;
	m_wndToolBar.m_sizeImageLocked = m_pWndOriginToolbar->m_sizeImageLocked;
	m_wndToolBar.m_sizeCurButtonLocked = m_pWndOriginToolbar->m_sizeCurButtonLocked;
	m_wndToolBar.m_sizeCurImageLocked = m_pWndOriginToolbar->m_sizeCurImageLocked;

	m_wndToolBar.m_dwStyle &= ~CBRS_GRIPPER;

	m_wndToolBar.SetOwner (m_pWndOriginToolbar->GetOwner());
	m_wndToolBar.SetRouteCommandsViaFrame (m_pWndOriginToolbar->GetRouteCommandsViaFrame ());

	m_wndToolBar.m_Buttons.AddTail (&m_pWndOriginToolbar->m_Buttons);
		
	RecalcLayout ();
	::ReleaseCapture();
	m_wndToolBar.SetCapture ();

	return 0;
}
//****************************************************************************************
void CBCGPDropDownFrame::OnSize(UINT nType, int cx, int cy) 
{
	CMiniFrameWnd::OnSize(nType, cx, cy);
	
	if (m_wndToolBar.GetSafeHwnd () != NULL)
	{
		m_wndToolBar.SetWindowPos (NULL, iBorderSize, iBorderSize, 
			cx - iBorderSize * 2, cy - iBorderSize * 2, 
			SWP_NOZORDER | SWP_NOACTIVATE);
	}
}
//****************************************************************************************
void CBCGPDropDownFrame::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	CRect rectClient;	// Client area rectangle
	GetClientRect (&rectClient);
	
	dc.Draw3dRect (rectClient, 
		globalData.clrBarLight, 
		globalData.clrBarDkShadow);
	rectClient.DeflateRect (1, 1);
	dc.Draw3dRect (rectClient, 
		globalData.clrBarHilite,
		globalData.clrBarShadow);
}

⌨️ 快捷键说明

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