// raise top level parent to top of z order
if (!::SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE))
{
- wxLogLastError(_T("SetWindowPos"));
+ wxLogLastError(wxT("SetWindowPos"));
}
}
BEGIN_EVENT_TABLE(wxWindowMSW, wxWindowBase)
EVT_SYS_COLOUR_CHANGED(wxWindowMSW::OnSysColourChanged)
- EVT_ERASE_BACKGROUND(wxWindowMSW::OnEraseBackground)
#ifdef __WXWINCE__
EVT_INIT_DIALOG(wxWindowMSW::OnInitDialog)
#endif
//if (::IsWindow(GetHwnd()))
{
if ( !::DestroyWindow(GetHwnd()) )
+ {
wxLogLastError(wxT("DestroyWindow"));
+ }
}
// remove hWnd <-> wxWindow association
/* static */
const wxChar *wxWindowMSW::MSWGetRegisteredClassName()
{
- return wxApp::GetRegisteredClassName(_T("wxWindow"), COLOR_BTNFACE);
+ return wxApp::GetRegisteredClassName(wxT("wxWindow"), COLOR_BTNFACE);
}
// real construction (Init() must have been called before!)
void wxWindowMSW::SetFocus()
{
HWND hWnd = GetHwnd();
- wxCHECK_RET( hWnd, _T("can't set focus to invalid window") );
+ wxCHECK_RET( hWnd, wxT("can't set focus to invalid window") );
#if !defined(__WXWINCE__)
::SetLastError(0);
HWND hwndFocus = ::GetFocus();
if ( hwndFocus != hWnd )
{
- wxLogApiError(_T("SetFocus"), dwRes);
+ wxLogApiError(wxT("SetFocus"), dwRes);
}
}
}
static bool s_initDone = false;
if ( !s_initDone )
{
- wxDynamicLibrary dllUser32(_T("user32.dll"), wxDL_VERBATIM | wxDL_QUIET);
+ wxDynamicLibrary dllUser32(wxT("user32.dll"), wxDL_VERBATIM | wxDL_QUIET);
wxDL_INIT_FUNC(s_pfn, AnimateWindow, dllUser32);
s_initDone = true;
case wxSHOW_EFFECT_MAX:
- wxFAIL_MSG( _T("invalid window show effect") );
+ wxFAIL_MSG( wxT("invalid window show effect") );
return false;
default:
- wxFAIL_MSG( _T("unknown window show effect") );
+ wxFAIL_MSG( wxT("unknown window show effect") );
return false;
}
if ( !(*s_pfnAnimateWindow)(GetHwnd(), timeout, dwFlags) )
{
- wxLogLastError(_T("AnimateWindow"));
+ wxLogLastError(wxT("AnimateWindow"));
return false;
}
{
if ( !::ReleaseCapture() )
{
- wxLogLastError(_T("ReleaseCapture"));
+ wxLogLastError(wxT("ReleaseCapture"));
}
}
if ( !::SetCursorPos(x, y) )
{
- wxLogLastError(_T("SetCursorPos"));
+ wxLogLastError(wxT("SetCursorPos"));
}
}
int wxWindowMSW::GetScrollPos(int orient) const
{
HWND hWnd = GetHwnd();
- wxCHECK_MSG( hWnd, 0, _T("no HWND in GetScrollPos") );
+ wxCHECK_MSG( hWnd, 0, wxT("no HWND in GetScrollPos") );
return GetScrollPosition(hWnd, WXOrientToSB(orient));
}
{
// Most of the time this is not really an error, since the return
// value can also be zero when there is no scrollbar yet.
- // wxLogLastError(_T("GetScrollInfo"));
+ // wxLogLastError(wxT("GetScrollInfo"));
}
maxPos = scrollInfo.nMax;
void wxWindowMSW::SetScrollPos(int orient, int pos, bool refresh)
{
HWND hWnd = GetHwnd();
- wxCHECK_RET( hWnd, _T("SetScrollPos: no HWND") );
+ wxCHECK_RET( hWnd, wxT("SetScrollPos: no HWND") );
WinStruct<SCROLLINFO> info;
info.nPage = 0;
wxUnusedVar(dir);
#else
wxCHECK_RET( GetHwnd(),
- _T("layout direction must be set after window creation") );
+ wxT("layout direction must be set after window creation") );
LONG styleOld = wxGetWindowExStyle(this);
break;
default:
- wxFAIL_MSG(_T("unsupported layout direction"));
+ wxFAIL_MSG(wxT("unsupported layout direction"));
break;
}
#ifdef __WXWINCE__
return wxLayout_Default;
#else
- wxCHECK_MSG( GetHwnd(), wxLayout_Default, _T("invalid window") );
+ wxCHECK_MSG( GetHwnd(), wxLayout_Default, wxT("invalid window") );
return wxHasWindowExStyle(this, WS_EX_LAYOUTRTL) ? wxLayout_RightToLeft
: wxLayout_LeftToRight;
if ( m_hWnd )
{
if ( !::DestroyWindow(GetHwnd()) )
+ {
wxLogLastError(wxT("DestroyWindow"));
+ }
}
WXHWND wxhwnd = (WXHWND)handle;
// TODO: get rid of wxTLWHiddenParent special case (currently it's not
// registered by wxApp but using ad hoc code in msw/toplevel.cpp);
// there is also a hidden window class used by sockets &c
- return wxApp::IsRegisteredClassName(str) || str == _T("wxTLWHiddenParent");
+ return wxApp::IsRegisteredClassName(str) || str == wxT("wxTLWHiddenParent");
}
// ----------------------------------------------------------------------------
0, 0, 0, 0,
SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED) )
{
- wxLogLastError(_T("SetWindowPos"));
+ wxLogLastError(wxT("SetWindowPos"));
}
}
}
{
default:
case wxBORDER_DEFAULT:
- wxFAIL_MSG( _T("unknown border style") );
+ wxFAIL_MSG( wxT("unknown border style") );
// fall through
case wxBORDER_NONE:
{
if ( !::UpdateWindow(GetHwnd()) )
{
- wxLogLastError(_T("UpdateWindow"));
+ wxLogLastError(wxT("UpdateWindow"));
}
#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOACTIVATE);
if ( !hdwp )
{
- wxLogLastError(_T("DeferWindowPos"));
+ wxLogLastError(wxT("DeferWindowPos"));
}
}
{
if ( sizeFlags & wxSIZE_AUTO_WIDTH )
{
- size = DoGetBestSize();
+ size = GetBestSize();
width = size.x;
}
else
{
if ( size.x == wxDefaultCoord )
{
- size = DoGetBestSize();
+ size = GetBestSize();
}
- //else: already called DoGetBestSize() above
+ //else: already called GetBestSize() above
height = size.y;
}
height + heightWin - rectClient.bottom,
TRUE) )
{
- wxLogLastError(_T("MoveWindow"));
+ wxLogLastError(wxT("MoveWindow"));
}
}
}
+wxSize wxWindowMSW::DoGetBorderSize() const
+{
+ wxCoord border;
+ switch ( GetBorder() )
+ {
+ case wxBORDER_STATIC:
+ case wxBORDER_SIMPLE:
+ border = 1;
+ break;
+
+ case wxBORDER_SUNKEN:
+ border = 2;
+ break;
+
+ case wxBORDER_RAISED:
+ case wxBORDER_DOUBLE:
+ border = 3;
+ break;
+
+ default:
+ wxFAIL_MSG( wxT("unknown border style") );
+ // fall through
+
+ case wxBORDER_NONE:
+ border = 0;
+ }
+
+ return 2*wxSize(border, border);
+}
+
// ---------------------------------------------------------------------------
// text metrics
// ---------------------------------------------------------------------------
#endif
}
-void wxWindowMSW::GetTextExtent(const wxString& string,
- int *x, int *y,
- int *descent, int *externalLeading,
- const wxFont *fontToUse) const
+void wxWindowMSW::DoGetTextExtent(const wxString& string,
+ int *x, int *y,
+ int *descent,
+ int *externalLeading,
+ const wxFont *fontToUse) const
{
wxASSERT_MSG( !fontToUse || fontToUse->Ok(),
- _T("invalid font in GetTextExtent()") );
+ wxT("invalid font in GetTextExtent()") );
HFONT hfontToUse;
if ( fontToUse )
// trace all messages: useful for the debugging but noticeably slows down
// the code so don't do it by default
#if wxDEBUG_LEVEL >= 2
- wxLogTrace(wxTraceMessages,
+ wxLogTrace("winmsg",
wxT("Processing %s(hWnd=%p, wParam=%08lx, lParam=%08lx)"),
wxGetMessageName(message), hWnd, (long)wParam, lParam);
#endif // wxDEBUG_LEVEL >= 2
// this should never happen
wxCHECK_MSG( win, 0,
- _T("FindWindowForMouseEvent() returned NULL") );
+ wxT("FindWindowForMouseEvent() returned NULL") );
}
#ifdef __POCKETPC__
if (IsContextMenuEnabled() && message == WM_LBUTTONDOWN)
case VK_SUBTRACT:
case VK_MULTIPLY:
case VK_DIVIDE:
+ case VK_DECIMAL:
case VK_NUMPAD0:
case VK_NUMPAD1:
case VK_NUMPAD2:
// now alter the client size making room for drawing a
// themed border
RECT *rect;
+ NCCALCSIZE_PARAMS *csparam = NULL;
if ( wParam )
{
- NCCALCSIZE_PARAMS *csparam = (NCCALCSIZE_PARAMS *)lParam;
+ csparam = (NCCALCSIZE_PARAMS *)lParam;
rect = &csparam->rgrc[0];
}
else
&rcClient) == S_OK )
{
InflateRect(&rcClient, -1, -1);
- *rect = rcClient;
- rc.result = WVR_REDRAW;
+ if (wParam)
+ csparam->rgrc[0] = rcClient;
+ else
+ *((RECT*)lParam) = rcClient;
+
+ // WVR_REDRAW triggers a bug whereby child windows are moved up and left,
+ // so don't use.
+ // rc.result = WVR_REDRAW;
}
}
}
if ( !processed )
{
#if wxDEBUG_LEVEL >= 2
- wxLogTrace(wxTraceMessages, wxT("Forwarding %s to DefWindowProc."),
+ wxLogTrace("winmsg", wxT("Forwarding %s to DefWindowProc."),
wxGetMessageName(message));
#endif // wxDEBUG_LEVEL >= 2
rc.result = MSWDefWindowProc(message, wParam, lParam);
if ( !len )
{
- wxLogLastError(_T("MultiByteToWideChar()"));
+ wxLogLastError(wxT("MultiByteToWideChar()"));
}
buf[len] = L'\0';
break;
default:
- wxLogDebug(_T("Unknown WM_POWERBROADCAST(%d) event"), wParam);
+ wxLogDebug(wxT("Unknown WM_POWERBROADCAST(%d) event"), wParam);
// fall through
// these messages are currently not mapped to wx events
return false;
wxCHECK_MSG( wxDynamicCast(pMenuItem, wxMenuItem),
- false, _T("MSWOnDrawItem: bad wxMenuItem pointer") );
+ false, wxT("MSWOnDrawItem: bad wxMenuItem pointer") );
// prepare to call OnDrawItem(): notice using of wxDCTemp to prevent
// the DC from being released
return false;
wxCHECK_MSG( wxDynamicCast(pMenuItem, wxMenuItem),
- false, _T("MSWOnMeasureItem: bad wxMenuItem pointer") );
+ false, wxT("MSWOnMeasureItem: bad wxMenuItem pointer") );
size_t w, h;
bool rc = pMenuItem->OnMeasureItem(&w, &h);
// reference bitmap which can tell us what the RGB values change
// to.
wxLogNull logNo; // suppress error if we couldn't load the bitmap
- wxBitmap stdColourBitmap(_T("wxBITMAP_STD_COLOURS"));
+ wxBitmap stdColourBitmap(wxT("wxBITMAP_STD_COLOURS"));
if ( stdColourBitmap.Ok() )
{
// the pixels in the bitmap must correspond to wxSTD_COL_XXX!
wxASSERT_MSG( stdColourBitmap.GetWidth() == wxSTD_COL_MAX,
- _T("forgot to update wxBITMAP_STD_COLOURS!") );
+ wxT("forgot to update wxBITMAP_STD_COLOURS!") );
wxMemoryDC memDC;
memDC.SelectObject(stdColourBitmap);
{
HRGN hRegion = ::CreateRectRgn(0, 0, 0, 0); // Dummy call to get a handle
if ( !hRegion )
+ {
wxLogLastError(wxT("CreateRectRgn"));
+ }
if ( ::GetUpdateRgn(GetHwnd(), hRegion, FALSE) == ERROR )
+ {
wxLogLastError(wxT("GetUpdateRgn"));
+ }
m_updateRegion = wxRegion((WXHRGN) hRegion);
}
bool wxWindowMSW::HandleEraseBkgnd(WXHDC hdc)
-{
- wxDCTemp dc(hdc, GetClientSize());
- wxDCTempImpl *impl = (wxDCTempImpl*) dc.GetImpl();
-
- impl->SetHDC(hdc);
- impl->SetWindow((wxWindow *)this);
-
- wxEraseEvent event(m_windowId, &dc);
- event.SetEventObject(this);
- bool rc = HandleWindowEvent(event);
-
- // must be called manually as ~wxDC doesn't do anything for wxDCTemp
- impl->SelectOldObjects(hdc);
-
- return rc;
-}
-
-void wxWindowMSW::OnEraseBackground(wxEraseEvent& event)
{
// standard non top level controls (i.e. except the dialogs) always erase
// their background themselves in HandleCtlColor() or have some control-
// specific ways to set the colours (common controls)
if ( IsOfStandardClass() && !IsTopLevel() )
- {
- event.Skip();
- return;
- }
+ return false;
- if ( GetBackgroundStyle() == wxBG_STYLE_CUSTOM )
+ switch ( GetBackgroundStyle() )
{
- // don't skip the event here, custom background means that the app
- // is drawing it itself in its OnPaint(), so don't draw it at all
- // now to avoid flicker
- return;
- }
+ case wxBG_STYLE_ERASE:
+ case wxBG_STYLE_COLOUR:
+ // we need to generate an erase background event
+ {
+ wxDCTemp dc(hdc, GetClientSize());
+ wxDCTempImpl *impl = (wxDCTempImpl*) dc.GetImpl();
- wxDC *dc = event.GetDC();
- if (!dc) return;
- wxMSWDCImpl *impl = (wxMSWDCImpl*) dc->GetImpl();
+ impl->SetHDC(hdc);
+ impl->SetWindow((wxWindow *)this);
- // do default background painting
- if ( !DoEraseBackground(GetHdcOf(*impl)) )
- {
- // let the system paint the background
- event.Skip();
+ wxEraseEvent event(m_windowId, &dc);
+ event.SetEventObject(this);
+ bool rc = HandleWindowEvent(event);
+
+ // must be called manually as ~wxDC doesn't do anything for
+ // wxDCTemp
+ impl->SelectOldObjects(hdc);
+
+ if ( rc )
+ {
+ // background erase by the user-defined handler
+ return true;
+ }
+ }
+ // fall through
+
+ case wxBG_STYLE_SYSTEM:
+ if ( !DoEraseBackground(hdc) )
+ {
+ // let the default processing to take place if we didn't erase
+ // the background ourselves
+ return false;
+ }
+ break;
+
+ case wxBG_STYLE_PAINT:
+ case wxBG_STYLE_TRANSPARENT:
+ // no need to do anything here at all, background will be entirely
+ // redrawn in WM_PAINT handler
+ break;
+
+ default:
+ wxFAIL_MSG( "unknown background style" );
}
+
+ return true;
}
bool wxWindowMSW::DoEraseBackground(WXHDC hDC)
m_hDWP = (WXHANDLE)::BeginDeferWindowPos(numChildren);
if ( !m_hDWP )
{
- wxLogLastError(_T("BeginDeferWindowPos"));
+ wxLogLastError(wxT("BeginDeferWindowPos"));
}
if (m_hDWP)
useDefer = true;
switch ( wParam )
{
default:
- wxFAIL_MSG( _T("unexpected WM_SIZE parameter") );
+ wxFAIL_MSG( wxT("unexpected WM_SIZE parameter") );
// fall through nevertheless
case SIZE_MAXHIDE:
// do put all child controls in place at once
if ( !::EndDeferWindowPos(hDWP) )
{
- wxLogLastError(_T("EndDeferWindowPos"));
+ wxLogLastError(wxT("EndDeferWindowPos"));
}
// Reset our children's pending pos/size values.
// still don't get move, enter nor leave events.
static wxWindowMSW *FindWindowForMouseEvent(wxWindowMSW *win, int *x, int *y)
{
- wxCHECK_MSG( x && y, win, _T("NULL pointer in FindWindowForMouseEvent") );
+ wxCHECK_MSG( x && y, win, wxT("NULL pointer in FindWindowForMouseEvent") );
// first try to find a non transparent child: this allows us to send events
// to a static text which is inside a static box, for example
{
// see comment in wxApp::GetComCtl32Version() explaining the
// use of wxLoadedDLL
- wxLoadedDLL dllComCtl32(_T("comctl32.dll"));
+ wxLoadedDLL dllComCtl32(wxT("comctl32.dll"));
if ( dllComCtl32.IsLoaded() )
{
s_pfn_TrackMouseEvent = (_TrackMouseEvent_t)
- dllComCtl32.RawGetSymbol(_T("_TrackMouseEvent"));
+ dllComCtl32.RawGetSymbol(wxT("_TrackMouseEvent"));
}
s_initDone = true;
&s_linesPerRotation, 0))
{
// this is not supposed to happen
- wxLogLastError(_T("SystemParametersInfo(GETWHEELSCROLLLINES)"));
+ wxLogLastError(wxT("SystemParametersInfo(GETWHEELSCROLLLINES)"));
// the default is 3, so use it if SystemParametersInfo() failed
s_linesPerRotation = 3;
if ( !::GetCursorPos(&pt) )
#endif
{
- wxLogLastError(_T("GetCursorPos"));
+ wxLogLastError(wxT("GetCursorPos"));
}
// we need to have client coordinates here for symmetry with
// menu creation code
wxMenuItem *item = (wxMenuItem*)mii.dwItemData;
- const wxChar *p = wxStrchr(item->GetItemLabel().wx_str(), _T('&'));
+ const wxChar *p = wxStrchr(item->GetItemLabel().wx_str(), wxT('&'));
while ( p++ )
{
- if ( *p == _T('&') )
+ if ( *p == wxT('&') )
{
// this is not the accel char, find the real one
- p = wxStrchr(p + 1, _T('&'));
+ p = wxStrchr(p + 1, wxT('&'));
}
else // got the accel char
{
else // failed to get the menu text?
{
// it's not fatal, so don't show error, but still log it
- wxLogLastError(_T("GetMenuItemInfo"));
+ wxLogLastError(wxT("GetMenuItemInfo"));
}
}
#endif
&scrollInfo) )
{
// Not necessarily an error, if there are no scrollbars yet.
- // wxLogLastError(_T("GetScrollInfo"));
+ // wxLogLastError(wxT("GetScrollInfo"));
}
event.SetPosition(scrollInfo.nTrackPos);
wxWindowMSW::MSWRegisterMessageHandler(int msg, MSWMessageHandler handler)
{
wxCHECK_MSG( gs_messageHandlers.find(msg) == gs_messageHandlers.end(),
- false, _T("registering handler for the same message twice") );
+ false, wxT("registering handler for the same message twice") );
gs_messageHandlers[msg] = handler;
return true;
{
const MSWMessageHandlers::iterator i = gs_messageHandlers.find(msg);
wxCHECK_RET( i != gs_messageHandlers.end() && i->second == handler,
- _T("unregistering non-registered handler?") );
+ wxT("unregistering non-registered handler?") );
gs_messageHandlers.erase(i);
}
);
if ( !wxTheKeyboardHook )
{
- wxLogLastError(_T("SetWindowsHookEx(wxKeyboardHook)"));
+ wxLogLastError(wxT("SetWindowsHookEx(wxKeyboardHook)"));
}
}
else // uninstall
typedef BOOL (WINAPI *UnregisterFunc1Proc)(UINT, UINT);
UnregisterFunc1Proc procUnregisterFunc;
- hCoreDll = LoadLibrary(_T("coredll.dll"));
+ hCoreDll = LoadLibrary(wxT("coredll.dll"));
if (hCoreDll)
{
- procUnregisterFunc = (UnregisterFunc1Proc)GetProcAddress(hCoreDll, _T("UnregisterFunc1"));
+ procUnregisterFunc = (UnregisterFunc1Proc)GetProcAddress(hCoreDll, wxT("UnregisterFunc1"));
if (procUnregisterFunc)
procUnregisterFunc(modifiers, id);
FreeLibrary(hCoreDll);
if ( !::RegisterHotKey(GetHwnd(), hotkeyId, win_modifiers, keycode) )
{
- wxLogLastError(_T("RegisterHotKey"));
+ wxLogLastError(wxT("RegisterHotKey"));
return false;
}
if ( !::UnregisterHotKey(GetHwnd(), hotkeyId) )
{
- wxLogLastError(_T("UnregisterHotKey"));
+ wxLogLastError(wxT("UnregisterHotKey"));
return false;
}
if ( !ms_hMsgHookProc )
{
- wxLogLastError(_T("SetWindowsHookEx(WH_GETMESSAGE)"));
+ wxLogLastError(wxT("SetWindowsHookEx(WH_GETMESSAGE)"));
return false;
}