📄 bcgpdropdown.cpp
字号:
//*******************************************************************************
// 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 + -