You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
584 lines
16 KiB
584 lines
16 KiB
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
// CWMPEventDispatch.cpp : Implementation of the event dispatcher
|
|
//
|
|
|
|
#include "CWMPEventDispatch.h"
|
|
#include "CWMPHost.h"
|
|
|
|
extern HWND g_hBlackFadingWindow;
|
|
extern CComPtr<IWMPPlayer> g_spWMPPlayer;
|
|
extern CWMPHost* g_pFrame;
|
|
extern double g_timeAtFadeStart;
|
|
extern bool g_bFadeIn;
|
|
|
|
bool g_bFadeWindowTriggered = false;
|
|
|
|
|
|
bool IsFullScreen();
|
|
bool SetFullScreen( bool bWantToBeFullscreen );
|
|
bool IsVideoPlaying();
|
|
void PlayVideo( bool bPlay );
|
|
bool ShowFadeWindow( bool bShow );
|
|
void LogPlayerEvent( EventType_t e, float pos );
|
|
void LogPlayerEvent( EventType_t e );
|
|
|
|
|
|
HRESULT CWMPEventDispatch::Invoke(
|
|
DISPID dispIdMember,
|
|
REFIID riid,
|
|
LCID lcid,
|
|
WORD wFlags,
|
|
DISPPARAMS FAR* pDispParams,
|
|
VARIANT FAR* pVarResult,
|
|
EXCEPINFO FAR* pExcepInfo,
|
|
unsigned int FAR* puArgErr )
|
|
{
|
|
if (!pDispParams)
|
|
return E_POINTER;
|
|
|
|
if (pDispParams->cNamedArgs != 0)
|
|
return DISP_E_NONAMEDARGS;
|
|
|
|
HRESULT hr = DISP_E_MEMBERNOTFOUND;
|
|
|
|
switch (dispIdMember)
|
|
{
|
|
case DISPID_WMPCOREEVENT_OPENSTATECHANGE:
|
|
OpenStateChange(pDispParams->rgvarg[0].lVal /* NewState */ );
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_PLAYSTATECHANGE:
|
|
PlayStateChange(pDispParams->rgvarg[0].lVal /* NewState */);
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_AUDIOLANGUAGECHANGE:
|
|
AudioLanguageChange(pDispParams->rgvarg[0].lVal /* LangID */);
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_STATUSCHANGE:
|
|
StatusChange();
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_SCRIPTCOMMAND:
|
|
ScriptCommand(pDispParams->rgvarg[1].bstrVal /* scType */, pDispParams->rgvarg[0].bstrVal /* Param */ );
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_NEWSTREAM:
|
|
NewStream();
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_DISCONNECT:
|
|
Disconnect(pDispParams->rgvarg[0].lVal /* Result */ );
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_BUFFERING:
|
|
Buffering(pDispParams->rgvarg[0].boolVal /* Start */);
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_ERROR:
|
|
Error();
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_WARNING:
|
|
Warning(pDispParams->rgvarg[1].lVal /* WarningType */, pDispParams->rgvarg[0].lVal /* Param */, pDispParams->rgvarg[2].bstrVal /* Description */);
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_ENDOFSTREAM:
|
|
EndOfStream(pDispParams->rgvarg[0].lVal /* Result */ );
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_POSITIONCHANGE:
|
|
PositionChange(pDispParams->rgvarg[1].dblVal /* oldPosition */, pDispParams->rgvarg[0].dblVal /* newPosition */);
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_MARKERHIT:
|
|
MarkerHit(pDispParams->rgvarg[0].lVal /* MarkerNum */);
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_DURATIONUNITCHANGE:
|
|
DurationUnitChange(pDispParams->rgvarg[0].lVal /* NewDurationUnit */);
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_CDROMMEDIACHANGE:
|
|
CdromMediaChange(pDispParams->rgvarg[0].lVal /* CdromNum */);
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_PLAYLISTCHANGE:
|
|
PlaylistChange(pDispParams->rgvarg[1].pdispVal /* Playlist */, (WMPPlaylistChangeEventType) pDispParams->rgvarg[0].lVal /* change */);
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_CURRENTPLAYLISTCHANGE:
|
|
CurrentPlaylistChange((WMPPlaylistChangeEventType) pDispParams->rgvarg[0].lVal /* change */);
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_CURRENTPLAYLISTITEMAVAILABLE:
|
|
CurrentPlaylistItemAvailable(pDispParams->rgvarg[0].bstrVal /* bstrItemName */);
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_MEDIACHANGE:
|
|
MediaChange(pDispParams->rgvarg[0].pdispVal /* Item */);
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_CURRENTMEDIAITEMAVAILABLE:
|
|
CurrentMediaItemAvailable(pDispParams->rgvarg[0].bstrVal /* bstrItemName */);
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_CURRENTITEMCHANGE:
|
|
CurrentItemChange(pDispParams->rgvarg[0].pdispVal /* pdispMedia */);
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_MEDIACOLLECTIONCHANGE:
|
|
MediaCollectionChange();
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_MEDIACOLLECTIONATTRIBUTESTRINGADDED:
|
|
MediaCollectionAttributeStringAdded(pDispParams->rgvarg[1].bstrVal /* bstrAttribName */, pDispParams->rgvarg[0].bstrVal /* bstrAttribVal */ );
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_MEDIACOLLECTIONATTRIBUTESTRINGREMOVED:
|
|
MediaCollectionAttributeStringRemoved(pDispParams->rgvarg[1].bstrVal /* bstrAttribName */, pDispParams->rgvarg[0].bstrVal /* bstrAttribVal */ );
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_MEDIACOLLECTIONATTRIBUTESTRINGCHANGED:
|
|
MediaCollectionAttributeStringChanged(pDispParams->rgvarg[2].bstrVal /* bstrAttribName */, pDispParams->rgvarg[1].bstrVal /* bstrOldAttribVal */, pDispParams->rgvarg[0].bstrVal /* bstrNewAttribVal */);
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_PLAYLISTCOLLECTIONCHANGE:
|
|
PlaylistCollectionChange();
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_PLAYLISTCOLLECTIONPLAYLISTADDED:
|
|
PlaylistCollectionPlaylistAdded(pDispParams->rgvarg[0].bstrVal /* bstrPlaylistName */ );
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_PLAYLISTCOLLECTIONPLAYLISTREMOVED:
|
|
PlaylistCollectionPlaylistRemoved(pDispParams->rgvarg[0].bstrVal /* bstrPlaylistName */ );
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_PLAYLISTCOLLECTIONPLAYLISTSETASDELETED:
|
|
PlaylistCollectionPlaylistSetAsDeleted(pDispParams->rgvarg[1].bstrVal /* bstrPlaylistName */, pDispParams->rgvarg[0].boolVal /* varfIsDeleted */);
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_MODECHANGE:
|
|
ModeChange(pDispParams->rgvarg[1].bstrVal /* ModeName */, pDispParams->rgvarg[0].boolVal /* NewValue */);
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_MEDIAERROR:
|
|
MediaError(pDispParams->rgvarg[0].pdispVal /* pMediaObject */);
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_OPENPLAYLISTSWITCH:
|
|
OpenPlaylistSwitch(pDispParams->rgvarg[0].pdispVal /* pItem */);
|
|
break;
|
|
|
|
case DISPID_WMPCOREEVENT_DOMAINCHANGE:
|
|
DomainChange(pDispParams->rgvarg[0].bstrVal /* strDomain */);
|
|
break;
|
|
|
|
case DISPID_WMPOCXEVENT_SWITCHEDTOPLAYERAPPLICATION:
|
|
SwitchedToPlayerApplication();
|
|
break;
|
|
|
|
case DISPID_WMPOCXEVENT_SWITCHEDTOCONTROL:
|
|
SwitchedToControl();
|
|
break;
|
|
|
|
case DISPID_WMPOCXEVENT_PLAYERDOCKEDSTATECHANGE:
|
|
PlayerDockedStateChange();
|
|
break;
|
|
|
|
case DISPID_WMPOCXEVENT_PLAYERRECONNECT:
|
|
PlayerReconnect();
|
|
break;
|
|
|
|
case DISPID_WMPOCXEVENT_CLICK:
|
|
Click(pDispParams->rgvarg[3].iVal /* nButton */, pDispParams->rgvarg[2].iVal /* nShiftState */, pDispParams->rgvarg[1].lVal /* fX */, pDispParams->rgvarg[0].lVal /* fY */);
|
|
break;
|
|
|
|
case DISPID_WMPOCXEVENT_DOUBLECLICK:
|
|
DoubleClick(pDispParams->rgvarg[3].iVal /* nButton */, pDispParams->rgvarg[2].iVal /* nShiftState */, pDispParams->rgvarg[1].lVal /* fX */, pDispParams->rgvarg[0].lVal /* fY */);
|
|
break;
|
|
|
|
case DISPID_WMPOCXEVENT_KEYDOWN:
|
|
KeyDown(pDispParams->rgvarg[1].iVal /* nKeyCode */, pDispParams->rgvarg[0].iVal /* nShiftState */);
|
|
break;
|
|
|
|
case DISPID_WMPOCXEVENT_KEYPRESS:
|
|
KeyPress(pDispParams->rgvarg[0].iVal /* nKeyAscii */);
|
|
break;
|
|
|
|
case DISPID_WMPOCXEVENT_KEYUP:
|
|
KeyUp(pDispParams->rgvarg[1].iVal /* nKeyCode */, pDispParams->rgvarg[0].iVal /* nShiftState */);
|
|
break;
|
|
|
|
case DISPID_WMPOCXEVENT_MOUSEDOWN:
|
|
MouseDown(pDispParams->rgvarg[3].iVal /* nButton */, pDispParams->rgvarg[2].iVal /* nShiftState */, pDispParams->rgvarg[1].lVal /* fX */, pDispParams->rgvarg[0].lVal /* fY */);
|
|
break;
|
|
|
|
case DISPID_WMPOCXEVENT_MOUSEMOVE:
|
|
MouseMove(pDispParams->rgvarg[3].iVal /* nButton */, pDispParams->rgvarg[2].iVal /* nShiftState */, pDispParams->rgvarg[1].lVal /* fX */, pDispParams->rgvarg[0].lVal /* fY */);
|
|
break;
|
|
|
|
case DISPID_WMPOCXEVENT_MOUSEUP:
|
|
MouseUp(pDispParams->rgvarg[3].iVal /* nButton */, pDispParams->rgvarg[2].iVal /* nShiftState */, pDispParams->rgvarg[1].lVal /* fX */, pDispParams->rgvarg[0].lVal /* fY */);
|
|
break;
|
|
}
|
|
|
|
return( hr );
|
|
}
|
|
|
|
// Sent when the control changes OpenState
|
|
void CWMPEventDispatch::OpenStateChange(long NewState)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Sent when the control changes PlayState
|
|
void CWMPEventDispatch::PlayStateChange(long NewState)
|
|
{
|
|
WMPPlayState playstate;
|
|
if ( g_spWMPPlayer->get_playState( &playstate ) == S_OK )
|
|
{
|
|
switch ( playstate )
|
|
{
|
|
case wmppsPlaying:
|
|
{
|
|
static bool s_first = true;
|
|
if ( s_first )
|
|
{
|
|
s_first = false;
|
|
|
|
LogPlayerEvent( ET_MEDIABEGIN );
|
|
|
|
SetFullScreen( true );
|
|
ShowFadeWindow( false );
|
|
}
|
|
else
|
|
{
|
|
LogPlayerEvent( ET_PLAY );
|
|
}
|
|
break;
|
|
}
|
|
|
|
case wmppsPaused:
|
|
LogPlayerEvent( ET_PAUSE );
|
|
break;
|
|
|
|
case wmppsStopped:
|
|
LogPlayerEvent( ET_STOP );
|
|
break;
|
|
|
|
case wmppsMediaEnded:
|
|
LogPlayerEvent( ET_MEDIAEND );
|
|
|
|
if ( IsFullScreen() && !g_bFadeWindowTriggered )
|
|
{
|
|
g_bFadeWindowTriggered = true;
|
|
ShowFadeWindow( true );
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Sent when the audio language changes
|
|
void CWMPEventDispatch::AudioLanguageChange(long LangID)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Sent when the status string changes
|
|
void CWMPEventDispatch::StatusChange()
|
|
{
|
|
}
|
|
|
|
// Sent when a synchronized command or URL is received
|
|
void CWMPEventDispatch::ScriptCommand(BSTR scType,BSTR Param)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Sent when a new stream is encountered (obsolete)
|
|
void CWMPEventDispatch::NewStream()
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Sent when the control is disconnected from the server (obsolete)
|
|
void CWMPEventDispatch:: Disconnect(long Result )
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Sent when the control begins or ends buffering
|
|
void CWMPEventDispatch:: Buffering(VARIANT_BOOL Start)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Sent when the control has an error condition
|
|
void CWMPEventDispatch::Error()
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Sent when the control has an warning condition (obsolete)
|
|
void CWMPEventDispatch::Warning(long WarningType, long Param, BSTR Description)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Sent when the media has reached end of stream
|
|
void CWMPEventDispatch::EndOfStream(long Result)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Indicates that the current position of the movie has changed
|
|
void CWMPEventDispatch::PositionChange(double oldPosition,double newPosition)
|
|
{
|
|
LogPlayerEvent( ET_SCRUBFROM, ( float )oldPosition );
|
|
LogPlayerEvent( ET_SCRUBTO, ( float )newPosition );
|
|
}
|
|
|
|
// Sent when a marker is reached
|
|
void CWMPEventDispatch::MarkerHit(long MarkerNum )
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Indicates that the unit used to express duration and position has changed
|
|
void CWMPEventDispatch::DurationUnitChange(long NewDurationUnit)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Indicates that the CD ROM media has changed
|
|
void CWMPEventDispatch::CdromMediaChange(long CdromNum)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Sent when a playlist changes
|
|
void CWMPEventDispatch::PlaylistChange(IDispatch * Playlist,WMPPlaylistChangeEventType change)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Sent when the current playlist changes
|
|
void CWMPEventDispatch::CurrentPlaylistChange(WMPPlaylistChangeEventType change )
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Sent when a current playlist item becomes available
|
|
void CWMPEventDispatch::CurrentPlaylistItemAvailable(BSTR bstrItemName)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Sent when a media object changes
|
|
void CWMPEventDispatch::MediaChange(IDispatch * Item)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Sent when a current media item becomes available
|
|
void CWMPEventDispatch::CurrentMediaItemAvailable(BSTR bstrItemName)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Sent when the item selection on the current playlist changes
|
|
void CWMPEventDispatch::CurrentItemChange(IDispatch *pdispMedia)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Sent when the media collection needs to be requeried
|
|
void CWMPEventDispatch::MediaCollectionChange()
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Sent when an attribute string is added in the media collection
|
|
void CWMPEventDispatch::MediaCollectionAttributeStringAdded(BSTR bstrAttribName, BSTR bstrAttribVal)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Sent when an attribute string is removed from the media collection
|
|
void CWMPEventDispatch::MediaCollectionAttributeStringRemoved(BSTR bstrAttribName, BSTR bstrAttribVal)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Sent when an attribute string is changed in the media collection
|
|
void CWMPEventDispatch::MediaCollectionAttributeStringChanged(BSTR bstrAttribName, BSTR bstrOldAttribVal, BSTR bstrNewAttribVal)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Sent when playlist collection needs to be requeried
|
|
void CWMPEventDispatch::PlaylistCollectionChange()
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Sent when a playlist is added to the playlist collection
|
|
void CWMPEventDispatch::PlaylistCollectionPlaylistAdded(BSTR bstrPlaylistName)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Sent when a playlist is removed from the playlist collection
|
|
void CWMPEventDispatch::PlaylistCollectionPlaylistRemoved(BSTR bstrPlaylistName)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Sent when a playlist has been set or reset as deleted
|
|
void CWMPEventDispatch::PlaylistCollectionPlaylistSetAsDeleted(BSTR bstrPlaylistName, VARIANT_BOOL varfIsDeleted)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Playlist playback mode has changed
|
|
void CWMPEventDispatch::ModeChange(BSTR ModeName, VARIANT_BOOL NewValue)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Sent when the media object has an error condition
|
|
void CWMPEventDispatch::MediaError(IDispatch * pMediaObject)
|
|
{
|
|
while ( ShowCursor( TRUE ) < 0 )
|
|
;
|
|
|
|
ShowWindow( g_hBlackFadingWindow, SW_HIDE );
|
|
if ( g_pFrame )
|
|
{
|
|
g_pFrame->ShowWindow( SW_HIDE );
|
|
}
|
|
|
|
CComPtr< IWMPMedia > spWMPMedia;
|
|
if ( pMediaObject )
|
|
{
|
|
pMediaObject->QueryInterface( &spWMPMedia );
|
|
}
|
|
if ( spWMPMedia )
|
|
{
|
|
BSTR bstr;
|
|
spWMPMedia->get_sourceURL( &bstr );
|
|
char str[ 1024 ];
|
|
sprintf( str, "Unable to open media: %s\n", CW2T( bstr ) );
|
|
MessageBox( NULL, str, "Media Error", MB_OK | MB_ICONERROR );
|
|
}
|
|
else
|
|
{
|
|
MessageBox( NULL, "Media Error", "Media Error", MB_OK | MB_ICONERROR );
|
|
}
|
|
|
|
g_pFrame->PostMessage( WM_CLOSE );
|
|
}
|
|
|
|
// Current playlist switch with no open state change
|
|
void CWMPEventDispatch::OpenPlaylistSwitch(IDispatch *pItem)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Sent when the current DVD domain changes
|
|
void CWMPEventDispatch::DomainChange(BSTR strDomain)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Sent when display switches to player application
|
|
void CWMPEventDispatch::SwitchedToPlayerApplication()
|
|
{
|
|
}
|
|
|
|
// Sent when display switches to control
|
|
void CWMPEventDispatch::SwitchedToControl()
|
|
{
|
|
}
|
|
|
|
// Sent when the player docks or undocks
|
|
void CWMPEventDispatch::PlayerDockedStateChange()
|
|
{
|
|
}
|
|
|
|
// Sent when the OCX reconnects to the player
|
|
void CWMPEventDispatch::PlayerReconnect()
|
|
{
|
|
}
|
|
|
|
// Occurs when a user clicks the mouse
|
|
void CWMPEventDispatch::Click( short nButton, short nShiftState, long fX, long fY )
|
|
{
|
|
if ( IsFullScreen() )
|
|
{
|
|
SetFullScreen( false );
|
|
}
|
|
}
|
|
|
|
// Occurs when a user double-clicks the mouse
|
|
void CWMPEventDispatch::DoubleClick( short nButton, short nShiftState, long fX, long fY )
|
|
{
|
|
// the controls are just drawn into the main window, wheras the video has its own window
|
|
// this check allows us to only fullscreen on doubleclick within the video area
|
|
POINT pt = { fX, fY };
|
|
HWND hWnd = g_pFrame->ChildWindowFromPoint( pt );
|
|
if ( ChildWindowFromPoint( hWnd, pt ) != hWnd )
|
|
{
|
|
SetFullScreen( !IsFullScreen() );
|
|
}
|
|
}
|
|
|
|
// Occurs when a key is pressed
|
|
void CWMPEventDispatch::KeyDown( short nKeyCode, short nShiftState )
|
|
{
|
|
#if 1
|
|
if ( !g_pFrame )
|
|
return;
|
|
|
|
BOOL rval;
|
|
if ( nShiftState & 4 ) // 4 is the alt keymask
|
|
{
|
|
g_pFrame->OnSysKeyDown( WM_KEYDOWN, nKeyCode, 0, rval );
|
|
}
|
|
else
|
|
{
|
|
g_pFrame->OnKeyDown( WM_KEYDOWN, nKeyCode, 0, rval );
|
|
}
|
|
#endif
|
|
}
|
|
|
|
// Occurs when a key is pressed and released
|
|
void CWMPEventDispatch::KeyPress( short nKeyAscii )
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Occurs when a key is released
|
|
void CWMPEventDispatch::KeyUp( short nKeyCode, short nShiftState )
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Occurs when a mouse button is pressed
|
|
void CWMPEventDispatch::MouseDown( short nButton, short nShiftState, long fX, long fY )
|
|
{
|
|
}
|
|
|
|
// Occurs when a mouse pointer is moved
|
|
void CWMPEventDispatch::MouseMove( short nButton, short nShiftState, long fX, long fY )
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Occurs when a mouse button is released
|
|
void CWMPEventDispatch::MouseUp( short nButton, short nShiftState, long fX, long fY )
|
|
{
|
|
}
|