m_lastKeydownProcessed = false;
m_childrenDisabled = NULL;
+ m_frozenness = 0;
// wxWnd
m_hMenu = 0;
void wxWindowMSW::Freeze()
{
- SendSetRedraw(GetHwnd(), false);
+ if ( !m_frozenness++ )
+ {
+ SendSetRedraw(GetHwnd(), false);
+ }
}
void wxWindowMSW::Thaw()
{
- SendSetRedraw(GetHwnd(), true);
+ wxASSERT_MSG( m_frozenness > 0, _T("Thaw() without matching Freeze()") );
- // we need to refresh everything or otherwise he invalidated area is not
- // repainted
- Refresh();
+ if ( !--m_frozenness )
+ {
+ SendSetRedraw(GetHwnd(), true);
+
+ // we need to refresh everything or otherwise he invalidated area is not
+ // repainted
+ Refresh();
+ }
}
void wxWindowMSW::Refresh(bool eraseBack, const wxRect *rect)
// pre/post message processing
// ===========================================================================
-long wxWindowMSW::MSWDefWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
+WXLRESULT wxWindowMSW::MSWDefWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
{
if ( m_oldWndProc )
return ::CallWindowProc(CASTWNDPROC m_oldWndProc, GetHwnd(), (UINT) nMsg, (WPARAM) wParam, (LPARAM) lParam);
return rc;
}
-long wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
+WXLRESULT wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
{
// did we process the message?
bool processed = false;
union
{
bool allow;
- long result;
+ WXLRESULT result;
WXHICON hIcon;
WXHBRUSH hBrush;
} rc;
// we could have got an event from our child, reflect it back
// to it if this is the case
wxWindowMSW *win = NULL;
- if ( wParam != m_hWnd )
+ if ( (WXHWND)wParam != m_hWnd )
{
win = FindItemByHWND((WXHWND)wParam);
}
// we need to handle it as well, otherwise no tooltips will be shown in
// this case
#ifndef __WXWINCE__
- if ( !(code == (WXUINT) TTN_NEEDTEXTA || code == (WXUINT) TTN_NEEDTEXTW) || ttip.empty() )
+ if ( !(code == (WXUINT) TTN_NEEDTEXTA || code == (WXUINT) TTN_NEEDTEXTW)
+ || ttip.empty() )
{
// not a tooltip message or no tooltip to show anyhow
return false;
LPTOOLTIPTEXT ttText = (LPTOOLTIPTEXT)lParam;
+ // We don't want to use the szText buffer because it has a limit of 80
+ // bytes and this is not enough, especially for Unicode build where it
+ // limits the tooltip string length to only 40 characters
+ //
+ // The best would be, of course, to not impose any length limitations at
+ // all but then the buffer would have to be dynamic and someone would have
+ // to free it and we don't have the tooltip owner object here any more, so
+ // for now use our own static buffer with a higher fixed max length.
+ //
+ // Note that using a static buffer should not be a problem as only a single
+ // tooltip can be shown at the same time anyhow.
#if !wxUSE_UNICODE
- if ( code == (WXUINT) TTN_NEEDTEXTA )
+ if ( code == (WXUINT) TTN_NEEDTEXTW )
{
- // we pass just the pointer as we store the string internally anyhow
- ttText->lpszText = (char *)ttip.c_str();
- }
- else // TTN_NEEDTEXTW
-#endif // !Unicode
- {
-#if wxUSE_UNICODE
- // in Unicode mode this is just what we need
- ttText->lpszText = (wxChar *)ttip.c_str();
-#else // !Unicode
- // Convert tooltip from multi byte to Unicode.
-
- // We don't want to use the szText buffer because it has a limit of 80
- // bytes, for now use our own static buffer with a higher fixed max
- // length.
- // Preferably a dynamic buffer should be used, but who frees the buffer?
+ // We need to convert tooltip from multi byte to Unicode on the fly.
+ static wchar_t buf[513];
- static const int MAX_LENGTH = 512;
- static wchar_t buf[MAX_LENGTH+1];
-
- ttText->lpszText = (LPSTR) buf;
-
- // Truncate tooltip length if needed
- size_t tipLength = wxMin(ttip.Len(), MAX_LENGTH);
+ // Truncate tooltip length if needed as otherwise we might not have
+ // enough space for it in the buffer and MultiByteToWideChar() would
+ // return an error
+ size_t tipLength = wxMin(ttip.Len(), WXSIZEOF(buf) - 1);
// Convert to WideChar without adding the NULL character. The NULL
// character is added afterwards (this is more efficient).
- ::MultiByteToWideChar(CP_ACP, 0, ttip, tipLength, buf, MAX_LENGTH);
-
- buf[tipLength] = '\0';
+ int len = ::MultiByteToWideChar
+ (
+ CP_ACP,
+ 0, // no flags
+ ttip,
+ tipLength,
+ buf,
+ WXSIZEOF(buf) - 1
+ );
+
+ if ( !len )
+ {
+ wxLogLastError(_T("MultiByteToWideChar()"));
+ }
-#endif // Unicode/!Unicode
+ buf[len] = L'\0';
+ ttText->lpszText = (LPSTR) buf;
+ }
+ else // TTN_NEEDTEXTA
+#endif // !wxUSE_UNICODE
+ {
+ // we get here if we got TTN_NEEDTEXTA (only happens in ANSI build) or
+ // if we got TTN_NEEDTEXTW in Unicode build: in this case we just have
+ // to copy the string we have into the buffer
+ static wxChar buf[513];
+ wxStrncpy(buf, ttip.c_str(), WXSIZEOF(buf) - 1);
+ buf[WXSIZEOF(buf) - 1] = _T('\0');
+ ttText->lpszText = buf;
}
return true;