130 lines
3.2 KiB
C++
130 lines
3.2 KiB
C++
// OXSkinnedSpinCtrl.cpp : implementation file
|
|
//
|
|
// Version: 9.3
|
|
|
|
|
|
#include "stdafx.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;
|
|
}
|