Files
itgmania212121/stepmania/src/smlobby/CrossThreadsMessagingDevice.cpp
T
2002-12-02 05:44:00 +00:00

99 lines
1.9 KiB
C++

// CrossThreadsMessagingDevice.cpp
#include "stdafx.h"
#include "CrossThreadsMessagingDevice.h"
LPCTSTR CCrossThreadsMessagingDevice::m_lpszClassName = _T("CCrossThreadsMessagingDevice_HiddenWindow");
int CCrossThreadsMessagingDevice::m_iCount = 0;
CCrossThreadsMessagingDevice::CCrossThreadsMessagingDevice()
: m_hWnd(NULL), m_pMonitor(NULL)
{
if( m_iCount++ == 0 )
{
const WNDCLASS wc =
{
0,
HiddenWindowProc,
sizeof(DWORD) * 2,
sizeof(DWORD) * 2,
GetModuleHandle(NULL),
(HICON)NULL,
(HCURSOR)NULL,
(HBRUSH)(COLOR_WINDOW + 1),
(LPCTSTR)NULL,
m_lpszClassName
};
if( !RegisterClass(&wc) )
return;
}
m_hWnd = CreateWindow(
m_lpszClassName,
_T(""),
WS_OVERLAPPED,
0, 0, 0, 0,
(HWND)NULL,
(HMENU)NULL,
GetModuleHandle(NULL),
this
);
}
CCrossThreadsMessagingDevice::~CCrossThreadsMessagingDevice()
{
if( ::IsWindow(m_hWnd) )
DestroyWindow(m_hWnd);
if( --m_iCount == 0 )
{
UnregisterClass(m_lpszClassName, GetModuleHandle(NULL));
}
}
void CCrossThreadsMessagingDevice::Post(WPARAM wParam, LPARAM lParam)
{
ASSERT(::IsWindow(m_hWnd));
PostMessage(m_hWnd, HWM_DATA, wParam, lParam);
}
LRESULT WINAPI CCrossThreadsMessagingDevice::HiddenWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT rc = 0;
CCrossThreadsMessagingDevice* pThis =
(CCrossThreadsMessagingDevice*)GetWindowLong(hWnd, GWL_USERDATA);
switch( uMsg )
{
case WM_NCCREATE :
{
LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam;
ASSERT(lpcs->lpCreateParams != NULL);
SetWindowLong(hWnd, GWL_USERDATA, (LONG)lpcs->lpCreateParams);
rc = TRUE;
break;
}
case HWM_DATA :
{
ASSERT(pThis != NULL);
if( pThis->m_pMonitor )
pThis->m_pMonitor->OnCrossThreadsMessage(wParam, lParam);
break;
}
default :
{
rc = DefWindowProc(hWnd, uMsg, wParam, lParam);
break;
}
}
return rc;
}