// OXSkinnedSpinCtrl.cpp : implementation file
//
// Version: 9.3
#include "stdafx.h"
// v93 update 03 - 64-bit
#include "UTB64Bit.h"
#include "OXSkinnedSpinCtrl.h"
#include "OXSkins.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNCREATE(COXSkinnedSpinCtrl, CSpinButtonCtrl)
/////////////////////////////////////////////////////////////////////////////
// COXSkinnedSpinCtrl
HHOOK COXSkinnedSpinCtrl::m_hMouseHook = NULL;
HWND COXSkinnedSpinCtrl::m_hwndPrevMouseMoveWnd = NULL;
COXSkinnedSpinCtrl::COXSkinnedSpinCtrl() :
m_pTabSkin(NULL)
{
}
COXSkinnedSpinCtrl::~COXSkinnedSpinCtrl()
{
if ( m_pTabSkin != NULL )
delete m_pTabSkin;
}
BEGIN_MESSAGE_MAP(COXSkinnedSpinCtrl, CSpinButtonCtrl)
//{{AFX_MSG_MAP(COXSkinnedSpinCtrl)
ON_WM_PAINT()
ON_WM_MOUSEMOVE()
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
ON_WM_DESTROY()
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// COXSkinnedSpinCtrl message handlers
COXTabSkin* COXSkinnedSpinCtrl::GetTabSkin()
{
// Check if the app is derived from COXSkinnedApp
COXSkinnedApp* pSkinnedApp = DYNAMIC_DOWNCAST(COXSkinnedApp, AfxGetApp());
if (pSkinnedApp != NULL && pSkinnedApp->GetCurrentSkin() != NULL)
return pSkinnedApp->GetCurrentSkin()->GetTabSkin();
else
{
// Create a classic skin for this class if not created already
if (m_pTabSkin == NULL)
m_pTabSkin = new COXTabSkinClassic();
return m_pTabSkin;
}
}
void COXSkinnedSpinCtrl::OnPaint()
{
GetTabSkin()->OnPaintSpinCtrl(this);
}
// Update the buttons of the mini frame window when the mouse leaves
LRESULT CALLBACK COXSkinnedSpinCtrl::MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode < 0)
return ::CallNextHookEx(m_hMouseHook, nCode, wParam, lParam);
if (nCode == HC_ACTION && (wParam == WM_MOUSEMOVE || wParam == WM_NCMOUSEMOVE))
{
MOUSEHOOKSTRUCT* pMH = (MOUSEHOOKSTRUCT*) lParam;
// If the previous message was for COXSizableMiniDockFrameWnd and the current is not
// we need to update the caption buttons
COXSkinnedSpinCtrl* pPrev = DYNAMIC_DOWNCAST(COXSkinnedSpinCtrl,CWnd::FromHandlePermanent(m_hwndPrevMouseMoveWnd));
COXSkinnedSpinCtrl* pCurrent = DYNAMIC_DOWNCAST(COXSkinnedSpinCtrl,CWnd::FromHandlePermanent(pMH->hwnd));
if (pPrev != NULL && pCurrent != pPrev)
{
// The mouse just left the mini frame window
::SendMessage( m_hwndPrevMouseMoveWnd, WM_MOUSEMOVE, 0, 0 );
}
m_hwndPrevMouseMoveWnd = pMH->hwnd;
}
return CallNextHookEx(m_hMouseHook, nCode, wParam, lParam);
}
void COXSkinnedSpinCtrl::PreSubclassWindow()
{
// Hook the mouse
if (m_hMouseHook == NULL)
m_hMouseHook = ::SetWindowsHookEx(WH_MOUSE, MouseProc, 0, AfxGetApp()->m_nThreadID);
CSpinButtonCtrl::PreSubclassWindow();
}
void COXSkinnedSpinCtrl::OnDestroy()
{
// Unhook the mouse
if (m_hMouseHook)
{
::UnhookWindowsHookEx(m_hMouseHook);
m_hMouseHook = NULL;
}
CSpinButtonCtrl::OnDestroy();
}
void COXSkinnedSpinCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
Invalidate();
CSpinButtonCtrl::OnMouseMove(nFlags, point);
}
BOOL COXSkinnedSpinCtrl::OnEraseBkgnd(CDC* /*pDC*/)
{
// TODO: Add your message handler code here and/or call default
return TRUE;
}