::ShowWindow(hWnd, show ? SW_SHOW : SW_HIDE);
}
+ if ( IsFrozen() )
+ {
+ // DoFreeze/DoThaw don't do anything if the window is not shown, so
+ // we have to call them from here now
+ if ( show )
+ DoFreeze();
+ else
+ DoThaw();
+ }
+
return true;
}
bool
wxWindowMSW::MSWShowWithEffect(bool show,
wxShowEffect effect,
- unsigned timeout,
- wxDirection dir)
+ unsigned timeout)
{
if ( !wxWindowBase::Show(show) )
return false;
timeout = 200; // this is the default animation timeout, per MSDN
DWORD dwFlags = show ? 0 : AW_HIDE;
- bool needsDir = false;
+
switch ( effect )
{
- case wxSHOW_EFFECT_ROLL:
- needsDir = true;
+ case wxSHOW_EFFECT_ROLL_TO_LEFT:
+ dwFlags |= AW_HOR_NEGATIVE;
+ break;
+
+ case wxSHOW_EFFECT_ROLL_TO_RIGHT:
+ dwFlags |= AW_HOR_POSITIVE;
+ break;
+
+ case wxSHOW_EFFECT_ROLL_TO_TOP:
+ dwFlags |= AW_VER_NEGATIVE;
+ break;
+
+ case wxSHOW_EFFECT_ROLL_TO_BOTTOM:
+ dwFlags |= AW_VER_POSITIVE;
+ break;
+
+ case wxSHOW_EFFECT_SLIDE_TO_LEFT:
+ dwFlags |= AW_SLIDE | AW_HOR_NEGATIVE;
break;
- case wxSHOW_EFFECT_SLIDE:
- needsDir = true;
- dwFlags |= AW_SLIDE;
+ case wxSHOW_EFFECT_SLIDE_TO_RIGHT:
+ dwFlags |= AW_SLIDE | AW_HOR_POSITIVE;
+ break;
+
+ case wxSHOW_EFFECT_SLIDE_TO_TOP:
+ dwFlags |= AW_SLIDE | AW_VER_NEGATIVE;
+ break;
+
+ case wxSHOW_EFFECT_SLIDE_TO_BOTTOM:
+ dwFlags |= AW_SLIDE | AW_VER_POSITIVE;
break;
case wxSHOW_EFFECT_BLEND:
return false;
}
- if ( needsDir )
- {
- switch ( dir )
- {
- case wxTOP:
- dwFlags |= AW_VER_NEGATIVE;
- break;
-
- case wxBOTTOM:
- dwFlags |= AW_VER_POSITIVE;
- break;
-
- case wxLEFT:
- dwFlags |= AW_HOR_NEGATIVE;
- break;
-
- case wxRIGHT:
- dwFlags |= AW_HOR_POSITIVE;
- break;
-
- default:
- wxFAIL_MSG( _T("unknown window effect direction") );
- return false;
- }
- }
- else // animation effect which doesn't need the direction
- {
- wxASSERT_MSG( dir == wxBOTTOM,
- _T("non-default direction used unnecessarily") );
- }
-
-
if ( !(*s_pfnAnimateWindow)(GetHwnd(), timeout, dwFlags) )
{
wxLogLastError(_T("AnimateWindow"));
void wxWindowMSW::DoFreeze()
{
- if ( IsShown() )
- SendSetRedraw(GetHwnd(), false);
+ if ( !IsShown() )
+ return; // no point in freezing hidden window
+
+ SendSetRedraw(GetHwnd(), false);
}
void wxWindowMSW::DoThaw()
{
- if ( IsShown() )
- {
- SendSetRedraw(GetHwnd(), true);
+ if ( !IsShown() )
+ return; // hidden windows aren't frozen by DoFreeze
- // we need to refresh everything or otherwise the invalidated area
- // is not going to be repainted
- Refresh();
- }
+ SendSetRedraw(GetHwnd(), true);
+
+ // we need to refresh everything or otherwise the invalidated area
+ // is not going to be repainted
+ Refresh();
}
void wxWindowMSW::Refresh(bool eraseBack, const wxRect *rect)
WXDWORD style,
WXDWORD extendedStyle)
{
+ // check a common bug in the user code: if the window is created with a
+ // non-default ctor and Create() is called too, we'd create 2 HWND for a
+ // single wxWindow object and this results in all sorts of trouble,
+ // especially for wxTLWs
+ wxCHECK_MSG( !m_hWnd, true, "window can't be recreated" );
+
// choose the position/size for the new window
int x, y, w, h;
(void)MSWGetCreateWindowCoords(pos, size, x, y, w, h);
wxCloseEvent event(wxEVT_END_SESSION, wxID_ANY);
event.SetEventObject(wxTheApp);
event.SetCanVeto(false);
- event.SetLoggingOff( (logOff == (long)ENDSESSION_LOGOFF) );
+ event.SetLoggingOff((logOff & ENDSESSION_LOGOFF) != 0);
return wxTheApp->ProcessEvent(event);
#else
bool wxWindowMSW::IsDoubleBuffered() const
{
- for ( const wxWindowMSW *wnd = this;
- wnd && !wnd->IsTopLevel(); wnd =
- wnd->GetParent() )
- {
- if ( ::GetWindowLong(GetHwndOf(wnd), GWL_EXSTYLE) & WS_EX_COMPOSITED )
+ const wxWindowMSW *wnd = this;
+ do {
+ long style = ::GetWindowLong(GetHwndOf(wnd), GWL_EXSTYLE);
+ if ( (style & WS_EX_COMPOSITED) != 0 )
return true;
- }
-
+ wnd = wnd->GetParent();
+ } while ( wnd && !wnd->IsTopLevel() );
+
return false;
}
+void wxWindowMSW::SetDoubleBuffered(bool on)
+{
+ // Get the current extended style bits
+ long exstyle = ::GetWindowLong(GetHwnd(), GWL_EXSTYLE);
+
+ // Twiddle the bit as needed
+ if ( on )
+ exstyle |= WS_EX_COMPOSITED;
+ else
+ exstyle &= ~WS_EX_COMPOSITED;
+
+ // put it back
+ ::SetWindowLong(GetHwnd(), GWL_EXSTYLE, exstyle);
+}
+
// ---------------------------------------------------------------------------
// owner drawn stuff
// ---------------------------------------------------------------------------