#include "wx/msw/private.h"
#include "wx/msw/private/keyboard.h"
#include "wx/msw/dcclient.h"
+#include "wx/private/textmeasure.h"
#if wxUSE_TOOLTIPS
#include "wx/tooltip.h"
wxShowEffect effect,
unsigned timeout)
{
+#if wxUSE_DYNLIB_CLASS
if ( effect == wxSHOW_EFFECT_NONE )
return Show(show);
}
return true;
+#else // wxUSE_DYNLIB_CLASS
+ return Show(show);
+#endif
}
// Raise the window to the top of the Z order
// it doesn't seem useful to use WS_CLIPSIBLINGS here as we officially
// don't support overlapping windows and it only makes sense for them and,
// presumably, gives the system some extra work (to manage more clipping
- // regions), so avoid it alltogether
+ // regions), so avoid it altogether
if ( flags & wxVSCROLL )
int *externalLeading,
const wxFont *fontToUse) const
{
- wxASSERT_MSG( !fontToUse || fontToUse->IsOk(),
- wxT("invalid font in GetTextExtent()") );
-
- HFONT hfontToUse;
- if ( fontToUse )
- hfontToUse = GetHfontOf(*fontToUse);
+ // ensure we work with a valid font
+ wxFont font;
+ if ( !fontToUse || !fontToUse->IsOk() )
+ font = GetFont();
else
- hfontToUse = GetHfontOf(GetFont());
+ font = *fontToUse;
- WindowHDC hdc(GetHwnd());
- SelectInHDC selectFont(hdc, hfontToUse);
+ wxCHECK_RET( font.IsOk(), wxT("invalid font in GetTextExtent()") );
- SIZE sizeRect;
- TEXTMETRIC tm;
- ::GetTextExtentPoint32(hdc, string.t_str(), string.length(), &sizeRect);
- GetTextMetrics(hdc, &tm);
-
- if ( x )
- *x = sizeRect.cx;
- if ( y )
- *y = sizeRect.cy;
- if ( descent )
- *descent = tm.tmDescent;
- if ( externalLeading )
- *externalLeading = tm.tmExternalLeading;
+ const wxWindow* win = static_cast<const wxWindow*>(this);
+ wxTextMeasure txm(win, &font);
+ txm.GetTextExtent(string, x, y, descent, externalLeading);
}
// ---------------------------------------------------------------------------
#if !defined(__WXWINCE__)
case WM_CONTEXTMENU:
{
+ // As with WM_HELP above, this message is propagated upwards
+ // the parent chain by DefWindowProc() itself, so we should
+ // always mark it as processed to prevent it from doing this
+ // as this would result in duplicate calls to event handlers.
+ processed = true;
+
// we don't convert from screen to client coordinates as
// the event may be handled by a parent window
wxPoint pt(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
win = this;
evtCtx.SetEventObject(win);
- processed = win->HandleWindowEvent(evtCtx);
+ win->HandleWindowEvent(evtCtx);
}
break;
#endif
// be called from inside the event handlers called above)
m_updateRegion.Clear();
+ wxPaintDCImpl::EndPaint((wxWindow *)this);
+
return processed;
}
::MapWindowPoints(NULL, GetHwnd(), (POINT *)&rc, 1);
- if ( !::SetBrushOrgEx((HDC)hDC, -rc.left, -rc.top, NULL) )
+ int x = rc.left,
+ y = rc.top;
+ MSWAdjustBrushOrg(&x, &y);
+
+ if ( !::SetBrushOrgEx((HDC)hDC, -x, -y, NULL) )
{
wxLogLastError(wxT("SetBrushOrgEx(bg brush)"));
}
// the messages sent from the in-place edit control used by the treectrl
// for label editing have id == 0, but they should _not_ be treated as menu
// messages (they are EN_XXX ones, in fact) so don't translate anything
- // coming from a control to wxEVT_COMMAND_MENU_SELECTED
+ // coming from a control to wxEVT_MENU
if ( !control )
{
- wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, id);
+ wxCommandEvent event(wxEVT_MENU, id);
event.SetEventObject(this);
event.SetInt(id);
};
#ifdef wxHAS_XBUTTON
- // the same messages are used for both auxillary mouse buttons so we need
+ // the same messages are used for both auxiliary mouse buttons so we need
// to adjust the index manually
switch ( msg )
{
#ifndef __WXWINCE__
event.SetTimestamp(::GetMessageTime());
#endif
-
- // Event coordinates must be in window client coordinates system which
- // doesn't make sense if there is no window.
- //
- // We could use screen coordinates for such events but this would make the
- // logic of the event handlers more complicated: you'd need to test for the
- // event object and interpret the coordinates differently according to
- // whether it's NULL or not so unless somebody really asks for this let's
- // just avoid the issue.
- if ( win )
- {
- const wxPoint mousePos = win->ScreenToClient(wxGetMousePosition());
- event.m_x = mousePos.x;
- event.m_y = mousePos.y;
- }
}
} // anonymous namespace
bool wxWindowMSW::HandleClipboardEvent(WXUINT nMsg)
{
- const wxEventType type = nMsg == WM_CUT ? wxEVT_COMMAND_TEXT_CUT
- : nMsg == WM_COPY ? wxEVT_COMMAND_TEXT_COPY
- : /* nMsg == WM_PASTE */ wxEVT_COMMAND_TEXT_PASTE;
+ const wxEventType type = nMsg == WM_CUT ? wxEVT_TEXT_CUT
+ : nMsg == WM_COPY ? wxEVT_TEXT_COPY
+ : /* nMsg == WM_PASTE */ wxEVT_TEXT_PASTE;
wxClipboardTextEvent evt(type, GetId());
evt.SetEventObject(this);
case VK_DELETE:
wxk = ChooseNormalOrExtended(lParam, WXK_NUMPAD_DELETE, WXK_DELETE);
+
+ if ( uc )
+ *uc = WXK_DELETE;
break;
case VK_RETURN:
DWORD hiWord = HIWORD(lParam);
if ( nCode != HC_NOREMOVE && ((hiWord & KF_UP) == 0) )
{
- wchar_t uc;
+ wchar_t uc = 0;
int id = wxMSWKeyboard::VKToWX(wParam, lParam, &uc);
// Don't intercept keyboard entry (notably Escape) if a modal window
{
// WindowFromPoint() ignores the disabled children but we're supposed
// to take them into account, so check if we have a child at this
- // coordinate.
- ::ScreenToClient(hWnd, &pt2);
- hWnd = ::ChildWindowFromPointEx(hWnd, pt2, CWP_SKIPINVISIBLE);
+ // coordinate using ChildWindowFromPointEx().
+ for ( ;; )
+ {
+ pt2.x = pt.x;
+ pt2.y = pt.y;
+ ::ScreenToClient(hWnd, &pt2);
+ HWND child = ::ChildWindowFromPointEx(hWnd, pt2, CWP_SKIPINVISIBLE);
+ if ( child == hWnd || !child )
+ break;
+
+ // ChildWindowFromPointEx() only examines the immediate children
+ // but we want to get the deepest (top in Z-order) one, so continue
+ // iterating for as long as it finds anything.
+ hWnd = child;
+ }
}
return wxGetWindowFromHWND((WXHWND)hWnd);
return true;
}
-#if wxUSE_ACCEL
-
bool wxWindowMSW::HandleHotKey(WXWPARAM wParam, WXLPARAM lParam)
{
int win_modifiers = LOWORD(lParam);
return HandleWindowEvent(event);
}
-#endif // wxUSE_ACCEL
-
#endif // wxUSE_HOTKEY
// Not tested under WinCE