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

127 lines
3.6 KiB
C++

// ==========================================================================
// Class Implementation : COXSoundWnd
// ==========================================================================
// Version: 9.3
// This software along with its related components, documentation and files ("The Libraries")
// is © 1994-2007 The Code Project (1612916 Ontario Limited) and use of The Libraries is
// governed by a software license agreement ("Agreement"). Copies of the Agreement are
// available at The Code Project (www.codeproject.com), as part of the package you downloaded
// to obtain this file, or directly from our office. For a copy of the license governing
// this software, you may contact us at legalaffairs@codeproject.com, or by calling 416-849-8900.
// //////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "OXSoundWnd.h"
#include "OXSound.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNAMIC(COXSoundWnd, CWnd)
#define new DEBUG_NEW
/////////////////////////////////////////////////////////////////////////////
// Definition of static members
COXSoundWnd COXSoundWnd::m_theSoundWnd;
// Data members -------------------------------------------------------------
// protected:
// static COXSoundWnd m_theSoundWnd;
// The one and only object of this class
// private:
// Member functions ---------------------------------------------------------
// public:
BEGIN_MESSAGE_MAP(COXSoundWnd, CWnd)
//{{AFX_MSG_MAP(CWnd)
ON_MESSAGE(WM_OX_INTERNAL_SOUNDCALLBACK, OnInternalSoundCallback)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
COXSoundWnd::COXSoundWnd()
{
ASSERT_VALID(this);
}
HWND COXSoundWnd::CreateTheSoundWindow()
{
if ((m_theSoundWnd.m_hWnd == NULL) && !m_theSoundWnd.CreateEx(0, AfxRegisterWndClass(0),
_T("COXSoundWnd Notification Sink"), WS_OVERLAPPED, 0, 0, 0, 0, NULL, NULL))
{
TRACE0("COXSoundWnd::CreateTheSoundWindow: Unable to create COXSoundWnd notify window\n");
TRACE0("COXSoundWnd::CreateTheSoundWindow: Throwing resource exception\n");
AfxThrowResourceException();
}
ASSERT(m_theSoundWnd.m_hWnd != NULL);
ASSERT(CWnd::FromHandlePermanent(m_theSoundWnd.m_hWnd) == &m_theSoundWnd);
ASSERT_VALID(&m_theSoundWnd);
return m_theSoundWnd.m_hWnd;
}
HWND COXSoundWnd::GetTheSoundWindow()
{
#ifdef _DEBUG
if (m_theSoundWnd.m_hWnd == NULL)
TRACE0("COXSoundWnd::GetTheSoundWindow: COXSoundWnd notify window has not been created yet, returning NULL\n");
#endif // _DEBUG
return m_theSoundWnd.m_hWnd;
}
LRESULT COXSoundWnd::OnInternalSoundCallback(WPARAM wParam, LPARAM /* lParam */)
{
ASSERT_VALID(this);
COXSound* pSound = (COXSound*)wParam;
DWORD nDummy = 0;
// ... Check wheter the pointer still points to a valid object (may have been deleted in the meanwhile)
if (COXSound::m_allSoundObjects.Lookup(pSound, nDummy))
{
ASSERT_VALID(pSound);
// Have the COXSound class handle the callback
pSound->HandleCallback();
}
else
TRACE(_T("COXSoundWnd::OnInternalSoundCallback: Ignoring callback of non-existing COXSound object : address 0x%X\n"), (DWORD_PTR)pSound);
return 0;
}
#ifdef _DEBUG
void COXSoundWnd::AssertValid() const
{
// ... There should be only one object of this class
ASSERT(&m_theSoundWnd == this);
CWnd::AssertValid();
}
void COXSoundWnd::Dump(CDumpContext& dc) const
{
CWnd::Dump(dc);
}
#endif //_DEBUG
COXSoundWnd::~COXSoundWnd()
{
if (GetSafeHwnd() != NULL)
{
// ... Sestroy the window when this object is deleted
DestroyWindow();
}
}
// protected:
// private:
// ==========================================================================