fixed horrible hack with passing pointers of wrong type to Connect(), use a real event handler class as appropriate

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@35112 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2005-08-05 21:27:44 +00:00
parent 4e61bf2ca1
commit 6ab9bf57a5

View File

@ -1775,13 +1775,6 @@ void wxActiveX::OnKillFocus(wxFocusEvent& event)
typedef BOOL (WINAPI* LPAMGETERRORTEXT)(HRESULT, wxChar *, DWORD);
//cludgy workaround for wx events. slots would be nice :)
class WXDLLIMPEXP_MEDIA wxAMMediaEvtHandler : public wxEvtHandler
{
public:
void OnEraseBackground(wxEraseEvent&);
};
class WXDLLIMPEXP_MEDIA wxAMMediaBackend : public wxMediaBackend
{
public:
@ -2222,13 +2215,6 @@ bool wxQuickTimeLibrary::Initialize()
return true;
}
//cludgy workaround for wx events. slots would be nice :)
class WXDLLIMPEXP_MEDIA wxQTMediaEvtHandler : public wxEvtHandler
{
public:
void OnEraseBackground(wxEraseEvent&);
};
class WXDLLIMPEXP_MEDIA wxQTMediaBackend : public wxMediaBackend
{
public:
@ -2293,6 +2279,20 @@ public:
DECLARE_DYNAMIC_CLASS(wxQTMediaBackend)
};
// helper to hijack background erasing for the QT window
class WXDLLIMPEXP_MEDIA wxQTMediaEvtHandler : public wxEvtHandler
{
public:
wxQTMediaEvtHandler(wxQTMediaBackend *qtb) { m_qtb = qtb; }
void OnEraseBackground(wxEraseEvent& event);
private:
wxQTMediaBackend *m_qtb;
DECLARE_NO_COPY_CLASS(wxQTMediaEvtHandler)
};
//===========================================================================
// IMPLEMENTATION
@ -2673,16 +2673,9 @@ bool wxAMMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent,
//by default with AM only 0.5
wxAMMediaBackend::SetVolume(1.0);
// My problem with this was only with a previous patch, probably the
// third rewrite fixed it as a side-effect. In fact, the erase
// background style of drawing not only works now, but is much better
// than paint-based updates (the paint event handler flickers if the
// wxMediaCtrl shares a sizer with another child window, or is on a
// notebook)
// - Greg Hazel
m_ctrl->Connect(m_ctrl->GetId(), wxEVT_ERASE_BACKGROUND,
wxEraseEventHandler(wxAMMediaEvtHandler::OnEraseBackground),
NULL, (wxEvtHandler*) this);
// don't erase the background of our control window so that resizing is a
// bit smoother
m_ctrl->SetBackgroundStyle(wxBG_STYLE_CUSTOM);
// success
return true;
@ -3151,16 +3144,6 @@ void wxAMMediaBackend::Move(int WXUNUSED(x), int WXUNUSED(y),
{
}
//---------------------------------------------------------------------------
// wxAMMediaEvtHandler::OnEraseBackground
//
// Tell WX not to erase the background of our control window
// so that resizing is a bit smoother
//---------------------------------------------------------------------------
void wxAMMediaEvtHandler::OnEraseBackground(wxEraseEvent& WXUNUSED(evt))
{
}
//---------------------------------------------------------------------------
// End of wxAMMediaBackend
//---------------------------------------------------------------------------
@ -3884,6 +3867,9 @@ wxQTMediaBackend::~wxQTMediaBackend()
// m_pMC = NULL;
}
// destroy wxQTMediaEvtHandler we pushed on it
m_ctrl->PopEventHandler(true);
m_lib.DestroyPortAssociation(
(CGrafPtr)m_lib.GetNativeWindowPort(m_ctrl->GetHWND()));
@ -3942,9 +3928,7 @@ bool wxQTMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent,
//Part of a suggestion from Greg Hazel to repaint
//movie when idle
m_ctrl->Connect(m_ctrl->GetId(), wxEVT_ERASE_BACKGROUND,
wxEraseEventHandler(wxQTMediaEvtHandler::OnEraseBackground),
NULL, (wxEvtHandler*) this);
m_ctrl->PushEventHandler(new wxQTMediaEvtHandler(this));
// done
return true;
@ -4546,27 +4530,28 @@ void wxQTMediaBackend::Move(int WXUNUSED(x), int WXUNUSED(y), int w, int h)
//---------------------------------------------------------------------------
void wxQTMediaEvtHandler::OnEraseBackground(wxEraseEvent& evt)
{
wxQTMediaBackend* qtb = (wxQTMediaBackend*)this;
wxQuickTimeLibrary* m_pLib = &(qtb->m_lib);
wxQuickTimeLibrary& m_pLib = m_qtb->m_lib;
if(qtb->m_pMC)
if ( m_qtb->m_pMC )
{
//repaint movie controller
m_pLib->MCDoAction(qtb->m_pMC, 2 /*mcActionDraw*/,
m_pLib->GetNativeWindowPort(qtb->m_ctrl->GetHWND())
m_pLib.MCDoAction(m_qtb->m_pMC, 2 /*mcActionDraw*/,
m_pLib.GetNativeWindowPort(m_qtb->m_ctrl->GetHWND())
);
}
else if(qtb->m_movie)
else if(m_qtb->m_movie)
{
CGrafPtr port = (CGrafPtr)m_pLib->GetNativeWindowPort
(qtb->m_ctrl->GetHWND());
CGrafPtr port = (CGrafPtr)m_pLib.GetNativeWindowPort
(m_qtb->m_ctrl->GetHWND());
m_pLib->BeginUpdate(port);
m_pLib->UpdateMovie(qtb->m_movie);
wxASSERT(m_pLib->GetMoviesError() == noErr);
m_pLib->EndUpdate(port);
m_pLib.BeginUpdate(port);
m_pLib.UpdateMovie(m_qtb->m_movie);
wxASSERT(m_pLib.GetMoviesError() == noErr);
m_pLib.EndUpdate(port);
}
// VZ: this doesn't make sense: why should we erase the background after
// taking the trouble to do whatever we did above? (FIXME)
evt.Skip(); //repaint with window background (TODO: maybe !m_movie?)
}