2025-11-27 16:46:48 +09:00

136 lines
3.0 KiB
C++

// HyperBarOverlay.cpp : implementation file
//
#include "stdafx.h"
#include "OXHyperBarOverlay.h"
#include "OXHyperBarRender.h"
#pragma warning (push, 3) // overkill - vc6 warn 4100 in xmemory
#include <algorithm>
#pragma warning (pop)
// COXHyperBarOverlay
IMPLEMENT_DYNAMIC(COXHyperBarOverlay, CWnd)
COXHyperBarOverlay::COXHyperBarOverlay(CToolBar * pParent, COXHyperBarRender * pRender, SIZE szBtn)
{
m_pParent = pParent;
m_pOverlay = NULL;
m_pRender = pRender;
m_szBtn = szBtn;
}
COXHyperBarOverlay::~COXHyperBarOverlay()
{
// Delete the overlay bitmap
// The other pointers are to objects that are cleaned up elsewhere
//( m_pRender in the COXHyperbar class that creates instances of this one ).
if (m_pOverlay)
{
m_pOverlay->DeleteObject();
delete m_pOverlay;
}
}
BEGIN_MESSAGE_MAP(COXHyperBarOverlay, CWnd)
//{{AFX_MSG_MAP(COXHyperBar)
ON_WM_PAINT()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAPEND_MESSAGE_MAP()
END_MESSAGE_MAP()
// COXHyperBarOverlay message handlers
void COXHyperBarOverlay::OnPaint()
{
CPaintDC dc(this); // device context for painting
POINT ptMouse;
::GetCursorPos(&ptMouse);
ScreenToClient(&ptMouse);
RECT rc;
GetWindowRect(&rc);
m_pRender->RenderToolbar(&dc, &rc, m_szBtn, &ptMouse, m_pOverlay);
}
// To eliminate flicker
BOOL COXHyperBarOverlay::OnEraseBkgnd(CDC* /* pDC */)
{
return FALSE;
}
// The mouse move function works out if the mouse is moving out of the rectangle that
// defines the parent toolbar, and if it does, closes the window.
void COXHyperBarOverlay::OnMouseMove(UINT /* nFlags */, CPoint point)
{
RECT rc;
m_pParent->GetClientRect(&rc);
POINT pt = point;
ClientToScreen(&pt);
m_pParent->ClientToScreen(&rc);
if (!PtInRect(&rc, pt))
{
ReleaseCapture();
ShowWindow(SW_HIDE);
m_pParent->Invalidate();
}
else
{
Invalidate(FALSE);
}
}
// m_pOverlay represents a screenshot of the area taken by this window, when the toolbar is dormant
// The toolbar area is drawn over, the rest of the screenshot serves to create the illusion that we are
// drawing outside the bounds of the toolbar.
void COXHyperBarOverlay::SetBitmap(CBitmap * pBmp)
{
if (m_pOverlay)
{
m_pOverlay->DeleteObject();
delete m_pOverlay;
}
m_pOverlay = pBmp;
Invalidate();
}
// When a click event occurs, we check if the mouse was over a button
// GetActiveItemMsg returns the message that we want to send back to the main window,
// assuming there is one
void COXHyperBarOverlay::OnLButtonUp(UINT /* nFlags */, CPoint /* point */)
{
int msg = m_pRender->GetActiveItemMsg();
if (msg > -1)
{
ShowWindow(SW_HIDE);
AfxGetMainWnd()->SendMessage(WM_COMMAND, msg, (LPARAM)m_pParent->m_hWnd);
}
}
// Ensure that we have mouse capture when our window is shown ( so we get the mouse move message, and don't orphan this window )
BOOL COXHyperBarOverlay::ShowWindow(int nCmdShow)
{
if (nCmdShow == SW_SHOW )
{
SetCapture();
}
else
{
ReleaseCapture();
}
return ((CWnd*)this)->ShowWindow(nCmdShow);
}